由于有符号和无符号数字的混合,我在下面尝试了这个例子来找出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();
}
答案 0 :(得分:2)
read
的第三个参数是size_t
,它是无符号的。 -1在32位机器上编码为0xFFFFFFFF(或稀有机器上的0xFFFFFFFE)。当您将“小”负整数传递给无符号整数时,您将获得一个非常大的值。这些行是等价的
read(fd,buffer,-1);
和
read(fd,buffer,(unsigned long)-1);
和
read(fd,buffer,0xFFFFFFFF);