2009-04-28 3 views
16

Valgrind에 알려진 오 탐지가 있습니까? fmemopen 함수를 사용하여 '조건부 점프 또는 이동이 초기화되지 않은 값에 달려 있음'을 얻었습니다. C로 작성하고 GCC로 컴파일합니다. 그것이 진짜인지 확신 할 수 있습니까?Valgrind에 알려진 오 탐지 (false positives) 문제가 있습니까?

편집 : 억제 파일에없는 알려진 문제가 있습니까? 프로그램에서 할 수있는 일이 있습니까? 오류는 아니지만 Valgrind는 말할 수 있습니다. 알려진 문제가있는 경우 목록을 작성하는 것이 좋습니다.

답변

13

예, Valgrind에는 오탐 (false positive)이 있습니다. 특정 glibc 및 gcc 버전에 대한 억제 파일이있는 이유입니다. 구형 valgrind를 최신 gcc 및 glibc (예 : valgrind 3.3 및 glibc 2.9)와 함께 사용하는 경우 위양성이 발생할 수 있습니다.

그런데, 당신은 여전히 ​​문제를 조사하고 그것이 실제로 거짓 긍정인지 알아 내야합니다 (그것이 사실 인 것으로 밝혀지면 스스로 억제 할 수 있습니다) 또는 실제 버그입니까 귀하의 프로그램에서.

여기에 무슨 일이 일어나고 있는지 빠르고 간단하게 말할 수있는 방법은 없지만이 경우 코드에서 라이브러리 코드로 초기화되지 않은 값을 전달하는 것으로 의심됩니다. Valgrind 옵션 --track-origins=yes을 사용해보십시오. 초기화되지 않은 값의 출처를 표시합니다. 그것이 당신의 코드라면 아마도 그것을 초기화해야 할 것입니다. 라이브러리 내부에 있으면 거짓 긍정이 될 수도 있고 여전히 라이브러리 호출 인수의 나쁜 값이 원인 일 수 있으므로이를 확인하십시오.

+0

가양 성 여부는 어떻게 확인할 수 있습니까? –

+0

내 대답에 대한 몇 가지 지침을 추가했습니다. 잘하면 도움이됩니다. –

+0

내가 의심 할 여지없이 그것을 확인하기 전까지는 모든보고 된 문제가 실제로 문제라고 가정합니다. 버그를 다른 도서관이나 다른 라이브러리에서 버그를 일으키는 것으로 쉽게 해소 할 수 있습니다. 또는 문제가 실제로 자신의 코드에서 실제 문제가 될 때도 있습니다. 기억하십시오 : 선택은 아마 부서지지 않습니다 ;-) 물론, 거짓 긍정적 인 경우도있을 것입니다 ... – Dan

2

Valgrind에는 몇 가지 기본 오류 방지 기능이 있지만 모든 라이브러리를 포괄하는 것은 아닙니다.

오류 검사 도구는 GNU C 라이브러리 및 GNU/Linux 시스템에 사전 설치되어있는 X11 클라이언트 라이브러리와 같은 기본 라이브러리의 수많은 문제를 감지합니다. 이 오류를 쉽게 고칠 수는 없지만 이러한 오류를보고 싶지는 않습니다 (예, 많습니다!) 따라서 Valgrind는 시작할 때 표시되지 않도록 오류 목록을 읽습니다. 기본 억제 파일은 시스템이 빌드 될 때 ./configure 스크립트에 의해 작성됩니다.

코드와 관련이없는 자신 만의 error suppressions을 만들 수 있습니다.

1

Valgrind에서 오 탐지를 수정하여 데비안 SSL 문제가 발생하지 않았습니까?

+2

"거짓 긍정"이 의미하는 바에 달려 있습니다. 그것은 임의성의 많은 원천 중 하나 인 OpenSSL에서 초기화되지 않은 메모리를 의도적으로 사용했습니다. Valgrind는 그것에 대해 경고 할 때 완전히 옳았습니다 (무해했지만). –

+4

@BaffeBoyois : 악명 높은 데비안의 악명 높은 버그가 있음을 증명했습니다.데비안에서 버퍼를 0으로 memsetting하여 보안 키를 생성하지 못하면 스택 메모리가 할당되는 방법 (또는 malloc에서 라이브러리가 변경된 경우)을 컴파일러에서 변경하여 메모리를 모두 0으로 만들거나 중단시킬 수 있습니다 안전한 키 생성. 엔트로피를 얻는 것을 포함하여 어떤 목적 으로든 초기화되지 않은 메모리를 사용하는 것은 심각한 버그입니다. –

+2

@R : 데비안 버그는 소스로 초기화되지 않은 메모리를 사용하지 않으면 엔트로피가 너무 적게 남아있는 것이 아닙니다. 초기화되지 않은 메모리를 사용하지 않으려 고 시도했을 때 잘못된 것을 패치하고 우연히 대부분의 다른 엔트로피 소스를 사용하지 않게되었습니다. 초기화되지 않은 메모리를 제거하면 정상적으로 작동했을 것입니다. –