能否使用Coccinelle修改函数签名中的参数类型
Coccinelle修改函数参数类型实现方案
直接通过语义补丁的类型匹配规则即可完成参数类型替换,以下是可直接复用的示例:
精准修改指定函数的定义
如果只需要修改名为fn的函数的入参类型,编写如下.cocci规则文件即可:
@change_fn_param@ @@ int fn( - T1* p + T2* p ) { ... }
规则会自动匹配返回值为int、函数名为fn、入参为T1*类型且参数名为p的函数定义,将参数类型直接替换为T2*,函数体内的其他逻辑不会被改动。
同步修改头文件中的函数声明
如果需要同步修改头文件里的函数原型,新增对应规则匹配声明即可:
@change_fn_proto@ @@ int fn( - T1* p + T2* p );
固定类型替换的精准写法
如果你要替换的是两个确定的具体类型(比如struct old_ctx替换为struct new_ctx),可以直接写死类型避免误匹配,示例:
@change_fn_param_fixed@ @@ int fn( - struct old_ctx* p + struct new_ctx* p ) { ... }
批量适配函数体内的相关代码
如果函数体内存在依赖原参数类型的代码(比如局部变量定义、类型强转),可以追加依赖规则同步修改,示例:
@fix_body depends on change_fn_param@ identifier p; expression tmp; @@ ( - T1* tmp = p; + T2* tmp = p; | - memcmp(p, (T1*)target, sizeof(T1)); + memcmp(p, (T2*)target, sizeof(T2)); )
执行命令
将规则保存为param_type_patch.cocci后,执行以下命令即可直接原地修改代码文件:spatch --sp-file param_type_patch.cocci target_source.c --in-place
注意:如果目标函数存在多个参数,只需要定位到对应位置的参数做加减号替换即可,Coccinelle会自动保留其他参数的顺序、类型和名称,不会打乱原有函数签名结构。
内容的提问来源于stack exchange,提问作者pk-sk
相关产品推荐
相关产品推荐

