2

我目前正在开发一种工具,它将比较两个文件并报告其差异。我想实现一个功能来比较两种方法,并报告它们是否相同(同时忽略变量名称的变化)。我想做的是将所有变量名标准化为 (x0,x1 ..) 或类似的东西。然后对方法进行排序(按字母顺序?),以便顺序相同。获取它们的校验和,然后比较两者。

我的问题:

如何规范化 C/C++ 文件中的变量名?或者您对我如何实现该功能有任何其他想法吗?

问候

4

3 回答 3

1

如上所述,如果您可以提出可重复且稳定的排序,则可以将“令牌”(变量名)映射到“实习形式”。

这并不试图理解标记是如何解析的,只是它们在两个源文件中以相同的模式存在。“令牌”将是 C/C++ 保留字以外的所有内容,不需要认真的解析/词法分析。

完成后,您可以将注释和空格转换为规范形式。

这对我来说大部分用处不大,但我相信它会在问题上实现 99.9% 或更好的解决——可以想象它可能会被愚弄,但实际上不太可能。

当然,如果我们也有必须处理的宏......也许你可以在它们上运行 C 预处理器来实现它,如果这是一个要求?

希望这可以帮助。

于 2013-05-07T10:26:39.493 回答
0

当然,这不是关于标准化名称,而是关于确定这两种方法是否对类中的相同事物执行相同的操作。这意味着解析源代码并从中构建某种数据结构[可能是“树”]。一旦你有了这棵树,这样的名字就变得毫无意义了。例如,您可能需要跟踪类成员变量所引用的 OFFSET 以及类中的哪些虚函数。

我不认为这是微不足道的(除非您将代码限制为 C++ 代码的一小部分),因为有很多不同的方法可以使某件事情做同样的事情,而只是细微的差异就会抛弃任何东西最精密的工具。例如

class A
{
   private:
     int arr[10];
     ...
   public:
     int sum()
     {
        int r = 0;
        for(i = 0; i < 10; i++)
            r += arr[i];
        return r;
     }
}


class B
{
   private:
     int arr[10];
     ...
   public:
     int sum()
     {
        int r = 0;
        int *p = arr;
        for(i = 0; i < 10; i++)
            r += *p++;
        return r;
     }
     .... 
}

这两个函数做同样的事情。

于 2013-05-07T10:13:12.023 回答
0

在编译期间使用 gcc 生成的临时树表示怎么样,gcc 有一个命令行开关来保存临时文件:

gcc -save-temps <file>

这段代码有些简化,名称也统一了。问题是识别原始文件中的差异。不要使用优化!

于 2013-05-16T17:21:47.153 回答