
El motivo de un poco de tristeza fue el comentario de uno de nuestros artículos. En este artículo, se escribió que el analizador detecta un error tipográfico al emitir una advertencia al siguiente código:
if (A[0] == 0)
{
X = Y;
if (A[0] == 0)
....
}
El analizador dice que la segunda condición siempre es cierta. De hecho, si examina el cuerpo de la función, queda claro que debe comprobarse otro elemento de la matriz.
Sobre esto, se recibió un comentario aproximadamente de la siguiente manera:
Sí, el analizador indica un error aquí. Pero, en general, esta advertencia es incorrecta. Después de todo, entre dos comprobaciones idénticas, el valor del elemento puede cambiar, y luego la segunda comprobación tendrá sentido.Estoy triste. Los programadores todavía piensan que los analizadores de código se basan en expresiones regulares. Como, encontramos dos idénticos anidados si y lo juro.
Naturalmente, cualquier analizador estático moderno supervisa los cambios en el valor de las variables. Si la variable no cambia, aparecerá un mensaje. Si cambia, no habrá ningún mensaje. Para ello, se utiliza la tecnología de análisis de flujo de datos.
Esto es exactamente lo que hace el analizador estático PVS-Studio. Echemos un vistazo al siguiente ejemplo sintético:
char get();
int foo(char *p, bool arg)
{
if (p[1] == 1)
{
if (arg)
p[0] = get();
if (p[1] == 1) // Warning
return 1;
}
if (p[2] == 2)
{
if (arg)
p[2] = get();
if (p[2] == 2) // Ok
return 2;
}
return 3;
}
El código contiene dos bloques similares. En uno, la variable que se comprueba no cambia y en el segundo cambia. Por lo tanto, el analizador emite una advertencia solo para el primer bloque: V547 La expresión 'p [1] == 1' siempre es verdadera.
Los programadores no deben preocuparse. Las herramientas modernas son avanzadas y solo emiten advertencias para códigos realmente sospechosos. Hay falsos positivos, pero, por regla general, están asociados con la presencia de un código confuso, que puede ser difícil de entender incluso para una persona.

Enlaces adicionales
- Ejemplos de errores detectados por el diagnóstico V547 .
- Análisis estático y expresiones regulares (por qué es una mala idea :).
- Tecnologías utilizadas en el analizador de código PVS-Studio para encontrar errores y posibles vulnerabilidades .

Si desea compartir este artículo con una audiencia de habla inglesa, utilice el enlace de traducción: Andrey Karpov. Opiniones molestas sobre los analizadores estáticos .