私はコンパイラの最適化と知っていますが、実際のコードでこの動作がどのように通知されるのか、ms vC++コンパイラが誤ったコードを最適化する
私はこのコードを明らかに
void swap(char *s)
{
strcpy(s, "nope!");
printf("Result: %s\n", s);
};
void main(){
...
swap("this should segfault");
...
}
を持って、それがセグメンテーションフォールト必要がありますが、リリースモードでVisual Studioは、ちょうどprintfのをインライン化にそれを軽減します。
これは、後でお尻の中で本当に私を噛むことができるようなものだと思います。ここでは完全酒のため
はここに期待アセンブリ
push offset s ; "this should segfault"
call [email protected]@[email protected] ; swap(char *)
とあるコメントで要求されるように生成されたアセンブリ
push offset s ; "this should segfault"
push offset Format ; "Result: %s\n"
call ds:__imp__printf
、ここでは、コンパイラオプションですさ
/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Fd"Release\vc120.pdb" /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_LIB" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\scratchpad2.pch"
なぜこのコードがクラッシュすると思いますか?誰かのために 's'の価値について十分な詳細を与えておらず、確かにそれを知っている。それはヌルですか?バッファオーバーフローですか? –
これがセグメンテーションするのはなぜ明らかですか?このコードは、 's'に関するある仮定が成り立っている限り、私にとって有効です。そして、それらが保持しない場合( 's'が書き込み可能な十分なバッファを指していないため)、コードは未定義の振る舞いを示し、コンパイラは自由に結果を生成します。 「動作するように見える」は、未定義の動作の可能性のある表現の1つです。 –
@ igor fair。コンパイルで生成されたアセンブリと同様にフォールトになるサンプルコールが追加されました – jhbh