我正在尝试构建和运行由其他人编写的一些复杂代码,但我不知道他们是谁,也无法要求他们提供帮助。该代码读取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
的新值,这将使调用者免于使用strstr
和strlen
的麻烦。
关于c++ - 段错误:C中指针的地址超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16344829/