2012-10-11 22 views
4

當在mac os上使用memchr()時,遇到溢出問題x。爲什麼mac os上的memchr()會出現界限

這裏是我的測試代碼:

#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 
    char *content="http\r\nUser"; 
    int content_size = strlen(content); 
    char *contmem = malloc(content_size+1); 
    memset(contmem, '\0', content_size+1); 
    memcpy(contmem, content, content_size); 
    printf("%c\n", *(content+content_size)); 
    printf("%c\n", *(contmem+content_size)); 
    char *t = memchr(content, 't', content_size); 
    printf("%c\n", *t); 
    return 0; 
} 

它正常工作在Linux上,即我的Fedora 16,並打印T的正確值。 但是,當我在Mac上運行同一段代碼時,發生分段錯誤!

用gdb調試後,我拿俗話:

(gdb) print t 
$7 = 0xf4b <Address 0xf4b out of bounds> 

然後我試着重寫了memchr功能在這個測試文件:

static char* 
memchr(const char *data, int c, unsigned long len){ 
    char *tp = data; 
    unsigned long i; 
    for(i = 0; i<len; i++){ 
     if((int)*tp == c){ 
      return tp; 
     }else{ 
      tp = tp+1; 
     } 
    } 
} 

和輸出似乎是正確的!

(gdb) print t 
$1 = 0x100000f1d "ttp\r\nUser" 

所以我很困惑與MAC OS了memchr()的異常行爲,而其他MEM功能,如memset的()的memcpy()工作正常。

如何在不重寫memchr()的情況下運行測試?

謝謝。

+0

您的替代品具有未定義的行爲(即,如果到達緩衝區末尾沒有找到目標字節,則沒有「返回」)。 –

+0

此代碼在我的Mac上正常工作。 –

回答

5

函數memchr()string.h中聲明,對此,在發佈的代碼中沒有include指令。這意味着隱式函數聲明將由編譯器生成(它應該發出警告),它將返回一個int。如果sizeof(int)sizeof(char*)與您的系統不同,則可能會解釋問題。添加:

#include <string.h> 
+0

是的,這包括消除溢出錯誤!謝謝。但memchr()的隱式操作仍令我困惑,內置版本和glibc版本之間有什麼區別? – caesar0301

1

您的代碼應該確實有效。您的編譯器可能正在使用mem ***()函數的內置版本。嘗試包含string.h以強制使用libc版本。

相關問題