2014-05-24 1 views
0

이 valgrind 출력은 내 코드를 참조하지 않는 것 같기 때문에 저를 혼란스럽게합니다. 그리고 STL을 사용하여 쓴 여러 프로그램에서이 valgrind 출력을 보았습니다. 더 HEAP 요약 오류가 없습니다 :Valgrind '초기화되지 않은 값'종속성이 내 코드를 참조하지 않습니다.

$ valgrind -v --leak-check=full --track-origins=yes ./hellostl 

... 

==7989== Conditional jump or move depends on uninitialised value(s) 
==7989== at 0x4017AA6: index (in /lib64/ld-2.17.so) 
==7989== by 0x4007A12: expand_dynamic_string_token (in /lib64/ld-2.17.so) 
==7989== by 0x4008304: _dl_map_object (in /lib64/ld-2.17.so) 
==7989== by 0x400181D: map_doit (in /lib64/ld-2.17.so) 
==7989== by 0x400E985: _dl_catch_error (in /lib64/ld-2.17.so) 
==7989== by 0x40010EF: do_preload (in /lib64/ld-2.17.so) 
==7989== by 0x40039D7: dl_main (in /lib64/ld-2.17.so) 
==7989== by 0x40152B7: _dl_sysdep_start (in /lib64/ld-2.17.so) 
==7989== by 0x4004E94: _dl_start (in /lib64/ld-2.17.so) 
==7989== by 0x4001637: ??? (in /lib64/ld-2.17.so) 
==7989== Uninitialised value was created by a stack allocation 
==7989== at 0x4003961: dl_main (in /lib64/ld-2.17.so) 
==7989== 
==7989== Conditional jump or move depends on uninitialised value(s) 
==7989== at 0x4017AAB: index (in /lib64/ld-2.17.so) 
==7989== by 0x4007A12: expand_dynamic_string_token (in /lib64/ld-2.17.so) 
==7989== by 0x4008304: _dl_map_object (in /lib64/ld-2.17.so) 
==7989== by 0x400181D: map_doit (in /lib64/ld-2.17.so) 
==7989== by 0x400E985: _dl_catch_error (in /lib64/ld-2.17.so) 
==7989== by 0x40010EF: do_preload (in /lib64/ld-2.17.so) 
==7989== by 0x40039D7: dl_main (in /lib64/ld-2.17.so) 
==7989== by 0x40152B7: _dl_sysdep_start (in /lib64/ld-2.17.so) 
==7989== by 0x4004E94: _dl_start (in /lib64/ld-2.17.so) 
==7989== by 0x4001637: ??? (in /lib64/ld-2.17.so) 
==7989== Uninitialised value was created by a stack allocation 
==7989== at 0x4003961: dl_main (in /lib64/ld-2.17.so) 

가 뭔가의 오래된 버전 사용하고 있음 가능 (예 : 컴파일러, Valgrind의 ...)?

편집 : 간단한 코드 버그를 트리거링된다

#include <vector> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    vector<int> foo; 
    for (int i = 0; i < 50; ++i) 
     foo.push_back(i); 

    for (auto it = foo.begin(); 
     it != foo.end(); 
     ++it) 
    { 
     cout << *it << endl; 
    } 
} 
+3

다른 사용자가 코드를 재현하려고 시도 할 수있는 코드를 게시하십시오. –

+4

불행히도 표준 플랫폼 라이브러리 코드가 모두 "깨끗합니다"는 것은 아닙니다. valgrind에 대한 억제 규칙을 설치해야 할 수도 있습니다. 'libdl'은 그러한 경우 중 하나 일 수 있습니다. –

답변

2

동적 링크 라이브러리 Valgrind의 경고 하여금 악명 높다. 당신이 관찰하는 것은 사실 매우 공통된 것입니다. 이 경고는 수정할 수 없지만 사용자를 괴롭 히면 억제 규칙을 추가 할 수 있습니다.

자세한 내용은 프로그램이 실행되기 전에 C++ 표준 라이브러리가 동적으로 링크되기 전에 수행해야합니다.

libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fa0e2f72000) 

정적으로이 라이브러리를 링크 할 경우, 프로그램이 동적 링크없이 실행됩니다 및 경고가 사라질 것입니다 : 당신이 ldd와 이진을 선택하면,이 같은 라인을 볼 수 있습니다.

+0

그냥 내 가정에 STL의 저주가 아니고 내 것이 아니란 것을 확인하고 싶었습니다. 감사. – ironicaldiction

+0

할 수 있으면 한 번 더 질문, 그래서이 올바르게 이해하고있다 : 몇 가지 코드를 실행하는 (동적으로 내 코드에 stl 라이브러리를 링크) 링크 단계에서 몇 가지 초기화되지 않은 값 문제, 올바른 있습니까? – ironicaldiction

+0

정확히. 다음은 ELF 바이너리가로드 될 때 일어나는 일에 대한 좋은 개요입니다 : http://linuxgazette.net/84/hawk.html – ypnos