このコードがVisualC++ 2010で警告なしにコンパイルされる(実行時にクラッシュする)理由はありますか?
int a = *((int*)nullptr);
静的分析は、クラッシュすると結論付ける必要がありますよね?
このコードがVisualC++ 2010で警告なしにコンパイルされる(実行時にクラッシュする)理由はありますか?
int a = *((int*)nullptr);
静的分析は、クラッシュすると結論付ける必要がありますよね?
この使用は
nullptr
コンパイラエラーを生成する必要がありますか?
いいえ。
nullポインターを逆参照すると、未定義の動作が発生しますが、診断は必要ありません。
静的分析は、クラッシュすると結論付ける必要がありますよね?
かもしれない。する必要はありません。警告が出されたら確かにいいでしょう。専用の静的分析ツール(たとえば、Klocwork)はおそらく警告を発行します。
はい、静的分析はこれが常にクラッシュすることを示します。ただし、これには、コンパイラが実際にこの静的分析を実行する必要があります。ほとんどのコンパイラはこれを行いません(少なくとも私が知っているものはありません)。
したがって、問題は次のとおりです。C/C++コンパイラがより静的な型チェックを行わないのはなぜですか。
コンパイラーがこれを行わない理由は主に、伝統と、コンパイラーを可能な限り単純にするという哲学です。
C(および程度は低いがC ++)は、計算能力がかなり高く、コンパイラーの作成の容易さが重要である環境で作成されました(多くの異なるHWアーキテクチャーがあったため)。
静的型チェック分析は、コンパイラーの記述を困難にし、コンパイルを遅くするため、当時は優先順位が高いとは感じられませんでした。したがって、ほとんどのコンパイラにはありません。
他の言語(例)Javaはさまざまなトレードオフを行うため、JavaではCで許可されている多くのことが違法です(例:到達不能コードはJavaでのコンパイル時エラーです。Cではほとんどのコンパイラは警告すらしません)。これは本当に哲学に要約されます。
ところで、必要に応じてCで静的型チェックを取得できることに注意してください-lint(古代)などのいくつかのツールが利用可能です。または、どのオープンソースC ++静的分析ツールが利用可能ですか?を参照してください。。