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()の異常な動作と混同されますが、memset()memcpy()などの他のmem関数は正常に機能します。

Macでmemchr()を書き直さずにテストを実行するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

6

関数memchr()はで宣言されstring.hていますが、投稿されたコードにはincludeディレクティブがありません。これは、暗黙の関数宣言がコンパイラによって生成されることを意味します(これは警告を発するはずです)。これは。を返しますintsizeof(int)システムでとsizeof(char*)が異なる場合、これが問題を説明している可能性があります。追加:

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

あなたのコードは確かに機能するはずです。コンパイラは、組み込みバージョンのmem ***()関数を使用している可能性があります。string.hをインクルードして、libcバージョンの使用を強制してみてください。

于 2012-10-11T09:02:42.920 に答える