Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
, malloc
och 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.