El valgrind informa de un error al imprimir las cadenas asignadas

El código está aquí:

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

Se comstack con:

 gcc ac && valgrind ./a.out 

El mensaje de error está aquí:

 ==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) 

También es muy extraño que valgrind no informe más errores si uso lo siguiente (solo un espacio más):

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

¿Alguien por favor me ayudaría?

Este es un error, pero no reproducible en todas las máquinas.

En algunas máquinas, gcc optimiza printf() simple con, por ejemplo, puts() , lo que podría implicar una lectura no válida (o simplemente valgrind cree que sí).

Si realmente importa, puede “complicar” el formato de printf . Un espacio entre %s y \n haría.

Aquí hay un error similar: C strings, strlen y Valgrind

Esta respuesta combina comentarios en la discusión. ¡Gracias a todos!

Lo ejecuté en mi propia máquina y no obtengo errores:

 ==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)