PVS-Studio, como otros analizadores de c贸digo est谩tico, a menudo produce falsos positivos. Pero no se apresure a considerar falsas respuestas extra帽as. Esta es una historia corta sobre c贸mo PVS-Studio volvi贸 a estar m谩s atento a varias personas.
El usuario escribi贸 en apoyo de nosotros, alegando que el analizador produce inmediatamente cuatro falsos positivos por l铆nea de c贸digo. La carta, escrita en apoyo, inicialmente lleg贸 a Yevgeny Ryzhkov, quien, despu茅s de leerla con fluidez y sin notar comentarios an贸malos, la envi贸 de inmediato al desarrollador principal Svyatoslav Razmyslov. Eugene no se asom贸 al c贸digo, por lo que ser铆a justo contarlo solo para la mitad del programador :).
Svyatoslav ley贸 la carta y dud贸 de que el analizador pudiera estar tan equivocado. Por lo tanto, vino a m铆 para una consulta. Svyatoslav ten铆a la esperanza de que mi mirada estuviera fija y notar茅 algo que me diga por qu茅 el analizador emiti贸 todos estos mensajes extra帽os. Desafortunadamente, solo confirme que los mensajes son realmente muy extra帽os y no deber铆an serlo. Sin embargo, cu谩l fue la raz贸n de su aparici贸n, no pude notarlo. Se decidi贸 abrir la tarea en el rastreador de errores y comenzar a comprender lo que estaba mal.
Y solo cuando Svyatoslav comenz贸 a hacer ejemplos sint茅ticos para describir en detalle el problema en el rastreador de errores, se le ocurri贸 una idea. Veamos ahora si puede encontrar r谩pidamente la raz贸n por la cual el analizador muestra 4 mensajes.
Aqu铆 est谩 el texto de la carta, publicado con permiso del autor. Y una imagen explicativa adjunta a la carta.
Las advertencias de V560 aqu铆 son todas falsas. Se ejecuta con la versi贸n m谩s reciente de PVS-Studio para uso personal. B谩sicamente, la declaraci贸n "SI" es correcta. La externa se hace por velocidad; las internas todav铆a son necesarias y las no siempre son verdaderas o falsas.
Ahora, querido lector, 隆es hora de ponerte a prueba! 驴Ves el error?
Tu tiempo para estar atento. Y el unicornio esperar谩 un poco.
Despu茅s de la parte introductoria del art铆culo, lo m谩s probable es que muchos hayan encontrado un error. Cuando se configura para encontrar un error, se encuentra. Es mucho m谩s dif铆cil notar un error despu茅s de leer la carta, donde se llama "falsos positivos" :).
Ahora una explicaci贸n para aquellos que son demasiado flojos para buscar un error. Considere la condici贸n nuevamente:
if (!((ch >= 0x0FF10) && (ch <= 0x0FF19)) || ((ch >= 0x0FF21) && (ch <= 0x0FF3A)) || ((ch >= 0x0FF41) && (ch <= 0x0FF5A)))
El autor del c贸digo plane贸 verificar que el personaje no se encuentre en ninguno de los tres rangos.
El error es que el operador l贸gico NOT (!) Se aplica solo a la primera subexpresi贸n.
Si se cumple la condici贸n:
!((ch >= 0x0FF10) && (ch <= 0x0FF19))
entonces la evaluaci贸n de expresi贸n se interrumpe de acuerdo con la
evaluaci贸n de cortocircuito . Si no se cumple la condici贸n, el valor de la variable
ch se encuentra en el rango [0xFF10..0xFF19]. En consecuencia, otras cuatro comparaciones no tienen sentido. Todos ser谩n falsos o verdaderos.
Una vez mas Vea, si
ch se encuentra en el rango
[0xFF10..0xFF19] y el c谩lculo contin煤a, entonces:
- ch> = 0x0FF21 - siempre falso
- ch <= 0x0FF3A - siempre cierto
- ch> = 0x0FF41 - siempre falso
- ch <= 0x0FF5A - siempre cierto
Esto es lo que advierte el analizador PVS-Studio.
Entonces, el analizador est谩tico result贸 ser m谩s atento que el usuario y dos programadores y medio de nuestro equipo.
Para solucionar la situaci贸n, debe agregar corchetes adicionales:
if (!(((ch >= 0x0FF10) && (ch <= 0x0FF19)) || ((ch >= 0x0FF21) && (ch <= 0x0FF3A)) || ((ch >= 0x0FF41) && (ch <= 0x0FF5A))))
O reescribe la condici贸n:
if (((ch < 0x0FF10) || (ch > 0x0FF19)) && ((ch < 0x0FF21) || (ch > 0x0FF3A)) && ((ch < 0x0FF41) || (ch > 0x0FF5A)))
Sin embargo, no puedo recomendar el uso de ninguna de estas opciones. Escribir铆a esto para simplificar la lectura del c贸digo:
const bool isLetterOrDigit = (ch >= 0x0FF10 && ch <= 0x0FF19)
Tenga en cuenta que elimin茅 algunos de los corchetes. Como acabamos de ver, una gran cantidad de par茅ntesis no ayud贸 a evitar un error en absoluto. Los corchetes deber铆an facilitar la lectura del c贸digo, no m谩s complicado. Los programadores recuerdan bien que la prioridad de las comparaciones = <, => es mayor que la del operador &&. Por lo tanto, los corchetes no son necesarios aqu铆. Pero si pregunta qu茅 prioridad es && o ||, muchos se confundir谩n. Por lo tanto, para especificar la secuencia de c谩lculos &&, || los corchetes son mejores para poner.
驴Por qu茅 es mejor escribir || Al principio describ铆 en el art铆culo "
El tema principal de la programaci贸n, refactorizaci贸n y todo eso " (ver cap铆tulo: Alinear el mismo tipo de c贸digo con una "tabla").
Gracias a todos por su atenci贸n. Descargue y comience a usar
PVS-Studio . Ayudar谩 a identificar muchos errores y vulnerabilidades potenciales en las primeras etapas.

Si desea compartir este art铆culo con una audiencia de habla inglesa, utilice el enlace a la traducci贸n: Andrey Karpov.
C贸mo PVS-Studio demostr贸 ser m谩s atento que tres programadores y medio .