This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: std::string clobbers memory when compiling without optimizations
- From: Jonathan Wakely <jwakely dot gcc at gmail dot com>
- To: Henrik MannerstrÃm <henrik dot mannerstrom at gmail dot com>
- Cc: gcc-help <gcc-help at gcc dot gnu dot org>
- Date: Fri, 3 Oct 2014 11:20:40 +0100
- Subject: Re: std::string clobbers memory when compiling without optimizations
- Authentication-results: sourceware.org; auth=none
- References: <542E5BF1 dot 2070508 at gmail dot com> <CAH6eHdS_TJdXkp55r8P13q_9ScThVu8LG9mp-5PPqBimb2P90Q at mail dot gmail dot com> <542E75B9 dot 9010504 at gmail dot com>
On 3 October 2014 11:08, Henrik MannerstrÃm wrote:
> Hi,
>
> On 10/03/2014 12:58 PM, Jonathan Wakely wrote:
>> Have you tried valgrind? Or compiling with GCC's -fstack-protector
>> option? I can't reproduce the problem, and I think it's pretty
>> unlikely std::string has that kind of bug without someone noticing
>> years ago.
>
> I'm not assuming that std::string has a bug (even though the title might
> suggest that), I'm just saying that the gdb watchpoint is triggered
> inside that function. I tried valgrind memcheck, but I'm no expert, so
> suggestions are welcome. Below is the output with stack-protector, what
> do you make out of it? Could it be my installation?
>
> - Henrik
>
>
> $ g++-4.9 -std=gnu++1y mvu.cc -o mvu
> $ ./mvu
> Correct diagonal: 1 1 1
> Eigen::Matrix<double, 1, 3, 1, 1, 3>
> Incorrect diagonal: 1.81749e-316 1 1
> $ g++-4.9 -std=gnu++1y -fstack-protector-all mvu.cc -o mvu
> $ ./mvu
> Correct diagonal: 1 1 1
> Eigen::Matrix<double, 1, 3, 1, 1, 3>
> Incorrect diagonal: 1 2 3
I get the same "1 2 3" result using -fstack-protector-all and valgrind.
My guess is that Sigma holds a dangling reference to some temporary
object that has gone out of scope, and the function call t2s
overwrites that stack memory, then when you return to main you go
through the dangling reference.
Are you sure you're using the Eigen types correctly?