Tutorial: Análisis de código de C/C++ para detectar defectos
En este tutorial se muestra cómo analizar el código de C/C++ en busca de posibles defectos de código. Usa las herramientas de análisis de código para el código de C/C++.
En este tutorial, hará lo siguiente:
- Ejecutar análisis de código en código nativo.
- Analizar advertencias de defectos de código.
- Trate la advertencia como un error.
- Anotar código fuente para mejorar el análisis de defectos de código.
Requisitos previos
- Copia del ejemplo CppDemo.
- Conocimientos básicos de C/C++.
Ejecución de análisis de código en código nativo
Para ejecutar el análisis de defectos de código en código nativo
Abra la solución CppDemo en Visual Studio.
La solución CppDemo ahora rellena Explorador de soluciones.
En el menú Compilar, elija Recompilar solución.
La solución se compila sin errores ni advertencias.
En Explorador de soluciones, seleccione el proyecto CodeDefects.
En el menú Proyecto , elija Propiedades.
Se muestra el cuadro de diálogo Páginas de propiedades CodeDefects.
Seleccione la página Code Analysis propiedades.
Cambie la propiedad Habilitar Code Analysis en la compilación a Sí. Elija Aceptar para guardar los cambios.
Vuelva a generar el proyecto CodeDefects.
Las advertencias de análisis de código se muestran en la ventana Lista de errores.
Abra la solución CppDemo en Visual Studio.
La solución CppDemo ahora rellena Explorador de soluciones.
En el menú Compilar, elija Recompilar solución.
La solución se compila sin errores ni advertencias.
Nota
En Visual Studio 2017, es posible que vea una advertencia falso
E1097 unknown attribute "no_init_all"en el motor de IntelliSense. Puede omitir esta advertencia sin problemas.En Explorador de soluciones, seleccione el proyecto CodeDefects.
En el menú Proyecto , elija Propiedades.
Se muestra el cuadro de diálogo Páginas de propiedades CodeDefects.
Seleccione la página Code Analysis propiedades.
Active la casilla Enable Code Analysis on Build (Habilitar Code Analysis en la compilación). Elija Aceptar para guardar los cambios.
Vuelva a generar el proyecto CodeDefects.
Las advertencias de análisis de código se muestran en la ventana Lista de errores.
Para analizar advertencias de defectos de código
En el menú Ver, elija Lista de errores.
Es posible que este elemento de menú no esté visible. Depende del perfil de desarrollador que haya elegido en Visual Studio. Es posible que tenga que apuntar a Otros Windows en el menú Ver y, a continuación, elija Lista de errores.
En la ventana Lista de errores, haga doble clic en la advertencia siguiente:
C6230: Conversión implícita entre tipos semánticamente diferentes: mediante HRESULT en un contexto booleano.
El editor de código muestra la línea que produjo la advertencia dentro de la función
bool ProcessDomain(). Esta advertencia indica que seHRESULTestá utilizando en una instrucción "if" donde se espera un resultado booleano. Normalmente es un error, porque cuando se devuelve el HRESULT de una función indica que se ha hecho correctamente, pero cuando se convierte en un valor booleano seS_OKevalúa comofalse.Corrija esta advertencia mediante la macro , que se convierte en cuando un valor devuelto indica que el resultado
SUCCEEDEDtrueesHRESULTcorrecto. El código debe ser similar al código siguiente:if (SUCCEEDED(ReadUserAccount()))En la lista de errores, haga doble clic en la advertencia siguiente:
C6282: Operador incorrecto: asignación de constante en contexto booleano. Considere la posibilidad de usar '==' en su lugar.
Corrija esta advertencia probando la igualdad. El código debe ser similar al código siguiente:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))Corrija las advertencias C6001 restantes en la lista de errores inicializando y a
j0.Vuelva a generar el proyecto CodeDefects.
El proyecto se compila sin advertencias ni errores.
Advertencias de anotación de código fuente correctas
Para habilitar las advertencias de anotación de código fuente en annotation.c
En Explorador de soluciones, seleccione el proyecto Anotaciones.
En el menú Proyecto , elija Propiedades.
Se muestra el cuadro de diálogo Páginas de propiedades anotaciones .
Seleccione la página Code Analysis propiedades.
Cambie la propiedad Habilitar Code Analysis en la compilación a Sí. Elija Aceptar para guardar los cambios.
En Explorador de soluciones, seleccione el proyecto Anotaciones.
En el menú Proyecto , elija Propiedades.
Se muestra el cuadro de diálogo Páginas de propiedades anotaciones .
Seleccione la página Code Analysis propiedades.
Active la casilla Enable Code Analysis on Build (Habilitar Code Analysis en la compilación). Elija Aceptar para guardar los cambios.
Para corregir las advertencias de anotación de código fuente en annotation.c
Vuelva a generar el proyecto Anotaciones.
En el menú Compilar, elija Ejecutar Code Analysis en Anotaciones.
En la lista de errores, haga doble clic en la advertencia siguiente:
C6011: Desreferenciación del puntero NULL "newNode".
Esta advertencia indica un error del autor de la llamada para comprobar el valor devuelto. En este caso, una llamada a
AllocateNodepodría devolver un valor NULL. Vea el archivo de encabezado annotations.h para obtener la declaración de función paraAllocateNode.El cursor está en la ubicación del archivo annotations.cpp donde se produjo la advertencia.
Para corregir esta advertencia, use una instrucción "if" para probar el valor devuelto. El código debe ser similar al código siguiente:
LinkedList* newNode = AllocateNode(); if (nullptr != newNode) { newNode->data = value; newNode->next = 0; node->next = newNode; }Vuelva a generar el proyecto Anotaciones.
El proyecto se compila sin advertencias ni errores.
Uso de la anotación de código fuente para detectar más problemas
Para usar la anotación de código fuente
Anote los parámetros formales y el valor devuelto de la función
AddTailpara indicar que los valores de puntero pueden ser NULL:_Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)En el menú Compilar, elija Ejecutar análisis de código en la solución.
En la lista de errores, haga doble clic en la advertencia siguiente:
C6011: Desreferenciación del puntero NULL 'node'.
Esta advertencia indica que el nodo pasado a la función puede ser NULL.
Para corregir esta advertencia, use una instrucción "if" al principio de la función para probar el valor pasado. El código debe ser similar al código siguiente:
if (nullptr == node) { return nullptr; }En el menú Compilar, elija Ejecutar análisis de código en la solución.
El proyecto ahora se compila sin advertencias ni errores.
Vea también
Tutorial: Analizar código administrado en previsión de defectos de código
Análisis de código para C/C++