5

在 mac os x 上使用 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() 工作正常。

如何在不重写 mac 上的 memchr() 的情况下运行测试?

谢谢。

4

2 回答 2

6

该函数memchr()在 中声明string.h,发布的代码中没有包含指令。这意味着编译器将生成一个隐式函数声明(它应该发出警告),它返回一个int. 如果您的系统上的sizeof(int)sizeof(char*)不同,这可以解释问题。添加:

#include <string.h>
于 2012-10-11T09:03:42.387 回答
1

您的代码确实应该可以工作。您的编译器可能正在使用 mem***() 函数的内置版本。尝试包含 string.h 以强制使用 libc 版本。

于 2012-10-11T09:02:42.920 回答