Uninitialized Variables
Basic Information
Wazo kuu hapa ni kuelewa kinachotokea na mabadiliko yasiyoanzishwa kwani yatakuwa na thamani ambayo tayari ilikuwa katika kumbukumbu iliyotengwa kwao. Mfano:
Kazi 1:
initializeVariable
: Tunatangaza mabadilikox
na kupewa thamani, tuseme0x1234
. Kitendo hiki ni sawa na kuhifadhi mahali katika kumbukumbu na kuweka thamani maalum ndani yake.Kazi 2:
useUninitializedVariable
: Hapa, tunatangaza mabadiliko menginey
lakini hatupeleki thamani yoyote. Katika C, mabadiliko yasiyoanzishwa hayapewi moja kwa moja thamani sifuri. Badala yake, yanabaki na thamani yoyote iliyokuwa imehifadhiwa mwisho katika eneo lao la kumbukumbu.
Tunapokimbia kazi hizi mbili mfululizo:
Katika
initializeVariable
,x
inapata thamani (0x1234
), ambayo inachukua anwani maalum ya kumbukumbu.Katika
useUninitializedVariable
,y
inatangazwa lakini haipati thamani, hivyo inachukua mahali pa kumbukumbu moja baada yax
. Kwa sababu ya kutokuwekay
, inamaliza "kurithi" thamani kutoka eneo lile lile la kumbukumbu lililotumiwa nax
, kwa sababu hiyo ndiyo thamani ya mwisho iliyokuwepo.
Tabia hii inaonyesha dhana muhimu katika programu za kiwango cha chini: Usimamizi wa kumbukumbu ni muhimu, na mabadiliko yasiyoanzishwa yanaweza kusababisha tabia isiyotabirika au udhaifu wa usalama, kwani yanaweza bila kukusudia kushikilia data nyeti iliyobaki katika kumbukumbu.
Mabadiliko yasiyoanzishwa katika stack yanaweza kuleta hatari kadhaa za usalama kama:
Kuvuja kwa Data: Taarifa nyeti kama nywila, funguo za usimbuaji, au maelezo binafsi yanaweza kufichuliwa ikiwa yatahifadhiwa katika mabadiliko yasiyoanzishwa, na kuwapa washambuliaji uwezo wa kusoma data hii.
Ufunuo wa Taarifa: Maudhui ya mabadiliko yasiyoanzishwa yanaweza kufichua maelezo kuhusu mpangilio wa kumbukumbu wa programu au operesheni za ndani, na kusaidia washambuliaji katika kuendeleza mashambulizi yaliyolengwa.
Kuanguka na Kutokuwa na Utulivu: Operesheni zinazohusisha mabadiliko yasiyoanzishwa zinaweza kusababisha tabia isiyofafanuliwa, na kusababisha kuanguka kwa programu au matokeo yasiyotabirika.
Utendaji wa Nambari Isiyo na Mpangilio: Katika hali fulani, washambuliaji wanaweza kutumia udhaifu huu kubadilisha mtiririko wa utekelezaji wa programu, na kuwapa uwezo wa kutekeleza nambari isiyo na mpangilio, ambayo inaweza kujumuisha vitisho vya utekelezaji wa nambari ya mbali.
Example
Jinsi Hii Inavyofanya Kazi:
initializeAndPrint
Kazi: Kazi hii inatangaza kiambato cha nambariinitializedVar
, inakipatia thamani100
, na kisha inachapisha anwani ya kumbukumbu na thamani ya kiambato. Hatua hii ni rahisi na inaonyesha jinsi kiambato kilichowekwa thamani kinavyofanya kazi.demonstrateUninitializedVar
Kazi: Katika kazi hii, tunatangaza kiambato cha nambariuninitializedVar
bila kukiweka thamani. Tunapojaribu kuchapisha thamani yake, matokeo yanaweza kuonyesha nambari isiyo ya kawaida. Nambari hii inawakilisha data yoyote iliyokuwa hapo awali katika eneo hilo la kumbukumbu. Kulingana na mazingira na mkusanyiko, matokeo halisi yanaweza kutofautiana, na wakati mwingine, kwa usalama, baadhi ya wakusanyaji wanaweza kuanzisha kiambato kuwa sifuri, ingawa hii haipaswi kutegemewa.main
Kazi: Kazi yamain
inaita kazi zote mbili hapo juu kwa mpangilio, ikionyesha tofauti kati ya kiambato kilichowekwa thamani na kisichowekwa thamani.
Mfano wa ARM64
Hii haibadilishi hata kidogo katika ARM64 kwani viambato vya ndani pia vinashughulikiwa katika stack, unaweza kuangalia mfano huu ambapo hii inaonyeshwa.
Last updated