【问题标题】:C++ 11 regex stack overflow / VS2012C++ 11 正则表达式堆栈溢出/VS2012
【发布时间】:2013-03-19 18:03:46
【问题描述】:

我正在将一些旧的 Boost 正则表达式代码转换为 C++11,我偶然发现了我的一个测试用例的问题。这是一个使用 std::regex 导致堆栈溢出异常的场景,但使用 boost::regex 可以正常工作。我没有更改正则表达式模式,并验证了该模式是我想要的。似乎这个特定的字符串输入片段导致堆栈溢出。使用VS2012,x64调试构建:

std::regex regx( "(^|\\})(([^\\{:])+:)+([^\\{]*\\{)" );

    const std::string testinput = " COLOR: #000; BACKGROUND-COLOR: #FFF; FONT-FAMILY: VERDANA, ARIAL, HELVETICA, SANS-SERIF; BACKGROUND:URL(URL(___FOO___)); BACKGROUND-2:URL(URL(___FOO___)); BORDER: 0 0 0 0; BORDER-2: 0 0 0; BORDER-3: 0 0; BORDER-4: 0PX; BORDER-5: 0.6; FILTER:PROGID:DXIMAGETRANSFORM.MICROSOFT.ALPHA(OPACITY=100); } ";
    std::smatch what;
    // this next line causes a stack overflow
    std::regex_search( testinput.cbegin(), testinput.cend(), what, regx );  

查看异常后的调用堆栈,在正则表达式实现中似乎存在某种类型的无限递归。我目前没有 GCC 来测试这个。我究竟做错了什么?

更新: 在下面的建议之后,我将此代码粘贴到控制台应用程序 VS 2012 x64 调试中,我得到了堆栈溢出。如果我将它更改为 x64 版本,或者 Win32 调试或发布它运行良好。啊???我是否需要重新安装 VS 和/或平台 SDK?我在 Win7 x64 上。

更新 #2: 有点相关的帖子:Why does std::regex_iterator cause a stack overflow with this data? 我想如果我重写我的正则表达式,它可能会有所帮助。我仍然不确定为什么位数很重要。以及为什么它适用于其他人,但不适用于我的系统。叹息。

【问题讨论】:

  • 我没有在安装 64 位调试版本的 VS 2012 中重现此崩溃。上面代码的直接副本,在 main 函数内,只是从对 regex_search 的调用中返回 false - 不匹配。
  • 在我的(32 位)上也能正常工作。
  • @DanNissenbaum,感谢您的确认。我更新了我的问题;似乎只发生在 x64 调试中。 x64 版本或 Win32 版本运行良好。没听懂?
  • 也许是一个干净的解决方案(即完全重建)?
  • 我也无法在我的 VS 2012 安装中重现此问题。看起来特定于您的应用程序,或者您的项目中的某些配置设置?

标签: c++ regex visual-c++ c++11 visual-studio-2012


【解决方案1】:

我已经用 x64 调试版本复制了这个,我相信这是一个真正的 堆栈溢出

当您将堆栈大小更改为 10MB 左右时(链接器命令行选项/STACK:"10000000"), 它会正常工作的。

【讨论】:

  • 谢谢,我同意这是一个有效的解决方法。不过,这让我想知道,这是否是实际的解决方案,或者只是一种掩盖 缺陷的方法,特别是因为 boost regex 在同一个应用程序中运行良好。由于发布模式显然重用了堆栈,我想这应该不是问题......再次感谢
  • 我认为这是某种缺陷。我没有调查<regex> 代码,但即使是 x86/Release 非常简单的正则表达式模式也会导致堆栈溢出。请检查:using namespace std; regex r("(x)+"); string t(512, 'x'); regex_search(t, r);
  • 是的,我可以在 x86 和 x64 调试和发布模式下重现同样的问题。有趣...
猜你喜欢
  • 2013-07-05
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2019-01-13
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
相关资源
最近更新 更多