Boshlanmagan o'zgaruvchi - Uninitialized variable

Yilda hisoblash, an boshlanmagan o'zgaruvchi a o'zgaruvchan e'lon qilingan, lekin ishlatilishidan oldin ma'lum ma'lum qiymatga o'rnatilmagan. Bu bo'ladi biroz qiymat, ammo taxmin qilinadigan qiymat emas. Shunday qilib, bu dasturiy xato va umumiy manba xatolar dasturiy ta'minotda.

C tiliga misol

Ajam dasturchilar tomonidan qabul qilingan umumiy taxmin shundan iboratki, barcha o'zgaruvchilar e'lon qilinganida ma'lum qiymatga, masalan, nolga o'rnatiladi. Bu ko'plab tillar uchun to'g'ri bo'lsa-da, ularning barchasi uchun bu to'g'ri emas va shuning uchun xato ehtimoli mavjud. Kabi tillar C foydalanish suyakka o'zgaruvchilar uchun bo'sh joy va pastki dastur uchun ajratilgan o'zgaruvchilar to'plami a sifatida tanilgan suyakka ramkasi. Kompyuter stek doirasi uchun tegishli joyni ajratib tursa-da, odatda bu qiymatni sozlash orqali amalga oshiriladi suyakka ko'rsatgich, va o'rnatmaydi xotira o'zi har qanday yangi holatga (odatda samaradorlikka bog'liq bo'lmagan). Shuning uchun, ushbu xotiraning har qanday tarkibi o'sha manzillarni egallagan o'zgaruvchilarning boshlang'ich qiymatlari sifatida paydo bo'ladi.

Mana oddiy misol C:

bekor hisoblash( bekor ){    int k, men;        uchun (men = 0; men < 10; men++)    {        k = k + 1;    }        printf("% d", k);}

Ning yakuniy qiymati k aniqlanmagan. 10 bo'lishi kerak degan javob, u noldan boshlangan deb taxmin qiladi, bu haqiqat bo'lishi mumkin yoki bo'lmasligi mumkin. Masalan, o'zgaruvchiga e'tibor bering men ning birinchi bandi bilan nolga tenglashtiriladi uchun bayonot.

Muammo paytida yana bir misol bo'lishi mumkin tuzilmalar. Quyidagi kod parchasida bizda tizimli talaba unda talaba haqidagi ma'lumotlarni tavsiflovchi ba'zi o'zgaruvchilar mavjud. Funktsiya registr_student xotirasini yo'qotadi, chunki u a'zolarni to'liq ishga tushirolmaydi struct student new_student. Agar yaqindan ko'rib chiqsak, boshida, yoshi, semestr va talaba_nomiri boshlangan. Ammo boshlash ism va familiya a'zolar noto'g'ri. Buning sababi shundaki ism va familiya belgilar qatorlari 16 baytdan kam, davomida strcpy, biz ushbu har bir a'zo uchun ajratilgan 16 baytli xotirani to'liq ishga tushirolmaymiz. Shuning uchun memcpy ()natijada paydo bo'lgan struct to chiqish, biz qo'ng'iroq qiluvchiga bir nechta stack xotirasini yuboramiz.

tuzilmaviy talaba {    imzosiz int yoshi;    imzosiz int semestr;    char ism[16];    char familiya[16];    imzosiz int talaba_nomiri;};int registr_student(tuzilmaviy talaba *chiqish, int yoshi, char *ism, char *familiya){    // Agar ushbu ko'rsatkichlardan birortasi Null bo'lsa, biz muvaffaqiyatsiz bo'lamiz.    agar (!chiqish || !ism || !familiya)    {        printf("Xato! n");        qaytish -1;    }    // Biz satrlar uzunligi 16 baytdan kamligiga ishonch hosil qilamiz (shu jumladan, null-bayt)    toshib ketmasligi uchun //    agar (strlen(ism) > 15 ||  strlen(familiya) > 15) {      printf("name_name va last_name 16 belgidan oshmasligi kerak! n");      qaytish -1;    }    // A'zolarni initsializatsiya qilish    tuzilmaviy talaba yangi_talabasi;    yangi_talabasi.yoshi = yoshi;    yangi_talabasi.semestr = 1;    yangi_talabasi.talaba_nomiri = yangi_talabalar_sonlari();        strcpy(yangi_talabasi.ism, ism);    strcpy(yangi_talabasi.familiya, familiya);    // natijani chiqarish uchun nusxalash    memcpy(chiqish, &yangi_talabasi, o'lchamlari(tuzilmaviy talaba));    qaytish 0;}


Qanday bo'lmasin, o'zgaruvchan bo'lsa ham bilvosita a uchun boshlangan sukut bo'yicha 0 ga o'xshash qiymat, bu odatda emas to'g'ri qiymat. Boshlang'ich qiymati qiymati standart bo'lsa, to'g'ri degani emas. (Biroq, 0 ga standart sozlamani o'rnatish ko'rsatkichlar va ko'rsatgichlar massivlari uchun to'g'ri amaliyotdir, chunki ularni asl qiymati to'g'ri holatga keltirilishidan oldin ularni bekor qiladi.) C-da, statik saqlash muddati aniq boshlanmagan o'zgaruvchilar nol (yoki ko'rsatgichlar uchun null).[1]

