Al estudiar las advertencias del analizador PVS-Studio en el proceso de verificar varios proyectos abiertos, una y otra vez nos aseguramos de cuán útil puede ser esta herramienta. El analizador de código es increíblemente atento y nunca se cansa. Indica errores que se escapan incluso con una revisión cuidadosa del código. Considere otro caso de este tipo.
La última vez que escribí una
nota similar , estudiando el código fuente del proyecto StarEngine: 2D Game Engine. Ahora el analizador ha demostrado su superioridad sobre mí durante la verificación del marco Qt.
La última vez que
probamos el marco Qt en 2014. Pasó mucho tiempo, el proyecto cambió y aparecieron muchos diagnósticos nuevos en el analizador PVS-Studio. Entonces, es bastante posible escribir otro artículo, lo cual hice.
Escribiendo ejemplos interesantes de errores, me encontré con este código:
QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing)
PVS-Studio emitió una advertencia para este código:
V616 CWE-480 La constante nombrada 'CursorShowing' con el valor de 0 se utiliza en la operación bit a bit. qwindowscursor.cpp 669
Se usó una versión inestable de PVS-Studio para la verificación, por lo que mi fe en el analizador vaciló. "Oh, algo rompimos en los mecanismos para procesar transferencias sin nombre", suspiré y escribí este caso al rastreador de errores como un error que conduce a un falso positivo.
Estaba absolutamente seguro de que el analizador estaba equivocado. Después de todo, con solo unas pocas líneas arriba, se escribe que la constante
CursorShowing es 1.
¡Al mismo tiempo, traté de tener cuidado! Revisé el código varias veces para asegurarme de que el analizador esté equivocado. Diseñé este fragmento de código y el mensaje correspondiente como un error en el bugtracker.
Hice una revisión exhaustiva de este pequeño código y lo arruiné de todos modos. El analizador tiene razón, no la persona.
En un estudio detallado de la situación, resultó que la constante
cursorShowing nombrada se
declara arriba , y la constante
CursorShowing se usa en la condición. ¡La diferencia está solo en la primera letra! En un lugar es minúscula, y en otro capital.
¿Por qué se está compilando el código? Porque la constante
CursorShowing también existe. Aquí está su anuncio:
class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... }
Como puede ver, la constante
CursorShowing es 0. Por lo tanto, el analizador PVS-Studio tiene toda la razón al decir que la condición
(cursorInfo.flags & CursorShowing) no tiene sentido. La condición siempre es falsa.
El analizador encontró un error tipográfico maravilloso. Me encanta el análisis de código estático! :)

Si desea compartir este artículo con una audiencia de habla inglesa, utilice el enlace a la traducción: Andrey Karpov.
Una vez más, el analizador PVS-Studio ha demostrado ser más atento que una persona .