Användarvisningsbild
Chloë
Administratör
Inlägg: 2505
Blev medlem: 08 okt 2014, 02:28
Områden: Webbsäkerhet
Kontakt: Twitter

Nulla ut variabler - hur och varför?

29 maj 2016, 22:01

Enligt säker kod så är det alltid rekommenderat att man nullar ut variabler som man inte längre ska använda (eller är klar med). Det enda jag kan förstå varför man borde nulla ut detta är för annars kan variabeldata kanske läcka ut men finns det andra anledningar?

Och sen med hur man egentligen ska göra. Bör man sätta värdet till NULL eller kan man avregistrera variabler på något globalt sätt?
keybase.io/dotchloe | chloe.re | chloe.website

Användarvisningsbild
topcat
Moderator
Inlägg: 333
Blev medlem: 06 nov 2014, 16:59
Områden: ja
Kontakt: Twitter

Re: Nulla ut variabler - hur och varför?

29 maj 2016, 22:37

Beror på programmeringsspråk. Till exempel är en nullpekare säkrare än en pekare som pekar på något som en gång var en strukt men numera kan vara vad som helst - då du inte (dynamiskt) kan kontrollera vad som finns i andra ändan av en nullpekare (det är ju definierat som null) och skulle denna råka derefereras kommer samma risk inte finnas som om den skulle råka peka på andra halvan av ett user-input buffer, t.ex.

Det är god stil i nästan alla språk att göra sig av med de variabler man är klar med - oftast motiveras detta med minnesanvändning. I skräphanterande språk så görs detta per automatik och då finns inte samma vana i huvudet på de som programmerar att manuellt avlägsna. Här litar man på att språkets skräphanterare/insamlare löser detta.
🦊️

Arabies
Inlägg: 83
Blev medlem: 18 mar 2016, 09:42

Re: Nulla ut variabler - hur och varför?

22 sep 2016, 14:11

Ur säkerhetssynpunkt är det helt enkelt så att variabeldata ändå finns kvar i minnet även om du låter objektet själv droppa ur scope och blir GC:ad/kör en free(). En processdump kommer då spy ur sig en hel del, och en dump av fysiskt minne ännu mer.

Användarvisningsbild
vLK
Inlägg: 13
Blev medlem: 12 jan 2016, 21:32

Re: Nulla ut variabler - hur och varför?

12 nov 2016, 21:00

Detta eftersom NULL (i C, typiskt ((void *)0), men kan variera) har den speciella betydelsen som ett ogiltligt/oanvändbart pekarvärde. Att dereferera NULL kommer fortfarande resultera i SIGSEGV men det hjälper omringande kod att orientera sig efter pekarvärden. Alternativet är att pekaren innehåller möjliga garbagevärden annars lokerade i stackminnet.

Det är stödhjul för nya programmerare. Det kan göra C kod mer säker i de fall programmeraren annars glömmer något / gör en miss. Somliga går längre och zero-intialiserar adresserat minne (calloc,malloc+memset) utan anledning. Inte jag och jag NULL-initialiserar inte pekare.

Arabies
Inlägg: 83
Blev medlem: 18 mar 2016, 09:42

Re: Nulla ut variabler - hur och varför?

08 dec 2016, 21:16

vLK skrev:Detta eftersom NULL (i C, typiskt ((void *)0), men kan variera) har den speciella betydelsen som ett ogiltligt/oanvändbart pekarvärde. Att dereferera NULL kommer fortfarande resultera i SIGSEGV men det hjälper omringande kod att orientera sig efter pekarvärden. Alternativet är att pekaren innehåller möjliga garbagevärden annars lokerade i stackminnet.

Det är stödhjul för nya programmerare. Det kan göra C kod mer säker i de fall programmeraren annars glömmer något / gör en miss. Somliga går längre och zero-intialiserar adresserat minne (calloc,malloc+memset) utan anledning. Inte jag och jag NULL-initialiserar inte pekare.


Nja, att NULL-initialisera är ett krav för att kunna göra en safe-release, t.ex, och kan användas i flera fall än så för att avgöra om pekaren är initialiserad eller inte. Enklaste exemplet är if(myPtr != NULL) { myPtr->Release(); myPtr = NULL; }. Arbetar du med t.ex aggregates blir din kod både enklare och säkrare med ett liknande mönster i destruktorn. Ett krav för att detta ska funka är null-initialisering.
Det är absolut inget stödhjul för nya programmerare.

dud380
Inlägg: 1
Blev medlem: 10 mar 2016, 21:15

Re: Nulla ut variabler - hur och varför?

28 dec 2016, 20:44

Man gör så med pekarvariabler i c/c++ för att man inte av misstag ska anropa free fler än en gång på samma minnesadress(s.k. Double Free), vilket leder till att programmets minneshanteringsstruktur blir korrupt, vilket i sin tur kan leda till att exekveringsflödet kan ändras till att köra illasinnad kod. Det är dock säkert att göra free på null.

Med vanliga variabler finns det ingen anledning att göra det.

Arabies skrev:Ur säkerhetssynpunkt är det helt enkelt så att variabeldata ändå finns kvar i minnet även om du låter objektet själv droppa ur scope och blir GC:ad/kör en free(). En processdump kommer då spy ur sig en hel del, och en dump av fysiskt minne ännu mer.


Även om du gör free och sätter pekaren till null kommer data fortfarande ligga kvar i minnet.

Arabies
Inlägg: 83
Blev medlem: 18 mar 2016, 09:42

Re: Nulla ut variabler - hur och varför?

30 dec 2016, 14:38

dud380 skrev:Även om du gör free och sätter pekaren till null kommer data fortfarande ligga kvar i minnet.


Ja, när rubriken handlade om "nulla variabler" tolkade jag det som att sätta minnesområdet som pekas på till noll, inte pekaren själv.

Användarvisningsbild
ttt
Respekterad Medlem
Inlägg: 121
Blev medlem: 19 jan 2015, 01:27

Re: Nulla ut variabler - hur och varför?

30 dec 2016, 21:57

Arabies skrev:
Ja, när rubriken handlade om "nulla variabler" tolkade jag det som att sätta minnesområdet som pekas på till noll, inte pekaren själv.


Har aldrig hört uttrycket "nulla ut" användas till något annat. "Nulla pekaren" säger man väl annars.


vLK skrev:Det är stödhjul för nya programmerare. Det kan göra C kod mer säker i de fall programmeraren annars glömmer något / gör en miss. Somliga går längre och zero-intialiserar adresserat minne (calloc,malloc+memset) utan anledning. Inte jag och jag NULL-initialiserar inte pekare.

... menar du à la C89 nu och avståndet mellan initiering av pekare till första användning, eller när då?

Användarvisningsbild
vLK
Inlägg: 13
Blev medlem: 12 jan 2016, 21:32

Re: Nulla ut variabler - hur och varför?

11 aug 2017, 22:06

... menar du à la C89 nu och avståndet mellan initiering av pekare till första användning, eller när då?
Vad jag menade var att kategoriskt initialisera pekare till värdet NULL ofta (tycker jag) är något rent vidskepligt. I alla fall då det rör sig om pekare som direkt skall interagera med e.g. libc, säg malloc, som kommer returnera ett korrekt (NULL-värde) skulle malloc misslyckas.

Sedan att NULL-pekare fyller sin funktion i abstrakta datatyper, t.ex listor, för att markera listans slut, med mera, det är sant. De fall jag i min kommentar tänkte på rör inte dessa mer uttryckliga bruk av NULL-pekare.