10

我和其他几千人收到 Microsoft Visual C++ 运行时抛出的错误:

替代文字

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

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++ 运行时库的公司的支持站点,但他们没有提及哪些函数可能溢出,或者如何禁用溢出检查。

4

2 回答 2

11

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

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

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

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

于 2009-11-18T01:26:41.143 回答
1

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

您应该以同样的方式对待它,因为从逻辑上讲,它是同一件事。只是 CRT 使进程而不是操作系统崩溃。

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

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

于 2009-11-18T01:48:10.060 回答