C++ 11 正则表达式堆栈溢出/VS2012

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

我正在将一些较旧的 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? 我想如果我重写我的正则表达式,它可能会有所帮助。我仍然不确定为什么位数很重要。以及为什么它适用于其他人,但不适用于我的系统。叹息。

最佳答案

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

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

关于C++ 11 正则表达式堆栈溢出/VS2012,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15696435/

相关文章:

c++ - 在 C++ MFC 应用程序中绘制图形

c++ - 我的功能有什么问题? (从私有(private)类成员复制到传入的 float 的方法)

c++ - typedef 是一个定义吗?

c++ - MSVS 2010 和 C++ 标准的构建问题

c++ - MSVC:具有模板化转换运算符和多重继承的错误

C++11 移动语义和右值引用

c++ - 使用向上(或向下)舍入将 long double 转换为 double

c# - 复杂的正则表达式 : key-value pairs

javascript - 正则表达式仅在不是属性值时才替换字符串

php - 带点和逗号的正则表达式货币格式