2008-11-21 7 views
9

Poniżej znajduje się kilka oczywiście wadliwego kodu, dla którego myślę, że kompilator powinien wydać komunikat diagnostyczny. Ale ani gcc ani g++ robi, nawet ze wszystkimi opcjami ostrzeżeń mogłem pomyśleć: -pedantic -Wall -WextraCzy mogę napisać GCC ostrzegając o przekazywaniu zbyt szerokich typów do funkcji?

#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; 
} 

Czy istnieje sposób, aby gcc i g++ ostrzec o tym? Na marginesie, czy masz inny kompilator, który ostrzega o tym domyślnie lub w dość powszechnej konfiguracji z ostrzeżeniami?

Uwaga: Używam GCC (kompilatory C i C++) w wersji 4.2.4.

Edit: Właśnie okazało się, że gcc -Wconversion załatwia sprawę, ale ta sama opcja g++ nie robi, a ja naprawdę za pomocą C++ tutaj, więc muszę rozwiązanie g++ (i jestem teraz zastanawiasz się, dlaczego -Wconversion robi” wydaje się, że to jest).

Edytuj: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34389 sugeruje, że może to być naprawione w g++ 4.4 ... może? Nie jest dla mnie jasne, czy to ten sam problem i/lub czy poprawka rzeczywiście nadchodzi w tej wersji. Może ktoś z 4.3 lub 4.4 może spróbować mojego testu.

Odpowiedz

6

Korzystanie -Wconversion - problem jest niejawna obsada (konwersja) od długiego x do krótkiego, gdy funkcja f (short x) jest nazywana [not printf], a -Wconversion powie, że coś w stylu "rzut z długiego na krótki może zmienić wartość".

..

Edytuj: właśnie zobaczyłem twoją notatkę. -Wkonwersja skutkuje ostrzeżeniem dla mnie, używając g ++ 4.3.2 na Linuksie ... (4.3.2-1 na Debianie)

+0

Aha - więc to tylko to, że 4.2.4 jest zbyt "stary", aby ostrzec tak jak powinno, a 4.3.2 działa (robię tutaj kilka założeń, ale myślę, że można bezpiecznie powiedzieć, że używam Ubuntu i widziałem kilka uwag na temat, które sprawiają, że wydaje się rozsądne myślenie, że to jest po prostu coś naprawiono w wersji 4.3+: –

+0

Próbowałem już z GCC 4.3.2 na maszynie Ubuntu Intrepid, a -Wconversion robi to, co chcę.Horay, ale boo dla 4.2.4 nie działa.nie ma znaczenia: –

+0

brakujące wzmianki o -Wign -konwersja dla g ++ (wymagana przynajmniej w nowszych wersjach) ... – codeling

0

Zdecydowanie polecam zainwestować w PC-lint/FlexeLint z Gimpel. Oprogramowanie jest stworzone do łapania takich rzeczy, że kompilator po prostu nie jest. Jest stosunkowo niedrogi i wart swojej ceny. Jest demo on-line na stronie, które można wykorzystać, aby go ocenić, oto co donosi dla danej linii z Twojego przykładu:

diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits) 
Powiązane problemy