在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()的情况下运行测试?
感谢。
答案 0 :(得分:6)
函数memchr()
在string.h
中声明,在发布的代码中没有include指令。这意味着编译器(应发出警告)将生成一个隐式函数声明,返回int
。如果您的系统sizeof(int)
和sizeof(char*)
不同,这可能会解释问题。添加:
#include <string.h>
答案 1 :(得分:1)
您的代码应该确实有用。您的编译器可能正在使用mem ***()函数的内置版本。尝试包含string.h以强制使用libc版本。