Ishlab chiqarilmaydigan o'zgaruvchilar xatolarning tez-tez sababi bo'libgina qolmay, balki bunday xato ayniqsa jiddiy, chunki uni takrorlash mumkin emas: masalan, o'zgaruvchi faqat ba'zi birlarida initsializatsiyalangan bo'lib qolishi mumkin filial dasturning. Ba'zi hollarda, boshlanmagan o'zgaruvchilarga ega dasturlar hatto o'tishi mumkin dasturiy ta'minot sinovlari.

Ta'sir

Ishga tushirilmagan o'zgaruvchilar kuchli xatolardir, chunki ular o'zboshimchalik bilan xotirani chiqarib yuborish yoki o'zboshimchalik bilan xotiraning ustiga yozish yoki kod bajarilishini ta'minlash uchun ishlatilishi mumkin. Foydalanadigan dasturiy ta'minotdan foydalanishda manzil maydoni tartibini tasodifiylashtirish, ko'pincha bilish kerak asosiy manzil xotiradagi dasturiy ta'minot. Dasturiy ta'minotni ko'rsatgichni uning ichidan chiqarib yuborishga majbur qilish uchun boshlanmagan o'zgaruvchidan foydalanish manzil maydoni ASLRni chetlab o'tish uchun ishlatilishi mumkin.

Tillarda foydalaning

Boshlanmagan o'zgaruvchilar uchun mo'ljallangan assambleya tili, C va C ++ kabi tillarda alohida muammo hisoblanadi tizimlarni dasturlash. Ushbu tillarning rivojlanishi dizayn falsafasini o'z ichiga olgan bo'lib, unda ishlash va xavfsizlik o'rtasidagi ziddiyatlar odatda ishlash foydasiga hal qilindi. Dasturchiga ishga tushirilmagan o'zgaruvchilar kabi xavfli masalalardan xabardor bo'lish yuklatildi.

Boshqa tillarda o'zgaruvchilar ko'pincha yaratilganda ma'lum qiymatlarga moslashtiriladi. Bunga misollar:

  • VHDL barcha standart o'zgaruvchilarni maxsus "U" qiymatiga moslashtiradi. U simulyatsiyada, disk raskadrovka uchun foydalanuvchiga qachon bo'lganligini bilish uchun ishlatiladi parvo qilmang orqali dastlabki qiymatlar ko'p qiymatli mantiq, chiqishga ta'sir qiladi.
  • Java boshlanmagan o'zgaruvchilarga ega emas. Aniq boshlovchi va massiv elementlari bo'lmagan sinflar va ob'ektlarning maydonlari avtomatik ravishda ularning turi uchun standart qiymat bilan boshlanadi (mantiqiy uchun false, barcha raqamli turlar uchun 0, barcha mos yozuvlar turlari uchun null).[2] Java-dagi mahalliy o'zgaruvchilar ularga kirishdan oldin aniq tayinlangan bo'lishi kerak yoki bu kompilyatsiya xatosi.
  • Python mahalliy o'zgaruvchilarni initsializatsiya qiladi NULL (dan ajralib turadi Yo'q) va ko'taradi UnboundLocalError bunday o'zgaruvchiga haqiqiy qiymatni boshlashdan oldin (qayta) boshlashdan oldin.
  • D. dasturchi tomonidan aniq belgilanmagan bo'lsa, barcha o'zgaruvchilarni ishga tushiradi.

Hali boshlanmagan o'zgaruvchilarga ruxsat berilgan tillarda ham ko'p kompilyatorlar boshlanmagan o'zgaruvchilardan foydalanishni aniqlashga harakat qiladi va ularni quyidagicha xabar qiladi kompilyatsiya vaqtidagi xatolar.

Shuningdek qarang

Adabiyotlar

  1. ^ "ISO / IEC 9899: TC3 (amaldagi C standarti)" (PDF). 2007-09-07. p. 126. Olingan 2008-09-26.6.7.8-bo'lim, 10-band.
  2. ^ "Java tilining spetsifikatsiyasi: 4.12.5 o'zgaruvchilarning dastlabki qiymatlari". Quyosh mikrosistemalari. Olingan 2008-10-18.

Qo'shimcha o'qish

  • CWE-457 Ishga tushirilmagan o'zgaruvchidan foydalanish [1].