例如:
在这种情况下我希望得到编译器警告。
这可能吗?
#include <stdio.h>
int main(void)
{
char i;
int count = 555;
for(i = 0; i < count; i++)
printf("%d\n", i);
return 0;
}
最佳答案
因为这里的核心问题是整数溢出/赋值超出范围。如果 char
被签名,那么它是运行时实现定义或未定义的行为,而不是编译器真正的事情。 (不幸的是)最终 C 程序员有责任了解并发现代码中所有形式的定义不明确的行为。
编译器的诊断能力也往往很差,它们的工作是检查您的代码是否有效 C 并通知您是否无效。如果你幸运的话,他们可能还会提醒你常见的错误和未定义的行为,但这不是你可以指望的,这只是一个额外的好处。
关于隐式提升,gcc中有-Wconversion
,但这个选项非常不稳定且不可靠。在您的情况下,它不会发出警告,而在其他情况下,它会发出错误的警告。
最好的选择是使用称为“静态分析器”的外部工具。它们与编译器类似,但专注于查找有问题的代码和错误。有一些开源工具,例如 clang-tidy 和 Frama-C,但大多数此类工具都是商业的。
此类静态分析器的一种是“MISRA 检查器”,用于验证是否符合 MISRA C 准则。 MISRA C 的一个重要部分致力于查找隐式升级/意外类型更改错误,因此在这种情况下,我建议使用 MISRA C 静态分析器。
关于c - 有没有办法获得有关整数提升的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75534405/