Coccinelle未执行代码替换操作,请求排查问题原因
Coccinelle spatch 规则不生效问题排查
问题重现
我尝试了以下操作:
jaca@DESKTOP-PLDN4P1:~/dev/spatch_test$ cat spatch_test.cocci @@ expression E1, Fmt; @@ - MY_MACRO(E1, M_OK, Fmt) + MY_MACRO2(M_OK, E1, Fmt) jaca@DESKTOP-PLDN4P1:~/dev/spatch_test$ cat test.c MY_MACRO(myVar1, M_OK, ("%d my strings", myVar2)) jaca@DESKTOP-PLDN4P1:~/dev/spatch_test$ spatch --sp-file spatch_test.cocci --dir ./test.c -o ./test2.c init_defs_builtins: /usr/local/lib/coccinelle/standard.h HANDLING: ./test.c jaca@DESKTOP-PLDN4P1:~/dev/spatch_test$ cat test2.c MY_MACRO(myVar1, M_OK, ("%d my strings", myVar2)) jaca@DESKTOP-PLDN4P1:~/dev/spatch_test$ spatch --version spatch version 1.2-00008-g75525032 compiled with OCaml version 4.08.1 Flags passed to the configure script: [none] OCaml scripting support: no Python scripting support: yes Syntax of regular expressions: Str
我甚至尝试了完全匹配的规则:
@@ @@ - MY_MACRO(myVar1, M_OK, ("%d my strings", myVar2)) + MY_MACRO2(myVar1, M_OK, ("%d my strings", myVar2))
但依旧没有效果。上述操作在WSL Ubuntu(源码编译Coccinelle)和RedHat(包安装Coccinelle,版本1.0.7)环境中均复现。
问题原因及解决方法
命令行参数错误
你使用了--dir ./test.c参数,但--dir是用于指定待处理的目录,而非单个文件。spatch无法正确识别单个文件作为目录输入,导致规则未被应用到目标文件上。修正后的命令应该是以下两种之一:
# 方式1:用--file指定单个目标文件 spatch --sp-file spatch_test.cocci --file test.c -o test2.c # 方式2:直接将目标文件名作为参数传入 spatch --sp-file spatch_test.cocci test.c -o test2.c规则验证
- 你的第一个通用规则(基于
expression匹配)是正确的,修正命令行参数后,会自动将MY_MACRO(E1, M_OK, Fmt)格式的调用替换为MY_MACRO2(M_OK, E1, Fmt)。 - 第二个完全匹配的规则,在修正命令行后也会正常生效。
- 你的第一个通用规则(基于
内容的提问来源于stack exchange,提问作者jbulatek
相关产品推荐
相关产品推荐

