はじめに
Visual Studioの/GS (バッファーのセキュリティ チェック)とは何なのかまとめてみました。
/GS (バッファーのセキュリティ チェック)
プログラミングにおける誤りによって、関数のリターン アドレス、例外ハンドラーのアドレス、または特定の型のパラメーターを上書きするバッファー オーバーランを検出する機能です。
/GSはVisual Studioのコンパイルオプションの中に存在します。
サンプルコード
以下のコードを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