C++ visualstudio中的GS选项

C++ visualstudio中的GS选项,c++,visual-studio,C++,Visual Studio,我有密码: #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; } #包括“std

我有密码:

#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;
}
#包括“stdafx.h”
#包括
使用名称空间std;
int main(int argc,char*argv[]){
char-buf[3];

cout开关
/GS
只在函数中插入检查。特别是:

GS缓冲区执行缓冲区溢出安全检查 缓冲区可以是以下之一:

  • 大于4字节、包含两个以上元素且元素类型不是指针类型的数组
  • 一种数据结构,其大小超过8字节且不包含指针
  • 使用`\u alloca函数分配的缓冲区
  • 包含GS缓冲区的任何类或结构
由于您的缓冲区小于4字节,因此不将其视为GS缓冲区,因此不会插入检查

但是,即使您增加缓冲区大小并触发溢出,您也不会看到差异,因为检查仅在
main
返回时进行,即在打印两条消息之后。要测试它是否工作,请将缓冲区和strcpy移动到单独的函数中-您将看到程序在返回之前退出。

#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;
}
#包括
使用名称空间std;
int setarg(字符*arg)
{
char-buf[5];
strcpy(buf,arg);
返回buf[0];
}
int main(int argc,char*argv[]){

coutHow将7个字符放入一个大小为3的数组:
char buf[3];
?欢迎使用堆栈溢出。请花时间阅读并参考您可以在此处询问的内容和方式。“当我使用/GS on和/GS off时,工作中没有任何不同。为什么?”你认为会有什么不同?我不知道。我能看到不同吗?