18

次のプログラムでは、5 行目で予想どおりオーバーフローの警告が表示されます が、驚くべきことに、GCC では 4 行目では警告が表示されません: http://www.ideone.com/U0BXn

int main()
{
    int i = 256;
    char c1 = i;    //line 4
    char c2 = 256;  //line 5
    return 0;
}

両方の行でオーバーフローの警告が表示されるはずだと考えていました。または、私が見逃しているものがありますか?


この実験を行うきっかけとなったトピックは次のとおりです: typedef 型チェック?

そこで私は次のように言いました(実行すると、期待どおりに表示されなかったため、回答から削除しました):

//However, you'll get warning for this case:

typedef int  T1;
typedef char T2;

T1 x = 256;     
T2 y = x; //possible overflow warning! (but it doesn't give warning :()
4

4 に答える 4

13

-Wall多くのオプションは含まれていません。 -Wconversionそれらの 1 つであり、関心のある動作について警告します。

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.htmlを参照してください。

于 2011-02-23T19:03:06.007 に答える
11

intオブジェクトに値を代入する一般的なケースでは、コンパイラはが の範囲外にあるcharかどうかを知りません。intchar

実際の警告をより詳しく見てください。

warning: overflow in implicit constant conversion

charコンパイラが警告できるのは、定数が変換されているこの特定のケースです。同様に、 の宣言iを be に変更した場合const:

const int i = 256;

c2割り当てられる値が定数式であるため、警告も表示されます。

また、変換は技術的に「オーバーフロー」しないため、この警告は誤解を招く可能性があることにも注意してください。算術オーバーフローにより、C++ で未定義の動作が発生します。縮小変換 ( のようintcharintの範囲が よりも大きい場合char) は、実装定義の変換を生成します。

于 2011-02-23T18:42:03.473 に答える
1

5 行目は、どのコンパイラでも直接確認できる明らかなエラーであり、常にエラーです。行 4 では、エラーを発見するために少なくともデータ フロー分析が必要です。おそらく、これはサイトで使用されている設定で行われていないか、コンパイラの作成者がこれを理解するのに十分なほど重要であるとは考えていませんでした.

于 2011-02-23T18:44:11.073 に答える