Tutorial: Análisis del código de C/C++ para detectar defectos

En este tutorial se muestra cómo analizar el código de C/C++ para detectar posibles defectos. Usa las herramientas de análisis de código para el código de C/C++.

En este tutorial, hará lo siguiente:

  • Ejecutar el análisis de código en código nativo.
  • Analizar las advertencias de defectos en el código.
  • Tratar las advertencias como errores.
  • Anotar el código fuente para mejorar el análisis de defectos del código.

Requisitos previos

Ejecución del análisis de código en código nativo

Para ejecutar el análisis de los defectos del código en código nativo

  1. Abra la solución CppDemo en Visual Studio.

    La solución CppDemo rellenará el Explorador de soluciones.

  2. En el menú Compilar, elija Recompilar solución.

    La solución se compila sin errores ni advertencias.

  3. En el Explorador de soluciones, seleccione el proyecto CodeDefects.

  4. En el menú Proyecto , elija Propiedades.

    Aparece el cuadro de diálogo Páginas de propiedades de CodeDefects.

  5. Página de propiedades de Code Analysis.

  6. Cambie la propiedad Habilitar análisis de código al compilar a . Elija Aceptar para guardar los cambios.

  7. Para recompilar el proyecto CodeDefects.

    Las advertencias del análisis de código se mostrarán en la ventana Lista de errores.

  1. Abra la solución CppDemo en Visual Studio.

    La solución CppDemo rellenará el Explorador de soluciones.

  2. 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 E1097 unknown attribute "no_init_all" falsa en el motor de IntelliSense. Puede omitir con seguridad esta advertencia.

  3. En el Explorador de soluciones, seleccione el proyecto CodeDefects.

  4. En el menú Proyecto , elija Propiedades.

    Aparece el cuadro de diálogo Páginas de propiedades de CodeDefects.

  5. Página de propiedades de Code Analysis.

  6. Active la casilla Habilitar Code Analysis en compilación. Elija Aceptar para guardar los cambios.

  7. Para recompilar el proyecto CodeDefects.

    Las advertencias del análisis de código se mostrarán en la ventana Lista de errores.

Para analizar las advertencias de defectos en el código

  1. En el menú Ver, elija Lista de errores.

    Es posible que este elemento de menú no se vea. Depende del perfil de desarrollador que haya elegido en Visual Studio. Es posible que tenga que apuntar a Otras ventanas en el menú Ver y, después, elegir Lista de errores.

  2. En la ventana Lista de errores, haga doble clic en la advertencia siguiente:

    C6230: Conversión implícita entre tipos semánticamente diferentes: uso de HRESULT en un contexto booleano.

    El editor de código muestra la línea que provocó la advertencia dentro de la función bool ProcessDomain(). Esta advertencia indica que se está usando en HRESULT una instrucción "if" donde se espera un resultado booleano. Normalmente es un error, porque cuando se devuelve HRESULT S_OK desde una función, indica que se ha realizado correctamente, pero cuando se convierte en un valor booleano se evalúa como false.

  3. Corrija esta advertencia mediante la macro SUCCEEDED, que se convierte en true cuando un valor devuelto HRESULT indica que se ha realizado correctamente. El código debería ser similar al código siguiente:

    if (SUCCEEDED(ReadUserAccount()))
    
  4. En Lista de errores, haga doble clic en la siguiente advertencia:

    C6282: Operador incorrecto: asignación de constante en contexto booleano. Considere la posibilidad de usar "==" en su lugar.

  5. Corrija esta advertencia probando la igualdad. El código debe ser similar al siguiente:

    if ((len == ACCOUNT_DOMAIN_LEN) || (g_userAccount[len] != L'\\'))
    
  6. Corrija las restantes advertencias C6001 que aparezcan en la lista de errores inicializando i y j en 0.

  7. Para recompilar el proyecto CodeDefects.

    El proyecto se compila sin advertencias ni errores.

Corrección de advertencias de anotación de código fuente

Para habilitar las advertencias de anotación de código fuente en annotation.c

  1. En el Explorador de soluciones, seleccione el proyecto Annotations.

  2. En el menú Proyecto , elija Propiedades.

    Aparece el cuadro de diálogo Páginas de propiedades Annotations.

  3. Página de propiedades de Code Analysis.

  4. Cambie la propiedad Habilitar análisis de código al compilar a . Elija Aceptar para guardar los cambios.

  1. En el Explorador de soluciones, seleccione el proyecto Annotations.

  2. En el menú Proyecto , elija Propiedades.

    Aparece el cuadro de diálogo Páginas de propiedades Annotations.

  3. Página de propiedades de Code Analysis.

  4. Active la casilla Habilitar Code Analysis en compilación. Elija Aceptar para guardar los cambios.

Para corregir las advertencias de anotación de código fuente en annotation.c

  1. Vuelva a compilar el proyecto Annotations.

  2. En el menú Compilar, elija Ejecutar Code Analysis en Annotations.

  3. En Lista de errores, haga doble clic en la siguiente advertencia:

    C6011: Desreferenciación del puntero NULL "newNode".

    Esta advertencia indica un error por parte del autor de la llamada para comprobar el valor devuelto. En este caso, una llamada a AllocateNode podría devolver un valor NULL. Consulte el archivo de encabezado annotations.h para ver la declaración de función de AllocateNode.

  4. El cursor se encuentra en la ubicación del archivo annotations.cpp donde se produjo la advertencia.

  5. Para corregir esta advertencia, use una instrucción "if" para probar el valor devuelto. El código debería ser similar al código siguiente:

    LinkedList* newNode = AllocateNode();
    if (nullptr != newNode)
    {
        newNode->data = value;
        newNode->next = 0;
        node->next = newNode;
    }
    
  6. Vuelva a compilar el proyecto Annotations.

    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

  1. Anote los parámetros formales y el valor devuelto de la función AddTail para indicar que los valores del puntero pueden ser null:

    _Ret_maybenull_ LinkedList* AddTail(_Maybenull_ LinkedList* node, int value)
    
  2. En el menú Compilar, elija Ejecutar análisis de código en la solución.

  3. En Lista de errores, haga doble clic en la siguiente advertencia:

    C6011: Desreferenciación del puntero NULL "node".

    Esta advertencia indica que el nodo pasado a la función podría ser null.

  4. Para corregir esta advertencia, use una instrucción "if" al principio de la función para probar el valor pasado. El código debería ser similar al código siguiente:

    if (nullptr == node)
    {
         return nullptr;
    }
    
  5. En el menú Compilar, elija Ejecutar análisis de código en la solución.

    El proyecto ahora se compila sin advertencias ni errores.

Consulte también

Tutorial: Analizar código administrado en previsión de defectos de código
Análisis de código para C/C++