c - 有没有办法获得有关整数提升的警告?

标签 c gcc gcc-warning

例如:

在这种情况下我希望得到编译器警告。

这可能吗?

#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/

相关文章:

c - EOF 读取 C/C++

c - 请求分页上下文中的神秘数字 '63'

gcc - AT90USB162 (Minimus AVR) 上的 CDC 演示 COM 端口代码

c - 如何为您的程序分配更多内存(GCC)

c - 线程函数应该返回 0 吗?

c - 为什么 gcc -Wall 会发出有关零长度格式字符串的警告?

c - 静态函数和内联函数是否应该在 .h 文件中定义?

c - 如何查找由于信号 SIGSEGV、Segmentation failure 导致的错误?

c - Linux 上的 Breakpad 测试示例错误

c++ - GCC -Wuninitialized 不警告未初始化的结构