2013-01-25 1 views
3

gcc를 사용하여 일부 C++ 코드를 컴파일하고 "Debug"구성을 사용할 때 코드가 잘 컴파일되는 동안 "Release"구성에서 경고가 발생합니다. 컴파일 옵션의 유일한 차이점은 다음과 같습니다일부 명령문은 "릴리스"에서는 경고를 생성하지만 GCC에서 "디버그"모드 컴파일에서는 생성하지 않는 이유는 무엇입니까?

"디버그"g++ -O0 -g3 ...

"릴리스"g++ -O3 ...

나는 "릴리스"빌드에 표시되는 메시지 :

../src/xml.cpp: In static member function ‘static Z<char>* XML::ReadToZ(const char*, XMLTransform*, XMLTransformData*)’: 
../src/xml.cpp:5034: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result 
../src/xml.cpp:5041: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result 

관련된 두 문장은 다음과 같습니다.

/* 5034 */ fread((*y).operator char *(),1,S,fp); 
/* 5041 */ fread(yy.operator char *(),1,S,fp); 

경고가 왜 다른가요?

+2

왜 중요한가요? 반환 값을 확인하십시오. – chris

+0

@chris - 우선 문제는 b * c입니다. 저는 문제를 이해하고 문제를 이해하고 * 우회하는 데 관심이 있습니다. 두 번째로, 이것은 내 코드가 아니지만 웹에서 다운로드 한 패키지의 일부이므로 변경하기를 꺼립니다. – ysap

+1

논리적 인 의미로 컴파일러 경고에주의를 기울이는 것이 실제로 문제를 우회하는 것은 아닙니다. 당신이 기대 한 것을 읽지 못할 경우, 당신은 알 방법이 없습니다. 다른 사람이 작성한 코드이기 때문에 컴파일 할 때 경고를하지 않고 강력하게 만들려면 노력해야합니다. – chris

답변

1

GCC bugzilla에 버그 보고서가 있습니다. "Release"프로파일에 --no-warn-unused-result를 추가하십시오.

+0

감사합니다. 와우, 이건 "깊은"이야. 이 보고서는 상황을 상황에 맞게 설명했습니다. 나는 버그보고 스레드를 너무 깊이 읽지는 ​​않았지만 거기에 몇 가지 사려 깊은 논쟁이있다. – ysap

+0

해당 플래그를 사용하는 것은 좋지 않은 생각입니다. 대부분의 버그가있는 C 프로그램의 문제점은 검사되지 않은 결과입니다. 당신은 ** 이러한 문제를 숨기고 싶지 않습니다. –

1

일부 경고는 특정 최적화 단계에서 컴파일러에서 수행하는 "흐름 분석"을 기반으로 생성됩니다.

아마도 이러한 경고를 수정해야합니다!

+0

감사합니다. 이것은 내 코드가 아니지만 웹에서 다운로드 한 패키지의 일부이므로 변경하기를 꺼립니다. 이상한 것은'fread()'두 호출이'if-else' 문의 두 가지 브랜치에 있다는 것입니다. 그래서 그들 중 하나는 평가되어야합니다 (while'if'가 최적화되어 있지 않는 한). 그럴 것 같지 않습니다.) 그런 다음'fread()'-s 바로 다음에'fclose()'문이 있습니다. 왜 이것들 (또는 검사되지 않은 수천 개의 다른 stdlib 함수 호출)에 경고가 없는지? – ysap

+0

@ysap, 왜냐하면'fread'에는 속성이 첨부되어 있기 때문입니다. 입력을 통해 얻는 정보를 알지 못하기 때문에 사용자가 확인하지 않을 때 경고합니다. – chris