从C源代码中自动删除未使用的局部变量

use*_*514 9 c automated-refactoring

我想从C文件中删除未使用的局部变量.例:

int fun(int a , int b)
{
  int c,sum=0;
  sum=a + b;
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

这里未使用的变量是'c'.

我将从外部获得所有未使用的局部变量的列表.现在使用我所拥有的未使用的局部变量,我们必须从源代码和删除中找到局部变量.
在上面的例子中,"c"是未使用的变量.我会知道它(我有代码).在这里,我必须找到c并删除它.

编辑

关键是不要使用外部工具查找未使用的局部变量.关键是要从给定列表的代码中删除它们.

Pau*_*ham 21

打开你的编译器警告级别,它应该告诉你.

将源片段放在"fc"中:

% gcc -c -Wall f.c
f.c: In function 'fun':
f.c:1: warning: unused variable 'c'
Run Code Online (Sandbox Code Playgroud)


MSa*_*ers 10

棘手 - 你必须为此解析C代码.结果有多接近?我的意思是:

int a, /* foo */
    b, /* << the unused one */
    c; /* bar */
Run Code Online (Sandbox Code Playgroud)

现在,人类很明显第二条评论必须要去.

轻微变化:

void test(/* in */ int a, /* unused */ int b, /* out */ int* c);
Run Code Online (Sandbox Code Playgroud)

再次,第二个评论必须去,这次是b之前的评论.

通常,您希望解析输入,过滤它,并发出不是未使用变量声明的所有内容.您的解析器必须保留注释和#include语句,但如果您没有#include标头,则可能无法识别声明(如果使用宏来隐藏声明,则更是如此).毕竟,你需要标题来决定是否A*B(); 是函数声明(当A是类型时)或乘法(当A是变量时)


[编辑]此外:

即使您知道变量未使用,删除它的正确方法也很大程度上取决于远程上下文.例如,假设

int foo(int a, int b, int c) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

显然,c未被使用.你能改成吗?

int foo(int a, int b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

也许,但不是如果&foo存储在一个int(*)(int,int,int).这可能发生在其他地方.如果(且仅当)发生这种情况,您应该将其更改为

int foo(int a, int b, int /*unused*/ ) { return a + b; }
Run Code Online (Sandbox Code Playgroud)


Chr*_*fer 5

你为什么要这样做?假设你有一个像样的优化编译器(GCC时,Visual Studio等)的二进制输出将不会有任何不同是否需要在删除"廉政C"在你的原来的例子与否.

如果这只是代码清理,任何最新的IDE都会为您提供每个警告的源代码的快速链接,只需单击并删除:)


Dev*_*inB 5

我的回答更多是对MSalters非常彻底的回答的精心评论.我会超越'棘手'并说这样的工具既不可能也不可取.

如果您只想删除对变量的引用,那么您可以编写自己的代码解析器,但是需要区分它所在的函数上下文,例如

int foo(double a, double b)
{
   b = 10.0;
   return (int) b;
}

int bar(double a, double b)
{
   a = 5.00;
   return (int) a;
}
Run Code Online (Sandbox Code Playgroud)

任何简单的解析器都会遇到麻烦,'a'和'b'都是未使用的变量.

其次,如果您将评论视为MSalter,您会发现人们不会持续评论;

double a;
/*a is designed as a dummy variable*/
double b;

/*a is designed as a dummy variable*/
double a;
double b;

double a; /*a is designed as a dummy variable*/
double b;
Run Code Online (Sandbox Code Playgroud)

等等

因此,简单地删除未使用的变量将创建孤立的评论,这可能比没有评论更危险.

最终,优雅地执行是一项非常困难的任务,无论如何你都会破坏代码.通过自动化流程,您可能会使代码变得更糟.

最后,您应该首先考虑变量在代码中的原因,如果它们被弃用,为什么它们的所有引用都不会被删除.