簡體   English   中英

分段錯誤:C語言中的指針地址超出范圍

[英]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使用strstrstrlen

我的第一個猜測是,您的字符串不是null終止的,而strstr()segfaults是因為它讀取的是數組的邊界

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM