2

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

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

ui1 被定义为无符号字符。si1 被定义为字符。

就在从 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;
}
4

2 回答 2

1

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

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

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

于 2013-05-02T18:17:45.643 回答
0

我的第一个猜测是你的字符串不是空终止的并且 strstr() 段错误,因为它读取了数组的边界

于 2013-05-02T18:11:47.910 回答