Es una pena las opiniones sobre los analizadores de código estático

Las herramientas de análisis de código estático han avanzado mucho. Estos no son en absoluto los "linters" que se usaban activamente hace 20 años. Sin embargo, muchos todavía se refieren a ellos como herramientas muy simples. Es una pena. Es una pena tanto para la metodología de análisis de código en general como para la herramienta PVS-Studio.







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







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 .



All Articles