在C和C++中,当比较不同大小的无符号整数时,如何才能收到警告?

2023年 8月 20日 111点热度 0人点赞 0条评论

C和C++中常见的一个错误源是如下代码:

size_t n = // ...
for (unsigned int i = 0; i < n; i++) // ...

unsigned int溢出时,循环可能会无限循环。

例如,在Linux中,unsigned int是32位,而size_t是64位,因此如果n = 5000000000,将会导致无限循环。

我该如何在使用GCC或Clang时收到有关此问题的警告?

GCC的-Wall-Wextra并不会发出警告:

#include <stdint.h>
void f(uint64_t n)
{
for (uint32_t i = 0; i < n; ++i) {
}
}
gcc-13 -std=c17 \
       -Wall -Wextra -Wpedantic \
       -Warray-bounds -Wconversion \
       -fanalyzer \
       -c -o 76840686.o 76840686.c

(没有输出)


  • 我寻找的解决方案不要求n是编译时常数。
  • 理想情况下,该解决方案应适用于现有的C/C++项目,无需完全重写项目。
  • 除了编译器警告之外,如果您能提供其他工具的建议也会很有帮助,但仅有编译器警告更好。

编辑:上游编译器功能请求

回答表明目前的编译器中没有此类警告。我已开始提交上游功能请求:

admin

这个人很懒,什么都没留下