【发布时间】:2013-07-12 04:06:15
【问题描述】:
我一直在使用 <regex> 库(Microsoft Visual Studio 2012:更新 3),尝试使用它为我的应用程序实现稍微安全一点的加载过程,并且遇到了一些初期困难(参见 @@ 987654321@、Concurrently using std::regex, defined behaviour? 和 ECMAScript Regex for a multilined string)。
通过使用建议的正则表达式here,我已经解决了我最初的麻烦(导致堆栈溢出等),并且运行良好;但是,如果我的文件太大,那么它会导致堆栈溢出(我通过增加堆栈提交和保留大小来规避),或者如果堆栈大小足够大而不会导致堆栈溢出,那么它会导致 @987654326 @ 错误代码为12 (error_stack)。
这里有一个独立的例子来复制这个问题:
#include <iostream>
#include <string>
#include <regex>
std::string szTest = "=== TEST1 ===\n<Example1>:Test Data\n<Example2>:More Test Data\n<Example3>:Test\nMultiline\nData\n<Example4>:test_email@test.com\n<Example5>:0123456789\n=== END TEST1 ===\n=== TEST2 ===\n<Example1>:Test Data 2\n<Example2>:More Test Data 2\n<Example3>:Test\nMultiline\nData\n2\n<Example4>:test_email2@test.com\n=== END TEST2 ===\n=== TEST3 ===\n<Example1>:Random Test Data\n<Example 2>:More Random Test Data\n<Example 3>:Some\nMultiline\nRandom\nStuff\n=== END TEST3 ===\n\
=== TEST1 ===\n<Example1>:Test Data (Second)\n<Example2>:Even More Test Data\n<Example3>:0123456431\n=== END TEST1 ===";
int main()
{
static const std::regex regexObject( "=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===", std::regex_constants::ECMAScript | std::regex_constants::optimize );
for( std::sregex_iterator itObject( szTest.cbegin(), szTest.cend(), regexObject ), end; itObject != end; ++itObject )
{
std::cout << "Type: " << (*itObject)[1].str() << std::endl;
std::cout << "Data: " << (*itObject)[2].str() << std::endl;
std::cout << "-------------------------------------" << std::endl;
}
}
使用默认堆栈大小(4kB 提交和 1MB 保留)编译它会导致抛出堆栈溢出异常;并且在更改堆栈大小(8kB 提交和 2MB 保留)时,它会导致 std::regex_error 被抛出,错误代码为 12 (error_stack)。
我可以做些什么来防止这些错误,或者仅仅是正则表达式库被设计为仅用于小字符串(即 DoB 检查等)?
提前致谢!
【问题讨论】:
标签: c++ regex c++11 stack-overflow standard-library