Tutorial: Analizar código de C/C++ en previsión de defectos
Actualización: noviembre 2007
Este tutorial muestra cómo analizar el código C/C++ para comprobar si tiene defectos de código potenciales utilizando la herramienta de análisis de código para el código C/C++.
En este tutorial, se describe paso a paso el proceso de utilizar el análisis de código para analizar el código de C/C++ en previsión de posibles defectos de código.
Llevará a cabo los pasos siguientes:
Ejecutar el análisis de código en el código nativo.
Analizar las advertencias de defectos de código.
Tratar las advertencias como errores.
Anotar el código fuente para mejorar el análisis de defectos de código.
Requisitos previos
Visual Studio Team System Development.
Una copia de Ejemplo de demostración.
Conocimientos básicos de C/C++.
Para ejecutar el análisis de defectos de código en código nativo
Abra la solución Demo en Development Edition.
La solución Demo rellenará el Explorador de soluciones.
En el menú Generar, haga clic en Volver a generar solución.
La solución se generará sin errores ni advertencias.
En el Explorador de soluciones, seleccione el proyecto CodeDefects.
En el menú Proyecto, haga clic en Propiedades.
Aparece el cuadro de diálogo Páginas de propiedades de CodeDefects.
Haga clic en Análisis de código.
En la lista desplegable Habilitar análisis de código para C/C++, seleccione Sí (/analyze) y, a continuación, haga clic en Aceptar.
Vuelva a generar el proyecto CodeDefects.
Se mostrarán advertencias de análisis de código en la Lista de errores.
Para analizar las advertencias de defectos de inicialización de código
En el menú Ver, haga clic en Lista de errores.
Dependiendo del perfil del programador seleccionado en Visual Studio 2005 Team System, quizá deba elegir el comando Otras ventanas del menú Ver y, a continuación, hacer clic en Lista de errores.
En la Lista de errores, haga doble clic en la siguiente advertencia:
Advertencia C6230: Conversión de tipos implícita entre tipos semánticamente diferentes: uso de HRESULT en un contexto booleano.
El editor de código muestra la línea que produjo la advertencia en la función boolProcessDomain(). Esta advertencia indica que se está utilizando un valor HRESULT en una instrucción 'if' cuando se espera un resultado booleano.
Corrija esta advertencia utilizando la macro SUCCEEDED. El código debe ser similar al siguiente:
if (SUCCEEDED (ReadUserAccount()) )
En la Lista de errores, haga doble clic en la siguiente advertencia:
Advertencia C6282: Operador incorrecto: asignación a constante en contexto de pruebas. ¿Pretendía indicar ==?
Corrija esta advertencia probando la igualdad. El código debe ser similar al siguiente:
if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != '\\'))
Para tratar las advertencias como errores
En el archivo Bug.cpp, agregue la siguiente instrucción #pragma al principio del archivo para tratar la advertencia C6001 como un error:
#pragma warning (error: 6001)
Vuelva a generar el proyecto CodeDefects.
En la Lista de errores, C6001 aparecerá ahora como un error.
Corrija los dos errores de C6001 restantes en la Lista de errores inicializando i y j en 0.
Vuelva a generar el proyecto CodeDefects.
El proyecto se generará sin advertencias ni errores.
Para corregir las advertencias de anotación de código fuente en annotation.c
En el Explorador de soluciones, seleccione el proyecto Annotations.
En el menú Proyecto, haga clic en Propiedades.
Aparece el cuadro de diálogo Páginas de propiedades de anotaciones.
Haga clic en Análisis de código.
En la lista desplegable Habilitar análisis de código para C/C++, seleccione Sí (/analyze) y, a continuación, haga clic en Aceptar.
Vuelva a generar el proyecto Annotations.
En la Lista de errores, haga doble clic en la siguiente advertencia:
Advertencia C6011: Eliminación de referencia al puntero NULL 'newNode'.
Esta advertencia indica que el llamador no ha conseguido comprobar el valor devuelto. En este caso, una llamada a AllocateNode puede devolver un valor NULL (vea en el archivo de encabezado annotations.h la declaración de función correspondiente a AllocateNode).
Abra el archivo Annotation.c.
Para corregir esta advertencia, utilice una instrucción 'if' para probar el valor devuelto. El código debe ser similar al siguiente:
if (NULL != newNode)
{
newNode->data = value;
newNode->next = 0;
node->next = newNode;
}
Vuelva a generar el proyecto Annotations.
El proyecto se generará sin advertencias ni errores.
Para utilizar la anotación del código fuente
Anote los parámetros formales y el valor devuelto de la función AddTail utilizando las condiciones Pre y Post como se muestra en este ejemplo:
[returnvalue:SA_Post (Null=SA_Maybe)] LinkedList* AddTail
(
[SA_Pre(Null=SA_Maybe)] LinkedList* node,
int value
)
Vuelva a generar el proyecto Annotations.
En la Lista de errores, haga doble clic en la siguiente advertencia:
Advertencia C6011: Eliminación de referencia al puntero NULL 'node'.
Esta advertencia indica que el nodo pasado a la función puede ser null.
Para corregir esta advertencia, utilice una instrucción 'if' para probar el valor devuelto. El código debe ser similar al siguiente:
. . . LinkedList *newNode = NULL; if (NULL == node) { return NULL; . . . }
Vuelva a generar el proyecto Annotations.
El proyecto se generará sin advertencias ni errores.
Vea también
Tareas
Tutorial: Analizar código administrado en previsión de defectos de código