2009-04-21 5 views
5

Czy jest flaga oznaczająca gcc, która powoduje, że konwersje z długiego na krótki będą generować ostrzeżenie o możliwej utracie danych?Czy istnieje ostrzeżenie gcc 4.2 podobne do programu Visual Studio dotyczące możliwej utraty danych?

Pracuję nad aplikacją C++, która jest kompilowana zarówno dla Visual Studio (2005) i GCC 4.2 (dla Mac OS X).

Ostrzeżenia że Visual Studio drukuje się przestrzegać tego wzoru:

: warning C4244: 'argument' : conversion from 'long' to 'short', possible loss of data 

Próbowałem -Wconversion, ale to nie jest całkiem to, czego szukam. Jedyne, co udało mi się znaleźć do tej pory, to eksperymentalna flaga - Wcoercion, która jest powiązana z GCC 4.3 (nie jestem pewien, czy chcemy jeszcze zainwestować).

22 kwietnia 2009 @ 11:00 EST Edytuj: Aby wyjaśnić, chcę zobaczyć to ostrzeżenie. Mamy kod, w którym chcemy wiedzieć, kiedy nastąpi utrata danych. Jeśli mam kod:

unsigned long value1 = LONG_MAX; 
std::cout << "value1: " << value1 << std::endl; 

unsigned short value2 = value1; 
std::cout << "value2: " << value2 << std::endl; 

otrzymuję ten oczekiwany wynik:

    wartosc1: 2147483647
    value2: 65535

W naszym kodu, mamy specjalne domagają się wprowadzenia, które wykonają przymus i ostrzeżą nas, jeśli wykonany kod spowodowałby utratę danych. Znaleźliśmy miejsca w naszej dużej bazie kodu za pomocą ostrzeżeń Visual Studio.

Czy istnieje sposób generowania tych ostrzeżeń w gcc 4.2?

Odpowiedz

4

ta funkcja nie jest dostępna w GCC 4.2, ale został dodany GCC 4.3. Wiki page explaining it.

Dzięki Schnaader i Evanowi Teranowi za udostępnienie linków, które mnie tam doprowadziły.

+1

Aby sprawdzić możliwą utratę danych, wypróbuj '-Wshorten-64-to-32'. '-Wconversion' sprawdza również pod kątem błędów sygnatury (może być przesadą). – rustyx

+0

'-Wshorten-64-to-32' nie jest akceptowane przez GCC, tylko przez Clang. – Andy

4

Spójrz na to GCC bug entry, być może pomaga zrozumieć, dlaczego konwersja z długiej na krótką nie prowadzi do ostrzeżenia.

+3

jeszcze lepiej, wykonaj link w tym wpisie błędu: http://gcc.gnu.org/wiki/Wcoercion –

+0

To nie jest tak naprawdę odpowiedź na moje pytanie. Ale dzięki za patrzenie. –

4

Użyj -Wymiana konwersji. Wydaje się, że potrzebujesz tego, nawet jeśli już określiłeś -Wall.

Zdecydowanie działa w gcc4.3. Jeśli nie zostało to naprawione w wersji 4.2, musisz ją zaktualizować, aby ją uzyskać.

przykład ostrzeżenie:

warning: conversion to 'short int' from 'int' may alter its value 
Powiązane problemy