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

问题描述 投票:0回答:3

我和其他几千人收到 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.

现在我明白了什么是缓冲区溢出,以及为什么它是一件坏事。鉴于 Microsoft 新强调“

它只是坏了”,MSVCRT中的额外缓冲区检查可能是一件好事。

另一方面,我不在乎。并不是程序无法继续,而是程序无法

安全地继续。好吧,我宁愿不安全,因为这比什么都没有好。我喜欢危险的生活。

那么有人可以建议什么吗?我在想这样的事情:

    防止 MSVCRT 停止执行的注册表项
  • 以与以前的操作系统(Windows 7 之前的版本)兼容的方式运行应用程序
  • 将程序集清单添加到可执行文件夹,以便它使用旧版本的 MSVCRT,该版本不执行此溢出检查
  • 没有溢出检查的 MSVCRT 副本的版本号或下载位置
我尝试搜索编写

Microsoft Visual C++ Runtime Library 的公司的支持网站,但他们没有提及哪些函数可能溢出,或者如何禁用溢出检查。

windows compatibility buffer-overflow msvcrt
3个回答
12
投票
这里有一个选项。将其设置为否。

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

这对应于

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

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


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

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

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

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


0
投票
通过

wine运行旧游戏时也可能导致这种情况。

然后您可以通过以下方式修复它:例如

MESA_EXTENSION_MAX_YEAR=2002 wine CoDSP.exe

© www.soinside.com 2019 - 2024. All rights reserved.