未定義の動作は潜在的に何かを引き起こす可能性があり、UBを含むプログラムは潜在的に無意味になることを私は知っています。未定義の動作が問題を引き起こす可能性があるプログラムの最も早いポイントを特定する方法があるかどうか疑問に思いました。これが私の質問を説明するための例です。
void causeUndefinedBehavior()
{
//any code that causes undefined behavior
//every time it is run
char* a = nullptr;
*a;
}
int main()
{
//code before call
//...
causeUndefinedBehavior();
//code after call
//...
}
私の理解では、未定義の動作が引き起こされる可能性のある時間(必ずしも明示されているとは限りません)は次のとおりです。
- いつ
causeUndefinedBehavior()
コンパイルされますか。 - いつ
main()
コンパイルされますか。 - プログラムの実行時。
- その時
causeUndefinedBehavior()
に実行されます。
それとも、未定義の動作が引き起こされるポイントは、すべてのケースとすべての実装で完全に異なりますか?
さらに、呼び出された行をコメントアウトした場合causeUndefinedBehavior()
、UBは削除されますか、それともUBを含むコードがコンパイルされたため、プログラムに残っていますか?