You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写匹配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();

规则解析

  1. match_foo_in_condition规则:

    • 首先用expression E捕获if的条件表达式(不管是NOT(ret=foo())、foo()==NULL还是直接foo()都能被匹配)
    • 关键的where exists @@ E contains foo()语句:它会检查捕获到的条件表达式E中是否存在foo()调用,只有满足这个条件的if语句才会被标记。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:43:13