Linux 2.6.36.4、GCC 4.7.2,收到大量“变量设置但未使用”警告

Linux 2.6.36.4、GCC 4.7.2,收到大量“变量设置但未使用”警告

我正在尝试在默认运行 3.5 内核的 Linux Mint 14 上编译 Linux 内核 2.6.36.4。使用 gcc 版本 4.7.2。尝试用谷歌搜索,但不太成功。警告是:

warning: variable ‘gfp’ set but not used [-Wunused-but-set-variable]

我在整个汇编中都有大量这样的警告。编译根本不会在任何地方失败。最糟糕的是编译后的内核也无法成功启动。

我还需要设置更多 gcc 选项吗?或者我应该忽略它?

注意:我正在开发 virtualbox。库存内核工作得很好。

答案1

“变量已设置但未使用”警告仅供参考。

根据官方文档-Wunused-but-set-variable控制以下行为:

每当局部变量被分配但未使用时(除了其声明之外),都会发出警告。此警告由 启用-Wall

目的是捕获程序员将值分配给变量然后不再对其执行任何操作的情况。内核相当特殊,因为在低级操作系统编程的深渊中,即使我可以想象做这样的事情可以完全合法甚至是的情况必要的达到您想要的结果。

如果变量赋值语句确实不需要,编译器可能会优化它。

最重要的是,除非您是开发人员,否则忽略此类警告应该是安全的。如果您是开发人员,您应该考虑是否有必要进行分配。如果对非 GCC 编译器的可移植性不是优先考虑的事项,请考虑__attribute__((unused))在声明中添加 来抑制该变量的警告;也可以看看变量属性

答案2

或者我应该忽略它?

未使用的变量可以是编码错误的指示。如果您确信情况并非如此,并且想要抑制特定变量的警告,您可以使用(海湾合作委员会特定)__attribute__标签,例如:

/* Unused parameter (in definition, not declaration): */
void somefunc (int x __attribute__ ((unused))) {
    [...]
}

/* Unused variable. */
int x __attribute__ ((unused));
/* But set... */
x = 1;

如果您正在实现 API,第一种情况并不罕见——例如,编写一个忽略参数的回调,但必须与回调签名匹配。第二种情况似乎有点矛盾,但如果您已经声明并设置了尚未使用的内容并且不想被警告等分散注意力,则可能暂时有用。

这可能比关闭-Wunused-parameter和/或更好-Wunused-but-set-variable

相关内容