2013-03-19 39 views
0

我有一個小程序試圖模擬讀取(非標準)數據包標題並對其進行處理。奇怪的seg故障錯誤,gdb無益

我得到一個奇怪的賽格故障時,我用gdb運行的程序,經分析,我看到代碼執行完全和THEN給我一個「0x00000000 in ??()」。

我從來沒有見過這種錯誤之前,並沒有一個線索可能是什麼原因造成的。

我編寫的代碼gcc -g header.c -lcrypto -lssl

下面是代碼

#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 
#include"hash_list.c" 

void process(unsigned char header[48]); 

int main() 
{ 

    unsigned char header[48]; 
    unsigned short int responseCode_Fail = 255; 
    unsigned short int responseCode_Pass = 0; 
    unsigned short int packlen = 65000; 
    long long int packetnumber = 2345678; 

    memset(&header, 0, 96); 
    strcpy(header,"FILELST"); 
    memcpy(&header[8], &responseCode_Fail, sizeof(responseCode_Fail)); 
    memcpy(&header[10], &packlen, sizeof(packlen)); 
    memcpy(&header[16], &packetnumber, sizeof(packetnumber)); 

    unsigned char result[MD5_DIGEST_LENGTH]; 
    calcmd5("sample.txt", result); 
    memcpy(&header[32], &result, sizeof(result)); 

    process(header); 

    return 0; 
} 


void process(unsigned char header[48]) 
{ 
    unsigned short int responseCode; 
    unsigned short int packlen; 
    long long int packetnumber; 
    unsigned char md5hash[MD5_DIGEST_LENGTH]; 

    memcpy(&responseCode, &header[8], sizeof(responseCode)); 
    memcpy(&packlen, &header[10], sizeof(responseCode)); 
    memcpy(&packetnumber, &header[16], sizeof(packetnumber)); 
    memcpy(&md5hash, &header[32], sizeof(md5hash)); 
    printmd5(md5hash); 

    printf("CODE: %hu\n",responseCode); 
    printf("LEN: %hu\n",packlen); 
    printf("PNO: %lld\n",packetnumber); 
    if(strncmp(header, "LULZ?", 8) == 0) 
    { 
     printf("Recieved Peer query.\n"); 
    } 
    else if(strncmp(header, "LULZ.", 8) == 0) 
    { 
     printf("Recieved Peer query confirmation.\n"); 
    } 
    else if(strncmp(header, "FILELST", 8) == 0) 
    { 
     printf("Recieved File list\n"); 
    } 
    else if(strncmp(header, "DWNLOAD", 8) == 0) 
    { 
     printf("Recieved Download request.\n"); 
    } 
    else if(strncmp(header, "UPLOAD", 8) == 0) 
    { 
     printf("recieved upload from peer ?\n"); 
    } 
    else if(strncmp(header, "ERROR", 8) == 0) 
    { 
     printf("Recieved Error\n"); 
    } 
    else if(strncmp(header, "LIST", 8) == 0) 
    { 
     printf("Recieved Peer query for filelist.\n"); 
    } 

    return; 

} 

這是輸出我得到

4768bfdd77920fe0b4f25f173e568266 
CODE: 255 
LEN: 65000 
PNO: 2345678 
Recieved File list 
Segmentation fault (core dumped) 
+0

您是否使用調試信息構建? – 2013-03-19 21:52:08

+0

程序已經用-g標誌編譯。 @Quirliom請參閱編輯。 – ffledgling 2013-03-19 21:53:43

+3

'#include「hash_list.c」 - 請不要這樣做 – teppic 2013-03-19 22:04:38

回答

5
unsigned char header[48]; 

... 

memset(&header, 0, 96); 

這聽起來是錯誤的。