-1

我在下面尝试了这个示例,以找出 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();
}
4

1 回答 1

2

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

read(fd,buffer,-1);

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

read(fd,buffer,0xFFFFFFFF);
于 2013-09-10T18:28:26.903 回答