De vez en cuando, los programadores que comienzan a familiarizarse con el analizador de c贸digo PVS-Studio me preguntan: "驴Hay una lista de advertencias que indiquen errores con precisi贸n?" No existe dicha lista porque las advertencias poco interesantes (falsas) en un proyecto son muy importantes y 煤tiles en otro. Sin embargo, uno definitivamente puede comenzar a cavar en el analizador desde las advertencias m谩s emocionantes. Echemos un vistazo m谩s de cerca a este tema.
El problema es que, por regla general, al principio un programador se ahoga en una gran cantidad de advertencias que recibe. Naturalmente, quiere comenzar a revisar las advertencias m谩s interesantes para comprender si deber铆a dedicar su tiempo a resolver todo esto. Bien, aqu铆 hay tres pasos simples que le permitir谩n ver las advertencias m谩s emocionantes.
Paso 1
Deshabilite todos los tipos de advertencias excepto las generales (GA). Un error com煤n es habilitar todo tipo de advertencias. Los usuarios inexpertos piensan que cuanto m谩s se habilite, mejor. Ese no es el caso. Hay conjuntos de diagn贸stico, como las comprobaciones de 64 bits y las reglas MISRA, que solo deben usarse cuando uno sabe claramente qu茅 son y c贸mo trabajar con ellos. Por ejemplo, al habilitar los diagn贸sticos MISRA para un programa de aplicaci贸n ordinario, se ahogar谩 en decenas, miles o cientos de miles de advertencias 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 indican no errores, sino olores de c贸digo. Naturalmente, un programador comienza a hacer preguntas. 驴C贸mo encuentras algo interesante en la pila de todas estas advertencias? 驴Qu茅 n煤meros deber铆a mirar? Estas son las preguntas equivocadas. Solo necesita deshabilitar el conjunto MISRA. Este es el est谩ndar para escribir c贸digo de calidad para dispositivos integrados. El objetivo del est谩ndar es hacer que el c贸digo sea extremadamente simple y comprensible. No intentes aplicarlo donde sea inapropiado.
Nota S铆, MISRA tiene reglas dise帽adas para 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 vas a perder nada. Los errores reales a煤n se encontrar谩n como parte de los Diagn贸sticos generales (GA). Por ejemplo, el diagn贸stico
V614 encontrar谩 una variable no inicializada.
Paso 2
Cualquier analizador est谩tico emite falsos positivos en las primeras ejecuciones y requiere cierta configuraci贸n. No se puede hacer nada al respecto, pero no es tan aterrador como parece. Incluso una configuraci贸n r谩pida simple le permite eliminar la mayor铆a de los falsos positivos y comenzar a ver un informe bastante relevante. No hablar茅 m谩s sobre eso, como lo he escrito muchas veces, por ejemplo, en este art铆culo: "
Caracter铆sticas del analizador PVS-Studio por el ejemplo de las bibliotecas principales de EFL, 10-15% de falsos positivos ".
Pase un poco de tiempo desactivando advertencias obviamente irrelevantes y luchando contra falsos positivos relacionados con macros. En t茅rminos generales, las macros son la raz贸n principal de los falsos positivos, ya que aparece una advertencia en todos los casos cuando se utiliza una macro mal implementada. Para suprimir advertencias en macros, puede escribir comentarios de un tipo especial al lado de su declaraci贸n. El formato m谩s de comentarios est谩 cubierto 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 hacerlo. Si hay alguna dificultad o pregunta, siempre estamos listos para ayudarlo y decirle c贸mo configurar el analizador de la mejor manera. Si茅ntase libre de
escribir y hacernos preguntas.
Paso 3
Comience a ver las advertencias desde el Nivel 1. Solo despu茅s de ver 2 y 3. Los niveles de advertencia no son m谩s que la veracidad de una advertencia. Las advertencias del Nivel 1 tienen m谩s probabilidades de indicar un error real que las advertencias del Nivel 2.
Puede decir que cuando elige "ver el Nivel 1", presiona el bot贸n "ver los errores m谩s interesantes".
M谩s detalladamente, la clasificaci贸n de las advertencias de PVS-Studio por niveles se describe en el art铆culo "
La forma en que los analizadores est谩ticos luchan contra los falsos positivos y por qu茅 lo hacen ".
Entonces, 驴por qu茅 no hay una lista?
Sin embargo, la idea de tener una lista de las advertencias m谩s 煤tiles a煤n puede parecer razonable. Perm铆tame mostrarle en un ejemplo pr谩ctico que la utilidad de un diagn贸stico es relativa y depende del proyecto.
Consideremos la advertencia
V550 . La advertencia detecta un posible error relacionado con el hecho de que, para comparar n煤meros con un punto flotante, se utilizan los operadores == o! =.
La mayor铆a de los desarrolladores con los que he hablado piensan que este diagn贸stico es in煤til y lo deshabilitan porque todos los disparadores para su proyecto son falsos. Es por eso que este diagn贸stico tiene un bajo nivel de certeza y se relaciona con el Nivel 3.
De hecho, en la mayor铆a de las aplicaciones, los tipos flotante / doble se utilizan en algoritmos muy simples. A menudo, la comparaci贸n con la constante se usa 煤nicamente para verificar si un determinado valor se establece de manera predeterminada o si ha cambiado. En este caso, la verificaci贸n exacta es bastante apropiada. Lo explicar茅 con pseudoc贸digo.
float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value);
Aqu铆 la comparaci贸n
(valor de 1.0f) es correcta y segura.
驴Significa esto que el diagn贸stico V550 no es interesante? No Todo depende del proyecto. Perm铆tanme citar un fragmento del art铆culo "
C贸mo intentamos el an谩lisis est谩tico en nuestro proyecto de simulador de entrenamiento de cirug铆a endovascular de rayos X ", escrito por nuestro usuario.
Entonces, a qu茅 presta atenci贸n nuestro analizador est谩tico 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); }
Los errores de este tipo se repiten con bastante frecuencia en esta biblioteca. No puedo decir que fue una sorpresa para m铆. Anteriormente, me encontr茅 con el manejo incorrecto de n煤meros con un punto flotante en este proyecto. Sin embargo, no hab铆a recursos para verificar sistem谩ticamente las fuentes. Como resultado de la verificaci贸n, qued贸 claro que era necesario darle al desarrollador algo para ampliar sus horizontes en t茅rminos de trabajo con n煤meros de coma flotante. Ha sido vinculado a un par de buenos art铆culos. Veremos c贸mo salen las cosas. Es dif铆cil decir con certeza si este error causa interrupciones reales en el programa. La soluci贸n actual expone una serie de requisitos para la malla poligonal original de las arterias, que simula la propagaci贸n de la materia de contraste de rayos X. Si no se cumplen los requisitos, el programa puede caerse o el trabajo es claramente incorrecto. Algunos de estos requisitos se obtienen anal铆ticamente y otros, emp铆ricamente. Es posible que este conjunto emp铆rico de requisitos est茅 creciendo solo debido al manejo incorrecto de los n煤meros con un punto flotante. Cabe se帽alar que no todos los casos encontrados de usar una comparaci贸n precisa de n煤meros con un 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 los "m谩s interesantes".
Nota Tambi茅n puede establecer el nivel de advertencia utilizando la configuraci贸n. Por ejemplo, si cree que el diagn贸stico V550 merece mucha atenci贸n, puede moverlo del Nivel 3 al 1. 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 observando las m谩s interesantes. Y no olvide consultar la documentaci贸n para obtener una descripci贸n detallada de las advertencias. A veces sucede que detr谩s de un an贸nimo, a primera vista, la advertencia yace en el infierno. Un ejemplo de tales diagn贸sticos:
V597 ,
V1026 . Gracias por su atencion