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

10

我和几千其他人一起,遇到了由Microsoft Visual C++ Runtime引发的错误:

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个回答

12

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

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

这对应于编译器选项/GS(缓冲区安全检查)

检测一些缓冲区溢出,例如覆盖返回地址,这是一种常用的利用代码的技术,如果不强制执行缓冲区大小限制,则会受到攻击。通过在编译后的代码中注入安全检查来实现此目的。


我需要一种方法来禁用已编译代码上的缓冲区安全检查。 - Ian Boyd

1

这是在你的代码中发生还是实际上在库中发生?如果是在库中,我知道你说你想忽略错误,但如果是访问冲突导致进程崩溃怎么办?

你应该以同样的方式处理它,因为从逻辑上讲,它是一样的。只是 CRT 会使进程崩溃而不是操作系统。

但是,如果你正在使用库的调试版本,使用发布版本可能会得到更好的结果(也许它会在没有对话框通知的情况下崩溃)。

如果是在你的代码中,你可以使用 /GS- 选项禁用溢出检查。但你真的应该修复这个 bug。


天啊 - 总是有些问题... 我什么都没有。 - Michael Burr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接