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

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

ui1定义为无符号字符。
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;
}

最佳答案

sscanfLine函数不考虑传入缓冲区的大小,并且如果在前256个字节内未找到'\n',则愉快地丢弃Line数组旁边的堆栈。

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

如果要改进代码,则应将缓冲区大小传递给sscanfLine,并在达到计数时停止它,即使未找到换行符也是如此。在执行此操作时,不必返回调用者已经拥有的s,而是让sscanfLine返回dp的新值,这将使调用者免于使用strstrstrlen的麻烦。

关于c++ - 段错误:C中指针的地址超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16344829/

10-12 01:20