版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/juewuer/article/details/81978914
问题
线上出现一个bug,把一个很大数赋值给一个32bit数导致,下面做了一个测试,对于这种溢出问题
测试代码
#include <stdio.h>
#define KK 1
int main()
{
unsigned int i,k,m;
unsigned int j= 1;
k=0x12345678*100;
i=j*0x12345678*100;
m=KK*0x12345678*100;
return 0;
}
pclint检查结果
--- Module: diy64.c (C)
1 /* Enter your 64-bit C code here - you can delete this line. */
2
3 #include <stdio.h>
4 #define KK 1
5 int main()
6 {
7 unsigned int i,k,m;
8 unsigned int j= 1;
9
_
10 k=0x12345678*100;
diy64.c 10 Warning 648: Overflow in computing constant for operation: 'multiplication'
11 i=j*0x12345678*100;
_
12 m=KK*0x12345678*100;
diy64.c 12 Warning 648: Overflow in computing constant for operation: 'multiplication'
_
13 return 0;
diy64.c 13 Warning 438: Last value assigned to variable 'i' (defined at line 7) not used
diy64.c 13 Warning 438: Last value assigned to variable 'k' (defined at line 7) not used
diy64.c 13 Warning 438: Last value assigned to variable 'm' (defined at line 7) not used
_
14 }
diy64.c 14 Warning 550: Symbol 'i' (line 7) not accessed
diy64.c 14 Warning 550: Symbol 'k' (line 7) not accessed
diy64.c 14 Warning 550: Symbol 'm' (line 7) not accessed
结论
- 只能针对确定性运算结果是常数提示,其中运算过程不能含有变量