Dela via


Varning C26838

Allokeringsstorleken är resultatet av en signerad till osignerad begränsad konvertering som kan leda till spill om det signerade värdet är negativt.

Den här varningen lades till i Visual Studio 2022 version 17.13.

Anmärkningar

Rapporterar att den angivna storleken för en allokering kan vara resultatet av konverteringen av ett eventuellt negativt signerat värde till ett osignerat värde. Till exempel:

void* CustomAlloc(size_t);

int* CreateIntArray(int numberOfElements)
{
    int* p = (int*)CustomAlloc(numberOfElements * sizeof(int)); // Warning: C26838

    return p;
}

Uttrycket numberOfElements * sizeof(int), numberOfElements är signerat och sizeof(int) är osignerat. På 64-bitarsdatorer höjs numberOfElements upp till ett osignerat värde multiplicerat med sizeof(int). När numberOfElements är negativt kan det resulterande värdet spillas över eller få oväntade resultat när det skickas till CustomAlloc.

Den här kontrollen gäller för vanliga allokeringsfunktioner som new, mallococh VirtualAlloc. Kontrollen gäller även för anpassade allokeringsfunktioner som har alloc (skiftlägesokänsliga) i funktionsnamnet.

Den här kontrollen kan ibland inte identifiera att vissa kontroller kan förhindra spill eftersom kontrollen är konservativ.

Exempel

Om du vill åtgärda det tidigare kodexemplet där numberOfElements * sizeof(int) kan spilla över på grund av ett negativt signerat värde introducerar du en kontroll för att säkerställa att det inte gör det. Till exempel:

void* CustomAlloc(size_t);

int* CreateIntArray(int numberOfElements)
{
    if (numberOfElements < 0)
        return nullptr;

    int* p = (int*)CustomAlloc(numberOfElements * sizeof(int));
    // ...
    return p;
}

I föregående exempel adresserar sökning efter ett negativt värde C26832 varning. Beroende på storleken på de typer som ingår kan den här kontrollen resultera i en annan varning, till exempel C26831. I ett 32-bitarssystem är till exempel både int och size_t 32 bitar, så resultatet av multiplikationen kan fortfarande flöda över utan negativa värden.

Se även

C26831
C26832
C26833
C26833