Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
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.