我正在尝试构建并运行一些由其他人编写的复杂代码,我不知道他们是谁,也无法请求他们提供帮助。该代码读取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;
}
答案 0 :(得分:1)
sscanfLine
函数不考虑传入的缓冲区的大小,如果它在前256个字节中找不到'\n'
,则很高兴地将堆栈拖到{{1}旁边数组。
您可以通过使Line
更大来解决此问题。
如果您要改进代码,则应将缓冲区大小传递给Line
,并在达到计数时使其停止,即使未找到换行符也是如此。当您使用它时,不是返回调用者已经拥有的sscanfLine
,而是s
返回sscanfLine
的新值,这将使调用者无需使用{{ 1}}和dp
。
答案 1 :(得分:0)
我的第一个猜测是你的字符串不是null终止而strstr()是segfaults因为它读取了数组的边界