分段错误:在C中指出超出指针的范围

时间:2013-05-02 18:07:51

标签: c++ c segmentation-fault

我正在尝试构建并运行一些由其他人编写的复杂代码,我不知道他们是谁,也无法请求他们提供帮助。该代码读取bpf(脑潜在文件)并将其转换为可读的ascii格式。它有3个C文件和2个相应的头文件。我通过微小的改动成功地构建了它,但现在它崩溃了 有分段错误。

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

ui1被定义为unsigned char。 si1定义为char。

在从sscanfLine()返回之前,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) = '\0';
            return s;
        }
        ++i;
    }
    *(s + i) = '\0';
    return s;
}

2 个答案:

答案 0 :(得分:1)

sscanfLine函数不考虑传入的缓冲区的大小,如果它在前256个字节中找不到'\n',则很高兴地将堆栈拖到{{1}旁边数组。

您可以通过使Line更大来解决此问题。

如果您要改进代码,则应将缓冲区大小传递给Line,并在达到计数时使其停止,即使未找到换行符也是如此。当您使用它时,不是返回调用者已经拥有的sscanfLine,而是s返回sscanfLine的新值,这将使调用者无需使用{{ 1}}和dp

答案 1 :(得分:0)

我的第一个猜测是你的字符串不是null终止而strstr()是segfaults因为它读取了数组的边界