以下のコードでは、文書化されたすべての方法で例外を検出し、診断を生成しています。 C++ try/catchキーワードを使用し、__try/__catch
拡張キーワードでSEH例外をキャッチし、WindowsのAddVectoredExceptionHandler()およびSetUnhandledExceptionFilter()winapi関数を使用してVEH/SEHフィルタをインストールします。Windowsでスタックバッファオーバーランを報告するにはどうすればよいですか?
Visual C++ 2003でこれを実行します。
/GS: "hello、world!"と出力します。終了コード0で終了します。
/GS-: "hello、world!"
/GS:出力しない、-1073740791
/GS-終了コードで終了しますと、このビジュアルC++ 2013で実行
0終了コードで終了 "!こんにちは、世界" の出力を/ GSを有効にしてVS2013コンパイル済みプログラムで診断を行うにはどうすればよいですか?
#include "stdafx.h"
#include <Windows.h>
#define CALL_FIRST 1
#define CALL_LAST 0
LONG WINAPI MyVectoredHandler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
UNREFERENCED_PARAMETER(ExceptionInfo);
printf("MyVectoredHandler\n");
return EXCEPTION_CONTINUE_SEARCH;
}
LONG WINAPI MyUnhandledExceptionFilter(_In_ struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf("SetUnhandledExceptionFilter\n");
return EXCEPTION_CONTINUE_SEARCH;
}
void f()
{
__try
{
char p[20] = "hello,world!";
p[24] = '!';
printf("%s\n", p);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("f() exception\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
AddVectoredExceptionHandler(CALL_FIRST, MyVectoredHandler);
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
try{
f();
}
catch (...){
printf("catched f exception\n");
}
return 0;
}
コードによって、未定義の動作が発生します。 "検出"する唯一の信頼できる方法は、範囲外のアクセスを実行する前に境界をチェックすることです。 –
...検出を行うコンテナタイプを使用した場合は何が行われるかなどです。例えば文字列に 'std :: string'を使い、' at'メンバ関数でインデックスを付けます。 – Hurkyl
スタックオーバーランは検出が困難です。スタックフレームを上書きするときにのみトリガされます。ランタイム例外を有効にしてみてください*配列境界を超えました*。それは動作する可能性があります。 – cup