我正在将一些旧的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 ); 查看异常后的调用堆栈,在regex实现中似乎存在某种类型的无限递归。我现在没有GCC来测试这个。我做错了什么?
更新:在下面的建议之后,我将这段代码粘贴到控制台应用程序中,VS 2012 x64调试,并得到堆栈溢出。如果我将其更改为x64版本,或者Win32调试或发布,则运行良好。嗯?我需要重新安装VS和/或platform SDK吗?我在Win7 x64上。
更新2:有些相关的帖子:iterator cause a stack overflow with this data?,我想如果我重写我的regex,它可能会有帮助。尽管如此,我还是不知道为什么痛苦很重要。以及为什么它对其他人有效,但对我在我的系统中不起作用。叹一口气。
发布于 2013-04-02 04:26:03
我在x64调试构建中复制了这个版本,我相信这是一个真正的堆栈溢出。
当您将堆栈大小更改为10 it左右(链接器命令行选项/STACK:"10000000")时,它将正常工作。
https://stackoverflow.com/questions/15696435
复制相似问题