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

如何将语句序列作为代码块移入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:07:26