-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

の 3 番目の引数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 に答える