Visual Studio中的GS选项

GS option in Visual Studio

本文关键字:选项 GS 中的 Studio Visual      更新时间:2023-10-16

我有代码:

#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
    char buf[3];
    cout<<"before"<<endl;
    strcpy(buf,argv[1]);
    cout<<"after"<<endl;
    return 0;
}

我的论点是" 123456",我会出现错误溢出。当我使用/gs和/gs关闭时,工作中没有什么不同。为什么?我总是以前,之后打印并获得错误。我认为返回地址已重新持有。但是我该如何检查?

/GS开关仅将检查插入其识别为缓冲区超支问题的函数>"。特别是:

在A GS缓冲区上执行缓冲区超级安全检查。A GS 缓冲区可以是其中之一:

  • 一个大于4个字节的数组具有两个以上的元素,并且具有指针类型的元素类型。
  • 大小超过8个字节并且不包含指针的数据结构。
  • 使用`_AlloCa函数分配的缓冲区。
  • 任何包含GS缓冲区的类或结构。

由于您的缓冲区小于4个字节,因此不被视为GS缓冲区,因此未插入检查。

但是,即使增加了缓冲区的大小并触发溢出,也不会看到差异,因为当main返回时,即在打印两条消息后,检查仅完成。为了测试其有效

#include <iostream>
using namespace std;
int setarg(char * arg)
{
 char buf[5];
 strcpy(buf,arg);
 return buf[0];
}
int main(int argc, char *argv[]) {
cout<<"before"<<endl;
if ( argc >1 )
  setarg(argv[1]);
cout<<"after"<<endl;
return 0;
}