是否有任何类别来表征警告?

dhe*_*ein 2 c compiler-construction compiler-warnings

我对C-Code中编译器警告的实际假设实际上是它们警告实现定义的行为类型,或者它们检测到导致未定义行为的构造的情况,然而它们支持它们(如果它们检测到并且不会他们会因为警告而抛出错误.

在我讨论了这个之后,最后证明我错了是这样的:

#include <whatever_this_needs.h>

int main()
{
    int i = 50;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

明显警告的编译器i已声明但从未使用过.我不再考虑这种警告,因为我更多地将它们视为一种工具......一种信息.

虽然我会严格地将这种警告从警告我的事情中发出警告,在没有显式强制转换的情况下导致不可移植性或丢弃重要性,但它仍然会引起编译器优化的混乱.

所以我现在感兴趣:是否有任何警告类型的分类?如果没有关于它的标准,有哪些类别,海湾合作委员会将其警告分组?

到目前为止我注意到了(经验再次):

  • 警告:
    • 实现/未定义的行为
    • 不必要的代码(针对优化)
    • 打破可选标准(即MISRA或POSIX)

但特别是第二点困扰我,因为有一些结构(即严格的别名规则),其中优化甚至可能导致不可预测的运行时行为,而大多数情况下它只是削减了无论如何都没有使用的代码.

我的观点是否正确?还有哪些(额外的)官方类别可以"强制"警告,它们的特征是什么,它们的影响是什么?

Lun*_*din 5

警告超出了C标准的范围,因此对于它们的行为方式没有要求或规范.C标准仅关注诊断,如编译器到程序员的诊断消息.该标准不会将其分解为错误和警告.

但是,所有编译器都使用错误来指示直接违反C标准:语法错误等.他们使用警告指出超出C标准要求的内容.

几乎在所有情况下,警告只是意味着"顺便说一下,你有一个错误".


关于海湾合作委员会(见此),它只是在以下方面对警告进行分类:

  • 直接违反C标准但有效作为非标准GNU扩展的内容(-pedantic)
  • "少数警告"(-Wall).启用所有警告,但有些警告...
  • "更多警告"(-Wextra)
  • 还有许多个别警告,没有类别.

系统背后没有明显的逻辑.

请注意,GCC被填充到非标准扩展的边缘,已决定仅针对某些C标准违规发出警告而不是错误.因此,如果您关心标准合规性,请始终使用-pedantic-errors进行编译.

关于实现定义的行为:C包含很多这样的内容,如果你得到每个这样的情况的警告("警告:使用了两个补充int"......),它将变得非常繁琐.实现定义的行为和编译器警告之间没有关系.

对于任何未定义行为的情况,编译器通常无法检测到它,因为UB的定义是超出标准范围的运行时行为.因此,了解和避免UB的责任在于程序员.