如何将语句序列作为代码块移入Coccinelle宏参数?
Coccinelle规则添加代码块括号触发语法错误的原因与修复
需求背景
需要将C代码中所有Lock(resource)+语句块+Unlock(handle)的结构,替换为GUARD(resource, {语句块})的宏调用形式,确保语句块被正确包裹在花括号内。
原代码示例
int main() { Handle handle = Lock(resource); do_one_thing(); do_another_thing(); Unlock(handle); }
目标代码
int main() { GUARD(resource, { do_one_thing(); do_another_thing(); }); }
报错的Coccinelle规则
@@ expression expr; identifier handle; @@ - Handle handle = Lock(expr); + GUARD(expr, { ... - Unlock(handle); + });
错误信息
$ spatch --sp-file macro_stmt.cocci example.c init_defs_builtins: /usr/lib/coccinelle/standard.h plus: parse error: File "macro_stmt.cocci", line 6, column 14, charpos = 86 around = '{', whole content = + GUARD(expr, {
错误原因
Coccinelle的规则解析器会把替换语句中的{和}当成规则自身的语法元素(用于定义匹配逻辑的结构),而非需要插入的C代码片段。直接在+行中写{会导致解析混淆,触发语法错误。
修复方案
将包含花括号的替换内容用双引号括起来,明确告诉Coccinelle这是要插入的C代码文本,而非规则语法。修正后的规则如下:
@@ expression expr; identifier handle; @@ - Handle handle = Lock(expr); + GUARD(expr, "{ ... - Unlock(handle); + }");
或者使用Coccinelle的<{和}>语法标记C代码块,效果相同:
@@ expression expr; identifier handle; @@ - Handle handle = Lock(expr); + GUARD(expr, <{ ... - Unlock(handle); + }>);
验证结果
运行修正后的规则,spatch可正常解析并生成符合要求的目标代码,语句块被正确包裹在GUARD宏的花括号参数中。
内容的提问来源于stack exchange,提问作者Mats Kindahl
相关产品推荐
相关产品推荐

