Las diferentes formas de supresión de 'advertencias variables sin inicializar' en C

red0ct:

Me he encontrado con múltiples usos de la uninitialized_var()macro diseñada para deshacerse de advertencias como:

warning: ‘ptr’ is used uninitialized in this function [-Wuninitialized]

Para GCC ( <linux/compiler-gcc.h>) se define de tal manera:

/*
 * A trick to suppress uninitialized variable warning without generating any
 * code
 */
#define uninitialized_var(x) x = x

Pero también descubrí que <linux/compiler-clang.h>tiene la misma macro se define de una manera diferente:

#define uninitialized_var(x) x = *(&(x))

¿Por qué tenemos dos definiciones diferentes? ¿Por qué razón la primera forma puede ser insuficiente? Es la primera forma suficiente sólo para Sonido metálico o en algunos otros casos también?


ejemplo:

#define uninitialized_var(x) x = x

struct some {
     int a;
     char b;
};

int main(void) {
     struct some *ptr;
     struct some *uninitialized_var(ptr2);

     if (1)
         printf("%d %d\n", ptr->a, ptr2->a); // warning about ptr, not ptr2
}
Eric Postpischil:

Los compiladores están hechos para reconocer ciertas construcciones como indicaciones de que el autor pretende algo deliberadamente, cuando el compilador de otro modo advertir al respecto. Por ejemplo, dada if (b = a), GCC y Clang tanto advertir que una asignación está siendo utilizado como un condicional, pero no advierten sobre if ((b = a))pesar de que es equivalente en términos de la norma C. Esta construcción particular con paréntesis adicionales simplemente se ha establecido como una forma de decirle al compilador que el autor realmente tiene la intención de este código.

Del mismo modo, x = xse ha establecido como una manera de contar GCC no advertir sobre xser inicializado. Hay momentos en los que puede una función aparecer tener una ruta de código en el que se utiliza un objeto sin ser inicializado, pero el autor conoce la función está destinada a no ser utilizado con los parámetros que jamás causar ese camino particular código que se ejecuta y, por razones de eficiencia, quieren silenciar la advertencia del compilador en lugar de añadir una inicialización que no es realmente necesario para la corrección del programa.

Sonido metálico, estaba destinado a no reconocer lenguaje de GCC para esto y necesita un método diferente.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=369795&siteId=1
Recomendado
Clasificación