段错误:C语言指针的地址越界

Segmentation fault : Address out of bounds for a pointer in C

本文关键字:指针 语言 地址 越界 错误 段错误      更新时间:2023-10-16

我正试图构建和运行一些由别人写的复杂代码,我不知道他们是谁,也不能要求他们帮助。该代码读取bpf(大脑潜能文件)并将其转换为可读的ascii格式。它有3个C文件和2个相应的头文件。我让它成功地构建与微小的变化,但现在它崩溃了有分段错误。

我将问题缩小到FindSectionEnd()(在ReadBPFHeader.c中),并发现当sscanline()(在文件sscanline .c中)被调用时发生错误(两者的代码如下)。

ui1定义为unsigned char。Si1定义为char。

在从sscanline()返回之前,dp指向的地址是0x7e5191,或者类似的以191结尾的地址。然而,在返回FindSectionEnd()时,dp指向0x20303035,并表示"地址0x20303035越界",这会导致strstr()出现错误。FindSectionEnd()中的循环在发生故障之前运行了14次迭代,没有问题。我不知道哪里出了问题。我真的希望我在这里提供的信息是足够的。

ui1 *FindSectionEnd(ui1 *dp)
{
    si1 Line[256], String[256];
    int cnt=0;
    while (sscanfLine(dp, Line) != EOF){
        dp = (ui1 *)strstr(dp, Line);
        dp+= strlen(Line);
        sscanf(Line,"%s",String);
        if(SectionEnd(String))
            return(dp);
    }
    return(NULL);
}
si1 *sscanfLine(ui1 *dp, si1 *s)
{
    int i = 0;
    *s = NULL;
    int cnt = 0;
    while (sscanf(dp, "%c", s + i) != EOF){
        cnt++;
        dp++;
        if(*(s + i) == 'n') {
            *(s + i + 1) = '';
            return s;
        }
        ++i;
    }
    *(s + i) = '';
    return s;
}

sscanfLine函数不尊重传入的缓冲区的大小,如果在前256字节内没有找到'n',则愉快地将Line数组旁边的堆栈丢弃。

你可以通过使Line更大来解决这个问题。

如果你要改进代码,你应该将缓冲区大小传递给sscanfLine,并使它在计数达到时停止,即使没有找到换行符。当您在这里时,而不是返回调用者已经拥有的s,使sscanfLine返回dp的新值,这将使调用者无需使用strstrstrlen

我的第一个猜测是,您的字符串不是null终止和strstr()分段错误,因为它读取超过数组的边界