gpt4 book ai didi

c - 使用 libclang 在 for 循环中查找条件评估

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:51 24 4
gpt4 key购买 nike

我正在使用 clang(通过 Python 绑定(bind)通过 libclang)来组合代码审查机器人。我一直假设所有 FOR_STMT 游标都有 4 个子游标; INIT、EVAL、INC 和 BODY..

for( INIT; EVAL; INC )
BODY;

这意味着我可以用 python 中的东西检查求值表达式的内容,例如:

forLoopComponents = [ c for c in forCursor.get_children() ]
assert( len( forLoopComponents ) == 4 )

initExpressionCursor = forLoopComponents[ 0 ]
evalExpressionCursor = forLoopComponents[ 1 ]
incExpressionCursor = forLoopComponents[ 2 ]
bodyExpressionCursor = forLoopComponents[ 3 ]

errorIfContainsAssignment( evalExpressionCursor ) # example code style rule

这种方法似乎......开始时不太好,但我只是接受它作为 libclang 的结果,尤其是 Python 绑定(bind),相当稀疏。但是我最近注意到像这样的循环:

for( ; a < 4; a-- )
;

将只有 3 个 child ——现在评估将是第一个而不是第二个。我一直认为 libclang 只会为 FOR_STMT 的任何未使用部分返回 NULL_STMT……显然,我错了。

解析 FOR_STMT 的正确方法是什么?我在 libclang 中找不到任何对此有用的东西。

更新:查看 libclang 源代码,看起来这 4 个组件是使用访问者对象从 clang::ForStmt 类中笨拙地添加的。 ForStmt 对象应该返回 null 语句对象,但某处的某个层似乎将这些对象从访问的节点 vector 中剥离...?

最佳答案

这里也是一样,作为解决方法,我用一个虚拟的 int foo=0 语句替换了第一个空语句。我可以想象一个解决方案,它使用 Cursor 的 get_tokens 来匹配语句的各个部分。函数 get_tokens 可以在 clang 不够用的情况下提供帮助。

关于c - 使用 libclang 在 for 循环中查找条件评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26765603/

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