gpt4 book ai didi

c++ - 限制对C++目标的递归

转载 作者:行者123 更新时间:2023-12-02 09:59:56 25 4
gpt4 key购买 nike

在模糊使用antlr编写的语言时,模糊器报告了一个缓慢的测试用例,该用例使用了大量parens。
语法中的规则之一类似于:paren_expression: '(' expression ')';即使被报告为速度较慢的单位,它也存在一个更大的问题,即能够使用足够的paren轻松使应用程序崩溃(默认情况下,它在具有较小堆栈大小的Windows上也是如此)。
根据我的搜索,没有选择生成用于检查堆栈深度并在合理深度后退出的代码的选项,并且从C++中的堆栈溢出中恢复并不是一件好事或可移植的事情。
那么,在这种情况下可以做什么?输入错误导致崩溃不是很好。

最佳答案

您可以添加predicate来检查嵌套表达式的深度,如果谓词超过一定数目,则使谓词失败。
例如,您最多允许3个嵌套表达式,您可以这样做:

grammar T;

@members {
private int depth = 0;
}

parse
: expr EOF
;

expr
: '(' expr ')' {++depth <= 3}?
| INT
;

INT
: [0-9]+
;
编码:
TLexer lexer = new TLexer(CharStreams.fromString("(((42)))"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse();
会解析的很好,但是代码:
TLexer lexer = new TLexer(CharStreams.fromString("((((42))))"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse();
会抛出异常。
谓词( {...}?)内和 @members块内的部分是目标特定的代码(在这种情况下为Java)。您必须使用C++编写该代码。

关于c++ - 限制对C++目标的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63159023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com