欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软件安全(程序代码经常出现的小错误)(一)

程序员文章站 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;
}

改正后输出结果:
软件安全(程序代码经常出现的小错误)(一)