2009-04-21 6 views
5

Gibt es ein Flag für gcc, dass Konvertierungen von einem langen zu einem kurzen eine Warnung über einen möglichen Datenverlust generieren?Gibt es eine gcc 4.2-Warnung, die Visual Studio in Bezug auf einen möglichen Datenverlust ähnelt?

Ich arbeite an einer C++ - Anwendung, die für Visual Studio (2005) und GCC 4.2 (für Mac OS X) kompiliert wird.

Die Warnungen, dass Visual Studio druckt dieses Muster folgen:

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

Ich habe -Wconversion versucht, aber das ist nicht ganz das, was ich suche. Das einzige, was ich bis jetzt finden konnte, ist eine experimentelle Flagge, -Woercion, die mit GCC 4.3 in Verbindung gebracht wird (was ich nicht weiß, ob wir überhaupt noch investieren wollen).

22. April 2009 @ 11:00 EST Bearbeiten: Um zu verdeutlichen, möchte ich diese Warnung sehen. Wir haben Code, wo wir wissen möchten, wann ein Datenverlust auftreten würde. Wenn ich den Code haben:

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

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

Ich erhalte diese erwartete Ergebnis:

    Wert1: 2147483647
    Wert2: 65535

In unserem Code, wir haben spezielle stellt fest, dass der Zwang ausgeübt wird und warnen uns, wenn der ausgeführte Code zu einem Datenverlust führen würde. Wir haben die Orte in unserer großen Codebasis mithilfe der Warnungen von Visual Studio gefunden.

Gibt es eine Möglichkeit, diese Warnungen in gcc 4.2 zu generieren?

Antwort

4

Diese Funktion wird nicht in GCC 4.2, aber es wurde in GCC 4.3 hinzugefügt. Wiki page explaining it.

Danke an schnaader und Evan Teran für die Links, die mich dorthin geführt haben.

+1

Für eine mögliche Datenverlustvalidierung versuchen Sie '-WShorten-64-to-32'. '-Wconversion' prüft auch auf signedness errors (könnte Overkill sein). – rustyx

+0

'-WShorten-64-to-32' wird von GCC nicht akzeptiert, nur von Clang. – Andy

4

Betrachten Sie diese GCC bug entry, vielleicht hilft es zu verstehen, warum die Konvertierung von lang zu kurz nicht zu einer Warnung führt.

+3

besser noch, folgen Sie dem Link in diesem Bug-Eintrag: http://gcc.gnu.org/wiki/Wcoercion –

+0

Dies ist nicht tatsächlich meine Frage zu beantworten. Aber danke fürs schauen. –

4

Verwenden Sie -Wwandlung. Sie scheinen dies zu benötigen, auch wenn Sie bereits -Wall angeben.

Es funktioniert definitiv in gcc4.3. Wenn es nicht durch Version 4.2 behoben wurde, müssen Sie ein Upgrade durchführen, um es zu bekommen.

Beispiel Warnung:

warning: conversion to 'short int' from 'int' may alter its value 
Verwandte Themen