Partager via


C6029

avertissement C6029 : dépassement de mémoire tampon possible lors de l'appel à <fonction> : utilisation de la valeur non vérifiée

Cet avertissement indique qu'une taille non contrôlée est passée à une fonction qui accepte une mémoire tampon et une taille. Les données lues à partir d'une source externe n'ont pas été vérifiées pour contrôler si elles sont inférieures à la taille de la mémoire tampon. Un agresseur peut spécifier intentionnellement une valeur beaucoup plus grande que la valeur attendue pour la taille, ce qui entraînera un dépassement de mémoire tampon.

En général, chaque fois que vous lisez des données d'une source externe non fiable, pensez à vérifier leur validité. Il convient généralement de vérifier la taille pour s'assurer qu'elle est comprise dans la plage attendue.

Exemple

Le code suivant génère cet avertissement en appelant deux fois la fonction annotée ReadFile. Après le premier appel, la propriété de l'attribut Post marque la deuxième valeur de paramètre comme étant non fiable. Par conséquent, le passage d'une valeur non fiable dans le deuxième appel à ReadFile génère cet avertissement comme le montre le code suivant :

#include "windows.h"

bool f(HANDLE hFile)
{
    char buff[MAX_PATH];

    DWORD cbLen;
    DWORD cbRead;

    // Read the number of byte to read (cbLen).
    if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))  
    {
        return false;
    }
    // Read the bytes
    if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL))  // warning 6029
    {
        return false;
    }

    return true;
}

Pour corriger cet avertissement, vérifiez la taille de la mémoire tampon comme le montre le code suivant :

bool f(HANDLE hFile)
{
    char buff[MAX_PATH];

    DWORD cbLen;
    DWORD cbRead;

    // Read the number of byte to read (cbLen).
    if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))  
    {
        return false;
    }
    // Ensure that there's enough space in the buffer to read that many bytes.
    if (cbLen > sizeof(buff))
    {
        return false;
    }
    // Read the bytes
    if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL))  // warning 6029
    {
        return false;
    }

    return true;
}

Voir aussi

Concepts

Vue d'ensemble de l'annotation