小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Visual Studioの/GS (セキュリティチェック)とは何なのか

はじめに

Visual Studioの/GS (バッファーのセキュリティ チェック)とは何なのかまとめてみました。

/GS (バッファーのセキュリティ チェック)

プログラミングにおける誤りによって、関数のリターン アドレス、例外ハンドラーのアドレス、または特定の型のパラメーターを上書きするバッファー オーバーランを検出する機能です。

/GSはVisual Studioのコンパイルオプションの中に存在します。
f:id:replication:20190728143323p:plain

サンプルコード

以下のコードをVisual Studio 2015でリリースビルドして実行すると、イベントビューアに例外コード: 0xc0000409が記録されます。

#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>

#pragma warning(disable : 4996) // for strcpy use

int main()
{

	char buffer[10] = { 0 };
	strcpy(buffer, "This string is longer than 10 characters!!"); // overrun buffer !!!
	// Run-Time Check Failure #2 - Stack around the variable 'buffer' was corrupted.

	printf("%s\n", buffer);
	system("pause");

	return 0;
}
昔はdebugビルドでしか機能しなかった

昔のVisual Studioのバージョン(2010より前)は、最適化がoff(=debugビルド)のときしか、バッファオーバランを検知してくれませんでした。
Visual Studio 2010以降は、最適化がon(=releaseビルド)でも検知してくれるようになった模様。

というわけで、VC++ 2010からは最適化が有効であってもチェックが行われる、が答えになるかと。
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/66310bbc-ac63-4232-b711-c61caa83c198/gs124581250312471125191253112395124241242712496124831250112449?forum=vcgeneralja