Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何获取已分配但不再使用的变量的警告?_C_Gcc_Compiler Warnings_Clang - Fatal编程技术网

C 如何获取已分配但不再使用的变量的警告?

C 如何获取已分配但不再使用的变量的警告?,c,gcc,compiler-warnings,clang,C,Gcc,Compiler Warnings,Clang,下面的文件foo.c是我在代码中发现的一个更微妙的bug的简化版本 int b; void bar(int a); void foo(int a) { bar(a); a = 42; } 这行a=42实际上是我代码中的一个输入错误:我的意思是b=42。我不希望编译器检测到我输入了错别字,但我希望得到一个警告,我正在给一个不再使用的局部变量(或函数参数)赋值。如果我用 % gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c 我完全没有得到任何警

下面的文件
foo.c
是我在代码中发现的一个更微妙的bug的简化版本

int b;

void bar(int a);

void foo(int a)
{
  bar(a);
  a = 42;
}
这行
a=42
实际上是我代码中的一个输入错误:我的意思是
b=42
。我不希望编译器检测到我输入了错别字,但我希望得到一个警告,我正在给一个不再使用的局部变量(或函数参数)赋值。如果我用

% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c
我完全没有得到任何警告。检查生成的代码表明未执行赋值
a=42
,因此
gcc
非常清楚该指令是无用的(因此可能是伪造的)。注释对
条(a)的调用
确实会产生警告
警告:参数“a”已设置但未使用[-Wunused but set parameter]
,因此,只要函数中的某个地方使用了
a
,即使在赋值之前,
gcc
似乎也不会发出警告

我的问题是:

  • 有没有办法告诉GCC或Clang针对此类情况发出警告?(即使删除了对
    bar
    的调用,我也无法让Clang3.0产生任何警告。)
  • 这种实际行为有什么原因吗?也就是说,在某些情况下,分配给将被优化器丢弃的局部变量实际上是可取的吗

  • 编译器将检测到这是死代码,并对其进行优化。如果您查看程序集列表(如果您告诉gcc进行优化),则会发现分配不存在。

    据我所知,没有
    gcc
    clang
    选项可以警告此无用的分配

    另一方面,
    PC Lint
    能够在这种情况下发出警告

    警告438未使用分配给变量“Symbol”的最后一个值-- 已分配给后来未使用的变量。这个 消息在return语句或语句末尾发出 当变量超出范围时阻塞


    将函数参数设为a
    const
    ,编译器会抱怨:
    void foo(int const a){/*…which…*/}
    @pmg:更改源代码不是一个选项:我想在现有代码库中检测类似的无用赋值。如原问题所述,我已经告诉
    gcc
    进行优化,我已经注意到作业已经优化了。问题是为什么编译器不让我知道我写了一些无用的东西,或者我如何配置它让我知道。你没有回答这个问题。他希望编译器在程序员没有注意到错误的情况下检测此类代码(因此不会深入研究清单文件)。