[Boost-bugs] [Boost C++ Libraries] #9180: Valgrind reports usage of uninitialised values

Subject: [Boost-bugs] [Boost C++ Libraries] #9180: Valgrind reports usage of uninitialised values
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2013-09-30 08:46:53


#9180: Valgrind reports usage of uninitialised values
-------------------------------------------------+-----------------------
 Reporter: Alexandre Hamez <alexandre.hamez@…> | Owner: olli
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: coroutine
  Version: Boost 1.54.0 | Severity: Problem
 Keywords: |
-------------------------------------------------+-----------------------
 When running the following example with Valgrind:

 {{{
 #include <iostream>
 #include <boost/coroutine/coroutine.hpp>

 typedef boost::coroutines::coroutine<int()> generator;

 void bar(generator::caller_type& yield) {
     yield(32);
 }

 void foo(generator::caller_type& yield) {
   generator nested_gen(bar);
   std::cout << nested_gen.get() << std::endl;
   yield(33);
 }

 int main() {
   generator gen(foo);
   std::cout << gen.get() << std::endl;
   return 0;
 };
 }}}

 I get the following trace (this is an extract, I give only the first
 error):


 {{{
 $ valgrind --max-stackframe=6516920 --track-origins=yes ./a.out
 }}}


 {{{
 ==10734== Memcheck, a memory error detector
 ==10734== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
 ==10734== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright
 info
 ==10734== Command: ./a.out
 ==10734==
 ==10734== Warning: client switching stacks? SP change: 0x7ff0001b8 -->
 0x512af98
 ==10734== to suppress, use: --max-stackframe=34257850912 or
 greater
 ==10734== Warning: client switching stacks? SP change: 0x512aca8 -->
 0x5761f98
 ==10734== to suppress, use: --max-stackframe=6517488 or greater
 ==10734== Use of uninitialised value of size 8
 ==10734== at 0x4C0E727: jump_fcontext (in
 /home/ahamez/usr/boost1.54/lib/libboost_context.so.1.54.0)
 ==10734== by 0x40C6E9: boost::coroutines::detail::coroutine_object<int
 (), void (*)(boost::coroutines::coroutine<void (int), 1>&),
 boost::coroutines::detail::standard_stack_allocator,
 std::allocator<boost::coroutines::coroutine<int (), 0> >,
 boost::coroutines::coroutine<void (int), 1>, int,
 0>::coroutine_object(void (*)(boost::coroutines::coroutine<void (int),
 1>&), boost::coroutines::attributes const&,
 boost::coroutines::detail::standard_stack_allocator const&,
 std::allocator<boost::coroutines::detail::coroutine_object<int (), void
 (*)(boost::coroutines::coroutine<void (int), 1>&),
 boost::coroutines::detail::standard_stack_allocator,
 std::allocator<boost::coroutines::coroutine<int (), 0> >,
 boost::coroutines::coroutine<void (int), 1>, int, 0> > const&) (in
 /home/ahamez/a.out)
 ==10734== by 0x407F29: boost::coroutines::coroutine<int (),
 0>::coroutine<void (*)(boost::coroutines::coroutine<void (int), 1>&)>(void
 (*)(boost::coroutines::coroutine<void (int), 1>&),
 boost::coroutines::attributes const&,
 boost::coroutines::detail::standard_stack_allocator const&,
 std::allocator<boost::coroutines::coroutine<int (), 0> > const&,
 boost::disable_if<boost::is_convertible<void
 (*&)(boost::coroutines::coroutine<void (int), 1>&), boost::rv<void
 (*)(boost::coroutines::coroutine<void (int), 1>&)>&>,
 boost::coroutines::coroutine<int (), 0>::dummy*>::type) (in
 /home/ahamez/a.out)
 ==10734== by 0x403DB9: foo(boost::coroutines::coroutine<void (int),
 1>&) (in /home/ahamez/a.out)
 ==10734== by 0x410A1C: boost::coroutines::detail::coroutine_object<int
 (), void (*)(boost::coroutines::coroutine<void (int), 1>&),
 boost::coroutines::detail::standard_stack_allocator,
 std::allocator<boost::coroutines::coroutine<int (), 0> >,
 boost::coroutines::coroutine<void (int), 1>, int, 0>::run() (in
 /home/ahamez/a.out)
 ==10734== by 0x40EAC6: void
 boost::coroutines::detail::trampoline1<boost::coroutines::detail::coroutine_object<int
 (), void (*)(boost::coroutines::coroutine<void (int), 1>&),
 boost::coroutines::detail::standard_stack_allocator,
 std::allocator<boost::coroutines::coroutine<int (), 0> >,
 boost::coroutines::coroutine<void (int), 1>, int, 0> >(long) (in
 /home/ahamez/a.out)
 ==10734== by 0x4C0E6BD: make_fcontext (in
 /home/ahamez/usr/boost1.54/lib/libboost_context.so.1.54.0)
 ==10734== Uninitialised value was created by a stack allocation
 ==10734== at 0x4C0E723: jump_fcontext (in
 /home/ahamez/usr/boost1.54/lib/libboost_context.so.1.54.0)
 }}}

 Tested under MacOS X 10.8 with clang 3.3 and under Linux (CentOS 6) with
 gcc 4.8.
 I can't say if it's just Valgrind which can't cope with coroutines or if
 it's a real bug from Boost.Coroutine.

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/9180>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:14 UTC