在特定变量上禁用GCC“可以在未初始化的情况下使用”

olhwl3o2  于 2022-11-13  发布在  其他
关注(0)|答案(5)|浏览(151)

我在堆栈变量上收到以下警告:

warning: object.member may be used uninitialized in this function

在这种情况下,我不希望强制初始化来消除警告,因为它会消耗CPU周期。变量是POD结构,因此对其执行memset不是零成本。我可以验证该变量从未在未初始化的情况下使用,因此我只想抑制它的警告。
一般来说,我确实想要警告,只是在这个特定的场景中,不在这个特定的变量上。我如何抑制警告?
看起来pragma诊断是正确的方法,但是它们需要相当新版本的GCC(4.6)
在该版本之前没有已知的可接受解决方案。

lawou6xi

lawou6xi1#

请尝试执行以下操作:

#pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */

这个pragma有三种有趣且有用的形式:warningerrorignored。请参阅6.56.10 Diagnostic Pragmas了解它们的用法。链接内容如下:

**GCC允许用户有选择地启用或禁用某些类型的诊断,并更改诊断的种类。**例如,项目的策略可能要求所有源代码都使用-Werror进行编译,但某些文件可能具有允许特定类型警告的异常。或者,项目可能有选择地启用诊断,并根据定义的预处理器宏将其视为错误。

rta7y2nd

rta7y2nd2#

公认的答案有两个大问题,需要更多的注解。首先,它取消了整个文件的警告。如果该pragma驻留在一个头文件中,可能更多。警告是有用的,如果它确实是一个误报,人们应该禁用一堆代码的警告尽可能小。
那么OP中的警告是“maybe uninitialized”,它由-Wmaybe-uninitialized(与-Wuninitialized相反)停用。

#pragma GCC diagnostic push                             // save the actual diag context
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"  // disable maybe warnings
function() or int variable;                             // impacted section of code
#pragma GCC diagnostic pop                              // restore previous diag context
ztmd8pv5

ztmd8pv53#

GCC区分未初始化和自初始化,例如编译:

int main() {
   int i = i;
   return i;
}

使用gcc -Wall -Wextra不会给出任何警告,除非您也显式添加了-Winit-self,但通过我的快速测试,它已经完全优化了。

mdfafbf1

mdfafbf14#

@Nawaz已经回答了这个问题,但是您是否考虑过,您需要这样做的事实可能表明您过早地声明了struct/在一个不适当的嵌套作用域中声明了struct?通常,如果您能够在可以实际初始化它的位置声明struct,而不是更早地声明它并在不同的位置填充它,那将是更好的选择。
而且,即使你可以确认它从未在未初始化的情况下使用过,如果将来有人添加了一个新的代码路径,而它没有正确初始化,该怎么办?如果你禁用了警告,它将在无提示的情况下编译,并可能以一种意想不到的方式中断。除非你能证明初始化占用了你程序的CPU的可测量的量,否则最好是提前进行初始化。

相关问题