首页 > 解决方案 > 自动转换 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.

ab和是如何由查找cd替换工具处理的变量?我想正则表达式在这种情况下会很有用,但我不知道如何。

标签: cregexvisual-studio

解决方案


Coccinelle(“C 的语义补丁”)非常适合这种转换:

Coccinelle 是一个程序匹配和转换引擎,它提供语言 SmPL(语义补丁语言)用于在 C 代码中指定所需的匹配和转换。Coccinelle 最初的目标是在 Linux 中执行附带演变。这种演变包括客户端代码中响应库 API 演变所需的更改,并且可能包括修改,例如重命名函数、添加其值在某种程度上依赖于上下文的函数参数以及重新组织数据结构。除了附带演变之外,Coccinelle 还成功地用于(我们和其他人)查找和修复系统代码中的错误。


另一种选择是使用 Clang 作为库。虽然通常它比编写 Coccinelle 的语义补丁(甚至考虑 Clang Python 绑定)更复杂,但在这种情况下它应该不会太难。它的优点是您也可以解析 C++。


推荐阅读