1

このコードがVisualC++ 2010で警告なしにコンパイルされる(実行時にクラッシュする)理由はありますか?

int a = *((int*)nullptr);

静的分析は、クラッシュすると結論付ける必要がありますよね?

4

2 に答える 2

6

この使用はnullptrコンパイラエラーを生成する必要がありますか?

いいえ。

nullポインターを逆参照すると、未定義の動作が発生しますが、診断は必要ありません。

静的分析は、クラッシュすると結論付ける必要がありますよね?

かもしれない。する必要はありません。警告が出されたら確かにいいでしょう。専用の静的分析ツール(たとえば、Klocwork)はおそらく警告を発行します。

于 2011-01-28T00:49:45.463 に答える
3

はい、静的分析はこれが常にクラッシュすることを示します。ただし、これには、コンパイラが実際にこの静的分析を実行する必要があります。ほとんどのコンパイラはこれを行いません(少なくとも私が知っているものはありません)。

したがって、問題は次のとおりです。C/C++コンパイラがより静的な型チェックを行わないのはなぜですか。

コンパイラーがこれを行わない理由は主に、伝統と、コンパイラーを可能な限り単純にするという哲学です。

C(および程度は低いがC ++)は、計算能力がかなり高く、コンパイラーの作成の容易さが重要である環境で作成されました(多くの異なるHWアーキテクチャーがあったため)。

静的型チェック分析は、コンパイラーの記述を困難にし、コンパイルを遅くするため、当時は優先順位が高いとは感じられませんでした。したがって、ほとんどのコンパイラにはありません。

他の言語(例)Javaはさまざまなトレードオフを行うため、JavaではCで許可されている多くのことが違法です(例:到達不能コードはJavaでのコンパイル時エラーです。Cではほとんどのコンパイラは警告すらしません)。これは本当に哲学に要約されます。

ところで、必要に応じてCで静的型チェックを取得できることに注意してください-lint(古代)などのいくつかのツールが利用可能です。または、どのオープンソースC ++静的分析ツールが利用可能ですか?を参照してください。

于 2011-01-28T01:10:46.413 に答える