[英]Segmentation fault : Address out of bounds for a pointer in C
我正在嘗試構建和運行由其他人編寫的一些復雜代碼,但我不知道他們是誰,也無法要求他們提供幫助。 該代碼讀取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
並在達到計數時停止它,即使未找到換行符也是如此。 在使用它時,使sscanfLine
返回新的dp
值,而不是返回調用者已經擁有的s
,這將使調用者sscanfLine
使用strstr
和strlen
。
我的第一個猜測是,您的字符串不是null終止的,而strstr()segfaults是因為它讀取的是數組的邊界
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.