当前位置: 首页 > 知识库问答 >
问题:

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

宓昂雄
2023-03-14

我正在将一些较旧的Boost regex代码转换为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 );  

共有1个答案

柯甫
2023-03-14

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

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

 类似资料:
  • 我找不到堆栈溢出的来源,但似乎是外部的循环造成的。 提前道谢!

  • 问题内容: 该类的标准实现使用递归来实现多种形式的正则表达式(例如,某些运算符,替换)。 这种方法会导致输入字符串超过(相对较小)长度(可能不超过1,000个字符)的堆栈溢出问题,具体取决于所涉及的正则表达式。 一个典型的例子是以下正则表达式,它使用交替从周围的XML字符串中提取可能的多行元素(名为),该元素已经提供了: 上面的正则表达式与该方法一起使用,以读取“数据”捕获组并按预期工作,直到提供

  • 主要内容:正则表达式的组成,Regex 类正则表达式是一种匹配输入文本的模式,可以用于解析和验证给定文本以及模式之间是否匹配,模式可以包含运算符、字符字面值或结构。 正则表达式的组成 我们可以使用正则表达式检查给定字符串是否与指定模式相匹配。正则表达式的匹配模式由一系列字符组成,其中可以包括数子、文字、运算符、字符等等。我们可以使用这些模式来搜索字符串或文件,并查看是否找到了匹配的项。 开发中我们一般使用正则表达式来验证用户输入的信息是否

  • 问题内容: 下面的表达式: 运行编译的.Jar文件时,覆盖匹配的缓冲区。 匹配的字符串可以类似于: 这是一条垃圾线 #ifdef FEATURE #endif // FEATURE的结尾 这是一条垃圾线 #ifdef功能 这是一条应该匹配的垃圾线:HOLasduiqwhei&//功能fjfefj #endif // h #endif功能 这是一条垃圾线 因此,粗体字符串应匹配。错误如下: 欢迎采取

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码: