Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: kuni2006 en 26 Agosto 2016, 19:13 PM

Título: Ayuda urgente error en valgrind
Publicado por: kuni2006 en 26 Agosto 2016, 19:13 PM
Yo hice la siguiente funcion:


int comparar(int vector1[], int n1, int vector2[], int n2)
{
    int i;
    if (n1 == 0 && n2 != 0)
        {
        return -1;
        }
    if  (n2 == 0 && n1 != 0)
        {
        return 1;
        }
    for(i=0;i<n1||i<n2;i++)
        {
        if(vector1[i]<vector2[i])
            {
            return -1;
            }
        if(vector1[i]>vector2[i])
            {
            return 1;
            }
        if(vector1[i]==vector2[i]&&n1==n2)
            {
            return 0;
            }
        }
    return 0;
}


y me devuelve el siguiente error varias veces:

==22== Conditional jump or move depends on uninitialised value(s)
==22==    at 0x400738: comparar (tp0.c:67)
==22==    by 0x400DEB: prueba_comparar (tp0_pruebas.c:80)
==22==    by 0x400558: main (tp0_pruebas.c:147)
==22==  Uninitialised value was created by a stack allocation
==22==    at 0x400B20: prueba_comparar (tp0_pruebas.c:48

Si alguien me pudiera dar una mano, estaria muy agradecido.
Título: Re: Ayuda urgente error en valgrind
Publicado por: avesudra en 27 Agosto 2016, 04:46 AM
Hola, el error que te da valgrind es claro, no inicializas la variable i cuando la declaras. Así que con esto debería arreglarse:
Código (cpp) [Seleccionar]
int comparar(int vector1[], int n1, int vector2[], int n2)
{
   int i = 0; //esto es lo que debes modificar
   if (n1 == 0 && n2 != 0)
       {
       return -1;
       }
   if  (n2 == 0 && n1 != 0)
       {
       return 1;
       }
   for(i=0;i<n1||i<n2;i++)
       {
       if(vector1[i]<vector2[i])
           {
           return -1;
           }
       if(vector1[i]>vector2[i])
           {
           return 1;
           }
       if(vector1[i]==vector2[i]&&n1==n2)
           {
           return 0;
           }
       }
   return 0;
}
Título: Re: Ayuda urgente error en valgrind
Publicado por: palacio29 en 27 Agosto 2016, 04:50 AM
Cita de: kuni2006 en 26 Agosto 2016, 19:13 PM
Yo hice la siguiente funcion:


int comparar(int vector1[], int n1, int vector2[], int n2)
{
    int i;
    if (n1 == 0 && n2 != 0)
        {
        return -1;
        }
    if  (n2 == 0 && n1 != 0)
        {
        return 1;
        }
    for(i=0;i<n1||i<n2;i++)
        {
        if(vector1[i]<vector2[i])
            {
            return -1;
            }
        if(vector1[i]>vector2[i])
            {
            return 1;
            }
        if(vector1[i]==vector2[i]&&n1==n2)
            {
            return 0;
            }
        }
    return 0;
}


y me devuelve el siguiente error varias veces:

==22== Conditional jump or move depends on uninitialised value(s)
==22==    at 0x400738: comparar (tp0.c:67)
==22==    by 0x400DEB: prueba_comparar (tp0_pruebas.c:80)
==22==    by 0x400558: main (tp0_pruebas.c:147)
==22==  Uninitialised value was created by a stack allocation
==22==    at 0x400B20: prueba_comparar (tp0_pruebas.c:48

Si alguien me pudiera dar una mano, estaria muy agradecido.

Como dijeron te falta inicializar variable, en algunos compiladores como el codeblocks no te pide que inicialices pero si es necesario hacerlo si vas a usar la variable en un arreglo o si lo que estas haciendo es un contador porque no sabes el valor que puede tener esa variable.
Título: Re: Ayuda urgente error en valgrind
Publicado por: do-while en 27 Agosto 2016, 08:35 AM
A la variable i le asignas un valor al principio del bucle for y sólo la utilizas dentro del bucle, por lo que ese no debería de el problema.

Hasta donde conozco valgrind (que es más bien poco o nada), lo que hace es buscar fugas de memoria en tus programas, pero por lo que comentas también debe de hacer el seguimiento de las variables que utilizas.

El error que estas recibiendo, si buscas en Google o incluso si utilizas un traductor, que cuesta bien poco, lo sabrías, es sobre la utilización de una variable sin inicializar en la evaluación de una condición. Asumiendo que valgrind hace un seguimiento de las variables, si descartamos la variable i nos quedan las cuatro variables que recibe la función. Asegúrate de haberles asignado un valor, ya sea por una asignación o una lectura, entre el momento de su declaración y el momento en el que llamas a la función. Sin ver más código no podemos decir nada más. Salvo que la variable que está dando problemas está en la línea 48 del archivo tp0_pruebas.c, dentro de la función pruebas_comparar:

==22==  Uninitialised value was created by a stack allocation
==22==    at 0x400B20: prueba_comparar (tp0_pruebas.c:48