GCC가 기능에 너무 전형적인 유형을 전달하는 것에 대해 경고 할 수 있습니까?
-
08-07-2019 - |
문제
다음은 컴파일러가 진단을 방출해야한다고 생각하는 명백한 결함 코드입니다. 그러나 둘 다 gcc
...도 아니다 g++
내가 생각할 수있는 모든 경고 옵션이 있어도 다음과 같습니다. -pedantic -Wall -Wextra
#include <stdio.h>
short f(short x)
{
return x;
}
int main()
{
long x = 0x10000007; /* bigger than short */
printf("%d\n", f(x)); /* hoping for a warning here */
return 0;
}
만들 수있는 방법이 있습니까? gcc
그리고 g++
이것에 대해 경고합니까? 참고로, 기본적으로 또는 상당히 일반적인 여분의 구성 구성으로 경고하는 다른 컴파일러가 있습니까?
참고 : GCC (C 및 C ++ 컴파일러 모두) 버전 4.2.4를 사용하고 있습니다.
편집 : 방금 찾았습니다 gcc -Wconversion
트릭을 수행하지만 동일한 옵션입니다 g++
그렇지 않고 여기에 C ++를 사용하고 있으므로 솔루션이 필요합니다. g++
(그리고 지금 왜 그런지 궁금합니다 -Wconversion
그렇지 않은 것 같습니다).
편집하다: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34389 이것이 고정 될 수 있음을 제안합니다 g++ 4.4
...아마도? 그것이 같은 문제인지 또는/또는 수정이 실제로 해당 버전에 나오는지는 아직 명확하지 않습니다. 4.3 또는 4.4를 가진 사람이 내 테스트 케이스를 시도 할 수 있습니다.
해결책
사용 -WCONVERSION- 함수 f (짧은 X)가 [printf]라고 불리는 경우, 문제는 긴 X에서 짧은 내에서 암시 적 캐스트 (변환)입니다. -WCONVERSION은 "오래까지의 캐스트와 같은 것을 값을 변경할 수 있습니다. ".
..
편집 : 메모를 보았습니다. -WCONVERSION Linux에서 G ++ 4.3.2를 사용하여 경고가 발생합니다 ... (Debian의 4.3.2-1)
다른 팁
PC-Lint/Flexelint에 투자하는 것이 강력하게 제안합니다. 김벨. 소프트웨어는 컴파일러가 아닌 것과 같은 것들을 잡기 위해 만들어졌습니다. 비교적 저렴하고 가격이 가치가 있습니다. 사이트에 평가하는 데 사용할 수있는 온라인 데모가 있습니다. 예에서 해당 라인에 대해보고하는 내용은 다음과 같습니다.
diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits)