GCC가 기능에 너무 전형적인 유형을 전달하는 것에 대해 경고 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/310108

문제

다음은 컴파일러가 진단을 방출해야한다고 생각하는 명백한 결함 코드입니다. 그러나 둘 다 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top