2014-10-20 2 views
1

나는 다른 시간에 다른 결과를 나타내는 것처럼 보이는 레거시 코드 (c)를 받았습니다. 인텔의 컴파일러와 컴파일러 플래그 -ftrapuv를 사용하여 일관되게이 문제를 재현 할 수있었습니다. 이것은 훌륭하게 작동했으며 초기화되지 않은 변수가 일부 스택 변수 였는지 확인할 수있었습니다. 질문은 다음 단계는 무엇입니까? 누구나 모든 스택 변수의 백 추적을 인쇄하는 방법을 알고 있습니까? (또는 단순히 스택 내용을 인쇄하십시오) 누군가가 제안을하거나 인텔이 어떻게 도움을 줄 수 있는지 알고 있습니까? 아니면이 문제를 진행해야합니까?초기화되지 않은 스택 변수를 찾는 방법

감사합니다.

+8

해보십시오 Valgrind의, 그것은 발견은 초기화되지 않은 변수의 읽기와 스택 트레이스를 인쇄합니다. –

+7

곧 출시 될 CLang 및 GCC 버전에서 새롭고 향상된 UBSanizer를 사용할 수 있습니다! – rodrigo

+0

컴파일 할 때 모든 경고를 켭니다. 또는 여러 정적 분석기 중 하나를 사용하십시오. (내가 사용하던 도구에 대해서는 언급하지 않겠지 만 매우 비싸고 최고입니다. 저렴한 도구를 찾으십시오 :이 오류는 도구를 찾기가 어렵지 않습니다.) –

답변

2

-ftrapuv 또는 Valgrind 's memcheck을 주석에 제안 된대로 사용할 수 있지만 이러한 오류는 런타임에 수행되는 오류 만 잡을 수있는 동적 분석입니다. 테스트 실행으로 버그가있는 코드가 실행되지 않으면 이러한 도구가 도움이되지 않습니다.

다행히도 초기화되지 않은 스택 변수는 정적으로 쉽게 감지 할 수 있으며 컴파일러는이를 잡는 데 도움이되는 플래그를 가지고 있습니다. gcc와 인텔의 icc는 모두 -Wuninitialized 플래그를 지원하여 문제 코드에 대한 경고를 출력합니다. gcc는 또한 코드 경로가있을 때 경고 할 -Wmaybe-uninitialized 플래그를 지원합니다.이 코드 경로에서 변수는 초기화되지 않은 상태로 사용될 수 있습니다. 이 후자의 분석은 가양 성이있는 경향이 있음에 유의하십시오.

관련 문제