【发布时间】:2021-04-02 16:36:08
【问题描述】:
我这里有这个小sn-p:
static int32_t s_pow(int32_t base, int32_t exponent)
{
int32_t result = 1;
while (exponent != 0) {
if ((exponent % 2) == 1) {
result *= base;
}
exponent /= 2;
base *= base; /* <- this line */
}
return result;
}
小巧整洁,正是我需要的。 但是 GCC 7.5.0(和其他支持检查的新版本)抱怨:
gcc -I./ -Wall -Wsign-compare -Wextra -Wshadow -fsanitize=undefined\
-fno-sanitize-recover=all -fno-sanitize=float-divide-by-zero\
-Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wstrict-prototypes\
-Wpointer-arith -Wsystem-headers -O3 -funroll-loops -fomit-frame-pointer -flto -m64\
test.o -o test
test.c:25:12: runtime error: signed integer overflow: 65536 * 65536 cannot be represented in type 'int'
是的,GCC,这是正确的,承认 65536 * 65536 对于 31 位数据类型来说有点多,即使在 64 位环境中也是如此。但是输入来自一个小表,并且经过精心选择,结果result 不能超过2^20,因此没有一个中间结果可以。我不能只更改我的代码本身的消毒。是的,我检查了所有可能的结果。
有什么想法吗?还是我的代码?
【问题讨论】:
-
您是在声称您的代码实际上并未执行 65536 * 65536?如果是这样,运行时错误会提示其他情况,如果您看不到这种情况是如何发生的,也许可以使用调试器
标签: c integer-overflow gcc-warning