2012-10-11 5 views
4

mac os x에서 memchr()을 사용할 때 오버플로 문제가 발생합니다.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; 
} 

리눅스에 정상적으로, 즉 내 페도 (16), 및 t의 정확한 값을 출력한다. 그러나 Mac에서 동일한 코드를 실행하면 Segmentation Fault가 발생합니다 !!

(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로 디버깅 후, 나는 말을! memset 함수와 같은 다른 MEM 기능() 방어 적이기()가 잘 작동하는 동안

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

그래서 나는, 맥 OS에 memchr()의 비정상적인 행동에 혼란 스러워요.

어떻게 mac에서 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 버전을 강제로 사용하도록하십시오.

관련 문제