Así que me he estado enseñando a mí mismo C, y con la esperanza de aprender a administrar la memoria correctamente desde el principio y escribir mejor código, he estado ejecutando Valgrind en todo. Esto me ha ayudado con fugas de memoria, pero parece que no puedo deshacerme de esto. "El salto o movimiento condicional depende de los valores no inicializados/El valor no inicializado fue creado por una situación de asignación de montón", aunque lo he reducido a este bloque de código:¿Podría valgrind queja sobre valores no inicializados ser un falso positivo?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char* test = (char*) malloc(3);
strncpy(test, "123", 2);
printf("%s\n", test);
free(test);
return 0;
}
Cuando corro con Valgrind ---track-origins=yes
, consigo esta salida:
==91702== Conditional jump or move depends on uninitialised value(s)
==91702== at 0x100011507: strlen (mc_replace_strmem.c:282)
==91702== by 0x1000AA338: puts (in /usr/lib/libSystem.B.dylib)
==91702== by 0x100000EFA: main (valgrind_test.c:10)
==91702== Uninitialised value was created by a heap allocation
==91702== at 0x100010345: malloc (vg_replace_malloc.c:236)
==91702== by 0x100000EEA: main (valgrind_test.c:8)
este parece ser un falso positivo para mí, pero no soy lo suficientemente seguro de mi poseer el conocimiento para escribirlo como tal. Tal vez estoy asignando mal o usando strncpy mal? No estoy seguro.
Gracias de antemano
Su cadena no tiene terminador, por lo que valgrind probablemente tenga razón cuando se queja. –
Usando snprintf aquí sería mejor en mi humilde opinión. snprintf (prueba, 3, "123"); – puffadder