有符号和无符号变量的混合

时间:2013-09-10 18:06:00

标签: c

由于有符号和无符号数字的混合,我在下面尝试了这个例子来找出C中的安全问题。

在下面的代码中,由于长度为负值,我无法理解腐败是如何发生的。

read()将尝试读取文件的loc -1。因此有这样的溢出:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>

int fd;

int get_length(){
    fd = open("hello.txt",O_RDWR);
    return -1;
}

int read_data(){
    int length,n;
    char buffer[1024];
    printf("\n read_data() \n");
    length = get_length();
    if(length > 1024){
        perror("\n Big file! \n");
        return 0;
    }
    //printf("\n %d \n",length);
    read(fd,buffer,length);
    printf("\n %s \n",buffer);
    return length;
}

int main(){
    read_data();
}

1 个答案:

答案 0 :(得分:2)

read的第三个参数是size_t,它是无符号的。 -1在32位机器上编码为0xFFFFFFFF(或稀有机器上的0xFFFFFFFE)。当您将“小”负整数传递给无符号整数时,您将获得一个非常大的值。这些行是等价的

read(fd,buffer,-1);

read(fd,buffer,(unsigned long)-1);

read(fd,buffer,0xFFFFFFFF);