De vez en cuando, los programadores que comienzan a familiarizarse con el analizador de código PVS-Studio preguntan: "¿Existe una lista de advertencias que indiquen errores con precisión?" No existe tal lista por la razón de que las advertencias poco interesantes (falsas) en un proyecto y en otro resultan ser muy importantes y útiles. Sin embargo, es muy posible comenzar a conocer al analizador con las advertencias más interesantes. Echemos un vistazo más de cerca a este tema.
El problema es que durante los primeros lanzamientos, el programador, como regla, recibe una gran cantidad de advertencias en las que se "ahoga". Naturalmente, tiene el deseo de familiarizarse con las advertencias más interesantes para comprender si debería pasar todo este tiempo. Genial, aquí hay tres pasos simples que le permitirán familiarizarse con los aspectos positivos más interesantes.
Paso 1
Deshabilite todos los tipos de alertas excepto general (GA). Un error común: habilitar todo tipo de advertencias. Para usuarios inexpertos, parece que cuanto más lo enciendes, mejor. ¡Esto no es así! Hay conjuntos de diagnósticos, como las comprobaciones de 64 bits y las reglas MISRA, que deben usarse solo con una idea clara de qué es y cómo trabajar con ellos. Por ejemplo, al activar los diagnósticos MISRA para un programa de aplicación ordinario, se ahogará en decenas, miles o cientos de miles de mensajes como:
- V2506 . Misra Una función debe tener un único punto de salida al final.
- V2507 . Misra El cuerpo de una instrucción loop \ condicional debe estar entre llaves.
- V2523 . Misra Todas las constantes enteras de tipo sin signo deben tener el sufijo 'u' o 'U'.
La mayoría de las advertencias de MISRA no indican errores, pero el código huele mal. Naturalmente, una persona comienza a hacer preguntas. ¿Cómo encontrar algo interesante en la masa de todas estas advertencias? ¿Diagnóstico bajo qué números debería mirar? Estas son las preguntas equivocadas. Solo necesita deshabilitar el kit MISRA. Este es el estándar para escribir código de calidad para dispositivos integrados. La esencia del estándar: hacer que el código sea extremadamente simple y comprensible. No intente aplicarlo donde sea inapropiado.
Nota Sí, hay normas en el estándar MISRA destinadas a identificar errores reales. Ejemplo:
V2538 : el valor de la variable no inicializada no debe utilizarse. Pero no tenga miedo de deshabilitar el estándar MISRA. No perderás nada. Todavía se encontrarán errores verdaderos en los diagnósticos de propósito general (GA). Por ejemplo, se encontrará una variable no inicializada gracias al diagnóstico
V614 .
Paso 2
Cualquier analizador estático genera falsos positivos durante los primeros inicios y requiere una determinada configuración. No se puede hacer nada con esto, pero no es tan aterrador como podría parecer. Incluso una configuración rápida simple le permite eliminar la mayoría de las advertencias falsas y comenzar a familiarizarse con un informe ya bastante adecuado. No hablaremos de esto con más detalle, ya que escribí muchas veces, por ejemplo, en este artículo: "
Características del analizador PVS-Studio que usa el ejemplo EFL Core Libraries, 10-15% de falsos positivos ".
Pase un poco de tiempo deshabilitando advertencias explícitamente irrelevantes y luchando contra falsos positivos debido a macros. Las macros son generalmente la principal fuente de falsos positivos, ya que aparece una advertencia siempre que se utiliza una macro fallida. Para suprimir las advertencias en las macros, se puede colocar un tipo especial de comentarios al lado de su declaración. El formato para escribir comentarios se discute con más detalle en la
documentación .
Sí, la configuración inicial llevará un poco de tiempo, pero mejorará drásticamente la percepción del informe al eliminar el ruido que distrae. Tómate un tiempo para esto. Si hay dificultades o preguntas, siempre estamos listos para ayudar y sugerir la mejor forma de configurar el analizador. Siéntase libre de
escribir y hacernos preguntas.
Paso 3
Comienza a aprender las advertencias del nivel 1. Y solo entonces mire 2 y 3. Los niveles de advertencia no son más que la confiabilidad de la advertencia. Las advertencias de nivel 1 tienen más probabilidades de indicar un error verdadero que las 2.
Podemos decir que al elegir "ver nivel 1", presionas el botón "ver los errores más interesantes".
La clasificación de las alertas de PVS-Studio por niveles se describe con más detalle en el artículo "
Cómo y por qué los analizadores estáticos tratan con falsos positivos ".
Entonces, ¿por qué todavía no hay una lista?
Sin embargo, una idea con una lista de las advertencias más útiles puede parecer razonable. Permítanme mostrar con un ejemplo práctico que la utilidad del diagnóstico es relativa y depende del proyecto.
Considere la advertencia de
V550 . Una advertencia revela un posible error debido al hecho de que el operador == o! = Se utiliza para comparar números de punto flotante.
La mayoría de los desarrolladores con los que hablé creen que este diagnóstico es de poca utilidad y lo desactivan, ya que todos los aspectos positivos de su proyecto son falsos. Y es por eso que este diagnóstico tiene baja confiabilidad y se ubica en el 3er nivel.
De hecho, en la mayoría de las aplicaciones, los tipos flotante / doble se utilizan en algoritmos muy simples. Y, a menudo, una comparación con una constante se usa únicamente para verificar si se establece un valor predeterminado o si ha cambiado. En este caso, una verificación precisa es bastante apropiada. Explicaré esto con pseudocódigo.
float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value);
Aquí la comparación
(valor == 1.0f) es correcta y segura.
¿Significa esto que el V550 es un diagnóstico poco interesante? No Todo depende del proyecto. Citaré un fragmento del artículo "
Cómo probamos el análisis estático en nuestro proyecto de un simulador de entrenamiento de cirugía endovascular "
, escrito por uno de nuestros usuarios.
Entonces, lo que el analizador estático llama nuestra atención aquí:
V550 Una comparación precisa extraña: t! = 0. Probablemente sea mejor usar una comparación con precisión definida: fabs (A - B)> Epsilon. objectextractpart.cpp 3401
D3DXVECTOR3 N = VectorMultiplication( VectorMultiplication(V-VP, VN), VN); float t = Qsqrt(Scalar(N, N)); if (t!=0) { N/=t; V = V - N * DistPointToSurface(V, VP, N); }
Errores similares se repiten con bastante frecuencia en esta biblioteca. No diré que esto fue una sorpresa para mí. Ya anteriormente encontré trabajo incorrecto con números de punto flotante en este proyecto. Sin embargo, no había recursos para verificar sistemáticamente las fuentes para esto. De acuerdo con los resultados de la verificación, quedó claro que debe darle al desarrollador algo para leer para ampliar sus horizontes en términos de trabajo con números de punto flotante. Le lancé enlaces a un par de buenos artículos. Veamos el resultado. Es difícil decir inequívocamente si este error causa un mal funcionamiento real en el programa. La solución actual establece una serie de requisitos para la red poligonal inicial de arterias, a lo largo de la cual se simula la propagación de una sustancia radioopaca. Si no se cumplen los requisitos, el programa puede bloquearse o, obviamente, una operación incorrecta. Algunos de estos requisitos se obtienen analíticamente y otros empíricamente. Es posible que esta segunda parte de los requisitos crezca solo del trabajo incorrecto con números de punto flotante. Cabe señalar que no todos los casos encontrados de usar la comparación exacta de números de punto flotante fueron un error.
Como puede ver, lo que no es interesante en algunos proyectos es de interés en otros. Esto hace que sea imposible crear una lista de "más interesantes".
Nota Es posible establecer el nivel de advertencia utilizando la configuración. Por ejemplo, si cree que los diagnósticos del V550 merecen mucha atención, puede moverlo del tercer nivel al primero. Este tipo de configuración se describe en la
documentación (consulte "Cómo configurar su nivel para diagnósticos específicos").
Conclusión
Ahora ya sabe cómo comenzar a estudiar las advertencias del analizador, considerando las más interesantes. Y no olvide consultar la documentación para familiarizarse con la descripción detallada de las advertencias. A veces sucede que detrás de una no predisposición, a primera vista, la advertencia es un infierno. Un ejemplo de tales diagnósticos:
V597 ,
V1026 . Gracias por su atencion

Si desea compartir este artículo con una audiencia de habla inglesa, utilice el enlace a la traducción: Andrey Karpov.
¿Cómo verificar rápidamente las advertencias interesantes que brinda el analizador PVS-Studio para el código C y C ++?