ubuntu32bit上的分段错误(核心转储)

时间:2015-11-19 14:21:18

标签: c ubuntu gcc

用gcc编译器编译给定的程序后,我尝试在我的ubuntu机器上运行这个程序,但我收到一条错误消息:分段错误(核心转储),但是当我编译/运行时在我的Windows机器上的devc ++上的相同程序它完美地工作。好吗?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof( char *str)
{
    char buffer [24];
    strcpy(buffer , str);
    return 1;
}

int main (int argc , char **argv)
{
    char str[517];
    FILE *badfile ;
    badfile = fopen (" badfile ", "r");
    fread(str , sizeof(char), 517, badfile);
    bof(str);
    printf(" Returned properly \n");
    return 1;
}

1 个答案:

答案 0 :(得分:3)

您从str复制,最大可达517字节,大小为buffer,大小仅为24字节。

因此,如果您读入的字符串超过24个字节,则您将buffer的末尾复制到不属于它的内存中。那是undefined behavior,这意味着程序可能崩溃,它可能看起来工作正常,或者它可以显示其他看似随机的行为。

您需要确保不要覆盖数组的边界:

// first zero out the buffer, since strncpy doesn't necessarily NULL terminate
memset(buffer, 0 sizeof(buffer));
strncpy(buffer, str, sizeof(buffer) - 1);

编辑:

正如iharob所提到的,从文件读入的数据不会被NULL终止,因此调用strcpy可以读取str的结尾。所以你也需要解决这个问题:

int main (int argc , char **argv)
{
    char str[517];
    FILE *badfile ;
    badfile = fopen ("badfile", "r");
    if (!badfile) {
        perror("fopen failed");
        exit(1);
    }
    // read in 1 byte less than the buffer size, and capture the return value
    int len = fread(str , sizeof(char), sizeof(str)-1, badfile);
    if (len == -1) {
        perror("fread failed");
        fclose(badfile);      // don't forget to close on error
        exit(1);
    } else {
        // add the NULL terminator
        str[len]='\0';
    }
    bof(str);
    printf(" Returned properly \n");
    fclose(badfile);       // don't forget to close
    return 1;
}