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时收到有关此问题的警告?
#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++项目,无需完全重写项目。
- 除了编译器警告之外,如果您能提供其他工具的建议也会很有帮助,但仅有编译器警告更好。
编辑:上游编译器功能请求
回答表明目前的编译器中没有此类警告。我已开始提交上游功能请求:
- GCC:添加警告标志以检查整数溢出