【问题标题】:Why am I getting a buffer overrun error with this line of code?为什么这行代码会出现缓冲区溢出错误?
【发布时间】:2010-09-28 06:29:52
【问题描述】:

我只有 1 行代码,这是:

pcrecpp::RE re("abc");

在函数OnBnClickedButtonGo() 中。而且这个函数在Release模式下会失败,但是在debug模式下可以正常使用。

(我在 Windows XP 上使用 Visual Studio 8。)

错误信息是:

A buffer overrun has occurred in testregex.exe which has corrupted the program's
internal state. Press Break to debug the program or Continue to terminate
the program.
For more details please see Help topic 'How to debug Buffer Overrun Issues'.

我怀疑它是它的析构函数,它是不可见的和隐含的......但我真的不知道。

PS:我静态链接到 PCRE lib 版本 7.8。 PS2:不是很相关,但可以帮助一些无法链接到 PCRE 库的人(我花了几个小时才整理出来):包括 #define PCRE_STATIC 行。

【问题讨论】:

  • 你构建了这个库,还是一个罐头库?不管怎样,它是用同一个编译器编译的吗?如果没有,我会尝试使用您的编译器构建库,看看是否有帮助。

标签: destructor pcre buffer-overrun


【解决方案1】:

在我的情况下,我收到了相同的错误消息。在调试中一切都很好,但在发布时我收到错误消息。我有一个像 native.dll 这样的原生 C/C++ 库。我创建了一个混合的非托管/托管 C++ 库,它是该库到 .net 的包装器。在这个mixed.dll 的某个地方,我有一个非托管函数签名声明,例如:

typedef void ( *FunctionOnStartSend)();

为此,我收到了消息,但如果我在那里添加一个“魔术词”,则没有错误消息:

typedef void (__stdcall *FunctionOnStartSend)(); 

【讨论】:

    【解决方案2】:

    如果它仅在发布模式下发生,则有可能某些东西正在“优化”出来。尝试做一些不只是一个衬里的事情,比如 Match() ,甚至可以打印出匹配项。

    【讨论】:

      【解决方案3】:

      这是我的新鲜历史: 大约一个月前,我遇到了一个奇怪的 VS2008 链接故障,那天我发现设置 _SECURE_SCL=0 可能会有所帮助(请参阅link text)。它有帮助。那天它帮助了我,我只是将此设置传播到我们在团队中构建的所有库 - 这是因为 MS 说使用不同 _SECURE_SCL 构建的两个库是不兼容的。

      时间过去了,三天前,当 VS2008 显示我们在第一篇文章中看到的错误消息时,我遇到了一个错误。并且调试器没有帮助,因为它仅在发布版本中溢出。我已经花了将近 2 天的时间来泵入库的代码,并且从一行到另一行的溢出都是有缺陷的。最后我开始逐行检查构建设置并计算出这个设置的差异!

      为什么,哦,为什么微软不能在动态加载器代码中嵌入一些小检查来测试当前运行的库和将要动态加载的库是否不兼容?!一些节省人们时间的代码。废话!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        相关资源
        最近更新 更多