编写匹配if条件内foo()调用的Coccinelle规则遇解析问题
解决Coccinelle精准匹配含foo()的if块并删除指定函数调用的问题
我来帮你搞定这个Coccinelle规则的问题——你需要的是只删除那些if条件里包含foo()调用的代码块中的remove_this_call_if_foo_is_called(),之前的规则因为没有限定if条件的内容,所以误删了所有目标函数调用,对吧?
正确的Coccinelle规则写法
这里的核心是要先精准匹配到「条件中存在foo()」的if语句,再删除对应块内的目标函数。以下是可以实现需求的规则:
@ match_foo_in_condition @ expression E; @@ if (E) where exists @@ E contains foo() @ delete_call depends on match_foo_in_condition @ @@ - remove_this_call_if_foo_is_called();
规则解析
match_foo_in_condition规则:- 首先用
expression E捕获if的条件表达式(不管是NOT(ret=foo())、foo()==NULL还是直接foo()都能被匹配) - 关键的
where exists @@ E contains foo()语句:它会检查捕获到的条件表达式E中是否存在foo()调用,只有满足这个条件的if语句才会被标记。
- 首先用
delete_call规则:- 通过
depends on match_foo_in_condition关联到第一个规则,意味着只有当当前代码块属于被标记的if语句时,才会执行删除操作。 - remove_this_call_if_foo_is_called();表示删除该行代码,Coccinelle会自动处理该函数调用在if块内的任意位置(不管前后有没有其他代码)。
- 通过
测试效果
用这个规则处理你的test.c:
- 前三个if块(条件分别是
NOT(ret=foo())、foo()==NULL、foo())里的remove_this_call_if_foo_is_called()会被删除 - 第四个if块(条件是
bar())里的目标函数调用会被保留,完全符合你的需求。
运行命令示例
你可以用以下命令执行规则:
spatch --sp-file rule.cocci test.c
内容的提问来源于stack exchange,提问作者Hi-Angel
相关产品推荐
相关产品推荐

