2012-05-14 4 views
1

나는 결국 오늘 고정 된 매우 이상한 segfault를 가졌습니다. 문제는 제가 스택에 매우 큰 배열을 할당하고 있었고 문제가 발생한 것 같습니다.스택 오버플로 대 segfault

내 질문은, 당신은 항상 스택 오버플로에 SEGV 신호를받을 수 있습니까? 스택 오버 플로우 문제가 있음을 경고 할 수있는 특수 신호가 있습니까?

gdb와 g ++를 사용하고 있습니다.

답변

2

유닉스 신호의 의미에서 "신호"는 분명히 SEGV입니다. :) 만약 당신이 뭔가 나쁜 일이 일어 났을 때 알려주는 진단 도구를 사용하는 것과 같은 신호라면, 당신은 valgrind를 시도 할 수 있습니다. 그러나 정말로, 당신의 시스템은 방금 당신에게 말했습니다. 그리고 컴파일 시간에 스택이 오버플로되는지 여부는 알 수 없습니다. 스택 크기 제한이 런타임 매개 변수이기 때문에 부분적으로는 가능하지 않으며, 선험적으로 무엇인지 알면 상상할 수 있습니다. 정지 문제.

+0

나는 본다. 문제는 이것이 valgrind로 치료하는 것이 거의 불가능한 매우 큰 문제 크기에서만 문제가되는 것입니다. 작은 문제 크기에서 valgrind는 아무 말도하지 않고 코드가 잘 작동하고있었습니다! GDB는 또한 segfault를 생성하고 그와 아무 관계가없는 라인을 나타냅니다 ... gdb가 스택 오버플로를 잡아 더 의미있는 오류를 일으킬 수 있기를 바랬습니다! – GradGuy

+0

사실,'gcc'로'-Wframe-greater-than = len' 플래그를 사용하여 보수적으로 가능합니다. http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html –

+1

@DavidTitarenco : OP가 우리에게 더 잘 알려줄 수는 있지만이 옵션이 도움이 될지 모르겠다. 아마도 큰 데이터 크기 (예 : 큰 스택 깊이가 발생하거나 큰 배열이 "alloca"스타일로 할당 됨)와 같이 일부 런타임 조건이 충족 될 때 발생하는 문제입니다. –