Valgrind сообщает об ошибке при печати выделенных строк - PullRequest
6 голосов
/ 03 ноября 2011

Код здесь:

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

int main()
{
    char* buf = malloc(3);
    strcpy(buf, "hi");
    printf("%s\n", buf);
    free(buf);
}

Он скомпилирован с:

gcc a.c && valgrind ./a.out

Сообщение об ошибке здесь:

==1421== Memcheck, a memory error detector
==1421== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==1421== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==1421== Command: ./a.out
==1421== 
==1421== Invalid read of size 8
==1421==    at 0x4EA96C1: ??? (in /lib/libc-2.14.1.so)
==1421==    by 0x4E92D3B: puts (in /lib/libc-2.14.1.so)
==1421==    by 0x4005BB: main (in /home/peter/a.out)
==1421==  Address 0x51b4040 is 0 bytes inside a block of size 3 alloc'd
==1421==    at 0x4C2740D: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1421==    by 0x400595: main (in /home/peter/a.out)
==1421== 
hi
==1421== 
==1421== HEAP SUMMARY:
==1421==     in use at exit: 0 bytes in 0 blocks
==1421==   total heap usage: 1 allocs, 1 frees, 3 bytes allocated
==1421== 
==1421== All heap blocks were freed -- no leaks are possible
==1421== 
==1421== For counts of detected and suppressed errors, rerun with: -v
==1421== ERROR SUMMARY: 2 errors from 1 contexts (suppressed: 6 from 6)

Это также очень страннотот valgrind не сообщает больше ошибок, если я использую следующее (только еще один пробел):

printf("%s \n", buf);

Кто-нибудь, пожалуйста, помогите мне?

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011

Это ошибка, но не воспроизводимая на всех машинах.

На некоторых машинах gcc оптимизирует простые printf(), например, puts(), что может привести к недопустимому чтению (или просто так считает valgrind).

Если это действительно имеет значение, вы можете «усложнить» формат printf. Пробел между %s и \n подойдет.

Вот похожая ошибка: C-строки, strlen и Valgrind

Этот ответ объединяет комментарии в обсуждении. Спасибо всем!

0 голосов
/ 03 ноября 2011

Я запустил его на своей машине и не получаю ошибок:

==61755== Memcheck, a memory error detector
==61755== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==61755== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info
==61755== Command: ./a.out
==61755==
hi
==61755==
==61755== HEAP SUMMARY:
==61755==     in use at exit: 0 bytes in 0 blocks
==61755==   total heap usage: 1 allocs, 1 frees, 3 bytes allocated
==61755==
==61755== All heap blocks were freed -- no leaks are possible
==61755==
==61755== For counts of detected and suppressed errors, rerun with: -v
==61755== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
...