如何在Visual C ++运行时中禁用缓冲区溢出检查?

时间:2009-11-18 01:17:01

标签: windows compatibility buffer-overflow msvcrt

我和一个few thousand other people,正在收到Microsoft Visual C ++运行时抛出的错误:

alt text

为了搜索引擎的利益,说:

Microsoft Visual C++ Runtime Library

Buffer overrun detected!

Program: %s

A buffer overrun has been detected which has corrupted the program's
internal state. The program cannot safely continue execution and must
now be terminated.

现在我明白缓冲区溢出是什么,以及为什么它是一件坏事。鉴于微软新近强调“它刚刚崩溃”,在 MSVCRT 中额外的缓冲区检查可能是一件好事。

另一方面,我不在乎。并不是程序无法继续,而是程序无法安全继续。好吧,我宁愿不安全,因为它总比没有好。我喜欢危险地生活。

所以有人可以提出任何建议吗?我在考虑这样的事情:

  • 用于防止MSVCRT暂停执行的注册表项
  • 使用以前的操作系统(Windows 7之前的版本)运行应用程序
  • 将程序集清单添加到可执行文件夹,以便它使用较旧版本的MSVCRT,一个不执行此溢出检查的版本
  • 没有溢出检查的MSVCRT副本的版本号或下载位置

我尝试搜索编写 Microsoft Visual C ++运行时库的公司的支持网站,但他们没有提到哪些功能可能溢出,或者如何禁用溢出检查。

2 个答案:

答案 0 :(得分:9)

这里有一个选项。将其设为否。

项目属性 - >配置属性 - > C / C ++ - >代码生成 - >缓冲区安全检查。

这对应于/GS (Buffer Security Check) 编译器选项:

  

检测到一些缓冲区溢出   覆盖返回地址,一个常见的   利用代码的技术   不强制执行缓冲区大小   限制。这是通过   注入安全检查   编译代码。

答案 1 :(得分:1)

这是发生在您的代码中还是实际上在库中?如果它在库中,我知道你说你只想忽略错误,但如果是一个崩溃进程的访问冲突,你会怎么做?

你应该以同样的方式对待它,因为逻辑上它是一样的。只是CRT正在崩溃而不是操作系统。

但是,如果您正在使用库的调试版本,那么使用版本构建可能会获得更好的(?)结果(可能只是在没有对话框通知的情况下崩溃)。

如果它在您的代码中,您可以使用/ GS-选项禁用溢出检查。但是你应该真正解决这个问题。