软件安全(程序代码经常出现的小错误)(一)
程序员文章站
2022-04-06 18:48:07
...
1、
#include<stdio.h>
int main()
{
int i = -3;
unsigned short ui = i;
printf("%d\n",ui);
//改正方法:去掉unsigned,加强制类型转换
short ui2 = (short)i;
printf("%d\n",ui2);
//但是i的值最大只能为-32768,在-32769之后仍会出错
int i2 = -32769;
unsigned short ui3 = i2;
printf("%d\n",ui3);
short ui4 = (short)i2;
printf("%d\n",ui4);
//无unsigned时几个特殊值输出情况
short si1 = -32768,si2 = -32769,si3 = -65535,si4 = -65536,si5 = 32769;
printf("%d,%d,%d,%d,%d\n",si1,si2,si3,si4,si5);
return 0;
}
输出结果:
2、
#include<stdio.h>
int main()
{
char c1 = 'a';
char c2 = 'b';
int c3 = c1 + c2;
printf("%d,%d\n",c1,c2);
printf("%c,%c\n",c1,c2);
printf("%d\n",c3);
printf("%c\n",c3);
short s1 = 32700,s2 = 32700;
int s3 = s1 + s2;
printf("%d\n",s3);
return 0;
}
输出结果:
3、临时变量赋值
将long改为long long或者是加强制类型转换,效果都不理想,都可能出现溢出,希望有大神帮忙指出怎么改。
#include<stdio.h>
long foo(int x,int y)
{
long result = x * y;//可能会出现溢出
return result;
}
int main()
{
int a = 2000;
int b = 2000;
printf("%d,%d\n",a,b);
long res = foo(a,b);
printf("%ld\n",res);
return 0;
}
4、正数截断
a最大为32767时,可输出想要的结果,每+1,则从-32768开始+1
unsigned short范围:0~65535
short范围:-32768~32767
#include<stdio.h>
int main()
{
unsigned short int a = 32768,a2 = 32767;
short int i = a,i2 = a2;
printf("%d,%d\n",i,i2);
a = 65535;
i = a;
printf("%d\n",i);
return 0;
}
输出结果:
5、整数溢出
unsigned int范围:0~4294967295(0~231-1)
int范围:-2147483648~2147483647(-231~231-1)
#include<stdio.h>
int main()
{
int bigint = 2147483647;
printf("%d\n",++ bigint);
unsigned int z = 0;
printf("%u\n",--z);
return 0;
}
输出结果:
6、整型比较
#include<stdio.h>
#define ULONG_MAX 4294967295 //unsigned int范围的最大值
int main()
{
unsigned int i = ULONG_MAX;
int c = -1;
printf("%d\n",c==i);
//输出结果为1,表示i等于c,原因是判断两者是否相等时,i转变为int类型,为-1
printf("i:%d\n",i);
return 0;
}
输出结果:
7、循环问题
#include<stdio.h>
int main()
{
unsigned short s = 4;
while(--s >= 0)
{
printf("%d\n",s);
}
return 0;
}
输出结果: 死循环
这个题我们想要的结果是循环4次,但是实际上是死循环,原因s为unsigned short类型,所以当s减为0时,再减就变成65535了。
改正方法:–s >= 0变为s-- > 0,正好循环4次。
#include<stdio.h>
int main()
{
unsigned short s = 4;
printf("改正后:\n");
while(s-- > 0)
{
printf("%d\n",s);
}
return 0;
}
改正后输出结果:
上一篇: 微信小程序实现滚动消息通知的示例