SIGSEGV при входе в функцию

Что может вызвать ошибку сегментации при простом входе в функцию?

Введенная функция выглядит как :

21:  void eesu3(Matrix & iQ)
22:  {

, где Matrix— это struct. При работе с GDB обратная трассировка выдает:

(gdb) backtrace 
#0  eesu3 (iQ=...) at /home/.../eesu3.cc:22
#1 ...

GDB не говорит, что такое iQ. ...буквально там. Что может быть причиной этого?

GCC:(Ubuntu/Linaro 4.6.3 -1ubuntu5 )4.6.3

Программа, созданная с помощью-O3 -g

Вызывающий код выглядит так:

Matrix q;
// do some stuff with q
eesu3(q);

Здесь ничего особенного

Я перезапустил программу с valgrind:

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes <prgname>

Вывод:

==2240== Warning: client switching stacks?  SP change: 0x7fef7ef68 --> 0x7fe5e3000
==2240==          to suppress, use: --max-stackframe=10076008 or greater
==2240== Invalid write of size 8
==2240==    at 0x14C765B: eesu3( Matrix &) (eesu3.cc:22)
...
==2240==  Address 0x7fe5e3fd8 is on thread 1's stack
==2240== 
==2240== Can't extend stack to 0x7fe5e2420 during signal delivery for thread 1:
==2240==   no stack segment
==2240== 
==2240== Process terminating with default action of signal 11 (SIGSEGV)
==2240==  Access not within mapped region at address 0x7FE5E2420
==2240==    at 0x14C765B: eesu3( Matrix&) (eesu3.cc:22)
==2240==  If you believe this happened as a result of a stack
==2240==  overflow in your program's main thread (unlikely but
==2240==  possible), you can try to increase the size of the
==2240==  main thread stack using the --main-stacksize= flag.
==2240==  The main thread stack size used in this run was 8388608.

Похоже, это поврежденный стек.

    Dump of assembler code for function eesu3( Matrix & ):
   0x00000000014c7640 <+0>: push   %rbp
   0x00000000014c7641 <+1>: mov    %rsp,%rbp
   0x00000000014c7644 <+4>: push   %r15
   0x00000000014c7646 <+6>: push   %r14
   0x00000000014c7648 <+8>: push   %r13
   0x00000000014c764a <+10>:    push   %r12
   0x00000000014c764c <+12>:    push   %rbx
   0x00000000014c764d <+13>:    and    $0xfffffffffffff000,%rsp
   0x00000000014c7654 <+20>:    sub    $0x99b000,%rsp
=> 0x00000000014c765b <+27>:    mov    %rdi,0xfd8(%rsp)

Хорошо, для ясности :Данные Matrix живут в куче. В основном он содержит указатель на данные. Структура небольшая, 32 байта. (только что проверил)

Сейчас пересобрал программу с разными вариантами оптимизации:

-O0:ошибка не показывает.

-O1:ошибка действительно отображается.

-O3:ошибка отображается.

--обновить

-O3 -fno-inline -fno-inline-functions:ошибку не показывает.

Это объясняет. Слишком много вложений в функцию приводило к чрезмерному использованию стека.

Проблема возникла из-за переполнения стека

10
задан Tom Brito 14 November 2013 в 13:55
поделиться