Lire en anglais

Partager via


Avertissement C26833

La taille d’allocation peut être le résultat d’un dépassement numérique avant la vérification liée

Notes

Cet avertissement signale que la taille spécifiée pour une allocation peut être le résultat d’un dépassement de capacité numérique. Par exemple :

void* SmallAlloc(int);

void foo(unsigned i, unsigned j)
{
    unsigned size = i + j;

    if (size > 50)
    {
        return;
    }

    int* p = (int*)SmallAlloc(size + 5); // Warning: C26833
    p[j] = 5;
}

La vérification size > 50 est trop tardive. Si i + j elle dépasse, elle produit une petite valeur qui transmet la vérification. Ensuite, SmallAlloc alloue une mémoire tampon plus petite que prévu. Cela entraînera probablement des tentatives hors limites d’accès à la mémoire tampon ultérieurement. Ce modèle de code peut entraîner des vulnérabilités d’exécution de code à distance.

Cette vérification s’applique aux fonctions d’allocation courantes telles que new, mallocet VirtualAlloc. La vérification s’applique également aux fonctions d’allocateur personnalisées qui ont alloc (qui ne respectent pas la casse) dans le nom de la fonction.

Cette vérification ne parvient parfois pas à reconnaître que certaines vérifications peuvent empêcher les dépassements de capacité, car la vérification est conservatrice.

Cet avertissement est disponible dans Visual Studio 2022 version 17.7 et versions ultérieures.

Exemple

Pour corriger l’exemple de code précédent, vérifiez que i+j vous ne pouvez pas dépasser. Par exemple :

void* SmallAlloc(int);

void foo(unsigned i, unsigned j)
{
    if (i > 100 || j > 100)
    {
        return;
    }

    unsigned size = i + j;

    if (size > 50)
    {
        return;
    }

    int* p = (int*)SmallAlloc(size + 5);
    p[j] = 5;
}

Voir aussi

C26831
C26832