c - 自动转换 C 代码
问题描述
假设我有这个简单的代码:
void xorFunction (unsigned char output[], unsigned char a[], unsigned char b[], size_t length)
{
for(unsigned int i = 0; i < length; i++)
output[i] = a[i] ^ b[i];
}
int main()
{
unsigned char input[16] = { ... };
unsigned char mask[16] = { ... };
unsigned char output[16];
xorFunction(output, input, mask, 16);
xorFunction(mask, output, input, 16);
xorFunction(input, mask, output, 16);
return 0;
}
突然间,我想摆脱,xorFunction
所以我决定写for(i = 0; i < length; i++) ...
而不是xorFunction(...);
如何使用文本编辑器的查找和替换工具来做到这一点?
它可能看起来像这样:
Find: xorFunction(a, b, c, d);
Replace with: for(unsigned int i = 0; i < d; i++) a[i] = b[i] ^ c[i];
with a, b, c and d parameters of xorFunction.
a
、b
和是如何由查找c
和d
替换工具处理的变量?我想正则表达式在这种情况下会很有用,但我不知道如何。
解决方案
Coccinelle(“C 的语义补丁”)非常适合这种转换:
Coccinelle 是一个程序匹配和转换引擎,它提供语言 SmPL(语义补丁语言)用于在 C 代码中指定所需的匹配和转换。Coccinelle 最初的目标是在 Linux 中执行附带演变。这种演变包括客户端代码中响应库 API 演变所需的更改,并且可能包括修改,例如重命名函数、添加其值在某种程度上依赖于上下文的函数参数以及重新组织数据结构。除了附带演变之外,Coccinelle 还成功地用于(我们和其他人)查找和修复系统代码中的错误。
另一种选择是使用 Clang 作为库。虽然通常它比编写 Coccinelle 的语义补丁(甚至考虑 Clang Python 绑定)更复杂,但在这种情况下它应该不会太难。它的优点是您也可以解析 C++。
推荐阅读
- reactjs - Next.js router.query 在刷新页面上未定义,但如果您从 Link 组件导航到它,则可以使用
- python - 扩展 assertRaises
- r - 在 Windows 上运行 mc_replicate 时遇到问题
- java - 运行所述 .bat 文件时,.bat 文件中的内容无法正常运行
- omnet++ - 在 Omnet++ 和 Inet 中,如何将无线主机配置为被动监控模式?
- ruby - 我无法使用 RUBY 和 RSPEC 返回 api 的主体
- php - WordPress 中的多个下拉选择
- python - “write() 参数必须是 str,而不是字节”
- reactjs - TypeError:未定义不是对象(评估“movies.map”)
- amazon-web-services - 从 S3 托管的网站访问 Lambda 函数时出现 CORS 错误