使用ANTLR4处理大字符串时出现bad_alloc错误求助
ANTLR4 C++编译大型程序触发bad_alloc错误排查
我正在使用ANTLR4 C++库开发编译器,处理大型程序时会返回bad_alloc错误。我创建了一个仅包含for循环展开逻辑的最小测试用例,编译器核心代码如下:
int main(int argc, const char* argv[]) { ANTLRInputStream input(""); qasm3Lexer lexer(&input); CommonTokenStream tokens(&lexer); qasm3Parser parser(&tokens); fstream input_stream; ofstream output_stream; input_stream.open(argv[1]); stringstream string_stream; string_stream << input_stream.rdbuf(); string compiled_text = string_stream.str(); ForUnrollPass for_unroll_pass(&tokens); input.reset(); input.load(compiled_text); lexer.setInputStream(&input); tokens.setTokenSource(&lexer); parser.setTokenStream(&tokens); ParseTreeWalker::DEFAULT.walk(&for_unroll_pass, parser.program()); compiled_text = for_unroll_pass.getText(); output_stream.open(argv[2]); output_stream << compiled_text; output_stream.close(); return 0; }
经调试追踪,ForUnrollPass共执行了1700次改写操作(当前改写token的实现效率极低)。由于ANTLR4采用延迟写入机制,所有改写操作要等到调用getText()时才会统一执行,程序在执行到第1602次操作时,于以下指令处崩溃:
rop->text = iop->text + (!rop->text.empty() ? rop->text : "");
通过valgrind分析,当前已分配内存约800,000字节,但这似乎并非问题所在——最小测试用例同样在该节点崩溃。ANTLR4底层基于增强型转移网络实现,可能会占用较多内存,但我对其原理不甚了解,无法判断800,000字节是否属于异常情况。Linux环境下执行ulimit -a显示栈大小为8192KB,怀疑是否因栈空间不足导致崩溃?我并非内存领域专家,无法确定问题根源。
编辑补充
分析触发bad_alloc的调用栈后发现,iop->text指向的内存地址已损坏。
内容的提问来源于stack exchange,提问作者dahko37
相关产品推荐
相关产品推荐

