Неверный размер чтения в strcasestr - PullRequest
1 голос
/ 01 февраля 2012

следующий код:

#include <stdlib.h>
#include <string.h>

int main() {
    char *s = strdup("keep-alive");
    if(strcasestr(s, "close")) {
    }
    free(s);
    return 0;
}

выдает следующую ошибку в Valgrind:

==13183== Invalid read of size 8
==13183==    at 0x4F53F94: __strcasestr_sse42 (emmintrin.h:685)
==13183==    by 0x4005BF: main (in /home/aaron/dev/strtest)
==13183==  Address 0x51ce048 is 8 bytes inside a block of size 11 alloc'd
==13183==    at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==13183==    by 0x4EB1441: strdup (strdup.c:43)
==13183==    by 0x4005A5: main (in /home/aaron/dev/strtest)

Кто-нибудь еще видел это? Это происходит с оптимизацией и без нее, используя gcc 4.6.1.

1 Ответ

2 голосов
/ 01 февраля 2012

Если это происходит только в valgrind, это не ошибка. Было бы неопределенным поведением для вашего кода читать после конца объекта, полученного malloc, но strcasestr является частью "реализации" и, таким образом, может использовать знания, специфичные для реализации: в этом В этом случае перечитывание является абсолютно безопасным, если вы не пересекаете границу страницы.

...