ကုဒ်အမှားအယွင်းများကို ရှာဖွေဖော်ထုတ်ရန် Intel ၏ ပွင့်လင်းသောအရင်းအမြစ်ဖြစ်သော ControlFlag စက်သင်ယူမှုစနစ်

Intel သည် ကုဒ်အရည်အသွေးကို မြှင့်တင်ရန်အတွက် စက်သင်ယူမှုစနစ်ဖန်တီးရန် ရည်ရွယ်သည့် ControlFlag သုတေသနပရောဂျက်နှင့် ဆက်စပ်သော တိုးတက်မှုများကို ရှာဖွေတွေ့ရှိခဲ့သည်။ ပရောဂျက်မှ ပြင်ဆင်ထားသော ကိရိယာတန်ဆာပလာသည် C/C++ ကဲ့သို့သော အဆင့်မြင့်ဘာသာစကားများဖြင့် ရေးသားထားသော ရင်းမြစ်စာသားများတွင် အမှားအယွင်းများနှင့် ကွဲလွဲချက်များကို ဖော်ထုတ်ရန် များပြားသောရှိပြီးသားကုဒ်များစွာကို လေ့ကျင့်ထားသော မော်ဒယ်လ်တစ်ခုအပေါ် အခြေခံ၍ ခွင့်ပြုသည်။ စနစ်သည် ကုဒ်တွင် ပြဿနာအမျိုးမျိုးကို ခွဲခြားသတ်မှတ်ရန်၊ typos ခွဲခြားသတ်မှတ်ခြင်းနှင့် မှားယွင်းသောအမျိုးအစားပေါင်းစပ်မှုများမှ၊ ညွှန်ပြချက်များနှင့် မှတ်ဉာဏ်ပြဿနာများတွင် ပျောက်ဆုံးနေသော NULL တန်ဖိုးစစ်ဆေးမှုများကို ဖော်ထုတ်ရန်အတွက် သင့်လျော်သည်။ ControlFlag ကုဒ်ကို C++ ဖြင့်ရေးသားထားပြီး MIT လိုင်စင်အောက်တွင် open source ဖြစ်သည်။

စနစ်သည် GitHub နှင့် အလားတူ အများသူငှာ သိုလှောင်ရာနေရာများတွင် ထုတ်ဝေထားသော အဖွင့်အရင်းအမြစ်ပရောဂျက်များ၏ လက်ရှိကုဒ်ခင်းကျင်းမှု၏ ကိန်းဂဏန်းပုံစံတစ်ခုကို တည်ဆောက်ခြင်းဖြင့် ကိုယ်တိုင်သင်ယူခြင်းဖြစ်သည်။ လေ့ကျင့်ရေးအဆင့်တွင်၊ စနစ်သည် ကုဒ်အတွင်း တည်ဆောက်မှုများအတွက် ပုံမှန်ပုံစံများကို ဆုံးဖြတ်ပေးပြီး ပရိုဂရမ်အတွင်းရှိ ကုဒ်လုပ်ဆောင်မှု စီးဆင်းမှုကို ရောင်ပြန်ဟပ်ကာ ဤပုံစံများကြားတွင် ချိတ်ဆက်မှု၏ syntactic tree တစ်ခုကို တည်ဆောက်သည်။ ရလဒ်အနေဖြင့်၊ ခွဲခြမ်းစိတ်ဖြာထားသော အရင်းအမြစ်ကုဒ်များအားလုံး၏ ဖွံ့ဖြိုးတိုးတက်မှုအတွေ့အကြုံကို ပေါင်းစပ်ထားသည့် ကိုးကားဆုံးဖြတ်ချက်ချသည့်သစ်ပင်ကို ဖွဲ့စည်းထားပါသည်။

ပြန်လည်သုံးသပ်မှုအောက်ရှိ ကုဒ်သည် ကိုးကားချက်ဆုံးဖြတ်ချက်သစ်ပင်ကို စစ်ဆေးသည့် ပုံစံများကို ခွဲခြားသတ်မှတ်သည့် အလားတူလုပ်ငန်းစဉ်ကို လုပ်ဆောင်သည်။ အနီးနားအကိုင်းအခက်များနှင့် ကြီးမားသော ကွဲလွဲမှုများသည် စစ်ဆေးသည့်ပုံစံတွင် ကွဲလွဲမှုတစ်ခုရှိနေခြင်းကို ဖော်ပြသည်။ စနစ်သည် ပုံစံပလိတ်တွင် အမှားအယွင်းတစ်ခုကို ခွဲခြားသိမြင်နိုင်ရုံသာမက ပြုပြင်မှုတစ်ခုကိုလည်း အကြံပြုနိုင်စေပါသည်။ ဥပမာအားဖြင့်၊ OpenSSL ကုဒ်တွင်၊ တည်ဆောက်မှု “(s1 == NULL) ∧ (s2 == NULL)” ကို ဖော်ထုတ်ခဲ့ပြီး၊ အထားအသိုသစ်ပင်တွင် ၈ ကြိမ်သာ ပေါ်ခဲ့ပြီး၊ တန်ဖိုးနှင့် အနီးစပ်ဆုံး အကိုင်းအခက်မှာ “(s8 ==)၊ NULL) || (s1 == NULL)” အကြိမ်ပေါင်း ၇ဝဝဝ ခန့် ဖြစ်ပွားခဲ့သည်။ စနစ်သည် “(s2 == NULL) | (s7 == NULL)” သစ်ပင်တွင် ၃၂ ကြိမ် ပေါ်လာသည်။

ကုဒ်အမှားအယွင်းများကို ရှာဖွေဖော်ထုတ်ရန် Intel ၏ ပွင့်လင်းသောအရင်းအမြစ်ဖြစ်သော ControlFlag စက်သင်ယူမှုစနစ်

ကုဒ်အပိုင်းအစကို ခွဲခြမ်းစိတ်ဖြာသည့်အခါ “if (x = 7) y = x;” ကိန်းဂဏာန်းတန်ဖိုးများကို နှိုင်းယှဉ်ရန်အတွက် “variable == number” တည်ဆောက်မှုကို အများအားဖြင့် “if” အော်ပရေတာတွင် အသုံးပြုကြောင်း စနစ်က ဆုံးဖြတ်ထားသောကြောင့်၊ ထို့ကြောင့် “if” expression ရှိ “variable = number” ဟူသော အမှတ်အသားသည် a ကြောင့်ဖြစ်နိုင်ချေများပါသည်။ စာစီစာရိုက် ရိုးရာအငြိမ်ခွဲခြမ်းစိတ်ဖြာသူများသည် ထိုသို့သောအမှားတစ်ခုကို ဖမ်းမိလိမ့်မည်၊ သို့သော် ၎င်းတို့နှင့်မတူဘဲ၊ ControlFlag သည် အဆင်သင့်လုပ်ထားသောစည်းမျဉ်းများကိုမကျင့်သုံးဘဲ ဖြစ်နိုင်သည့်ရွေးချယ်မှုများအားလုံးကိုပံ့ပိုးရန်ခက်ခဲသော်လည်း အများအပြားရှိဖွဲ့စည်းပုံအမျိုးမျိုးအသုံးပြုမှုစာရင်းဇယားများအပေါ်အခြေခံထားသည်။ စီမံကိန်းများ။

စမ်းသပ်မှုတစ်ခုအနေဖြင့်၊ အရည်အသွေးမြင့်ပြီး စမ်းသပ်ထားသောကုဒ်၏ နမူနာအဖြစ် မကြာခဏကိုးကားလေ့ရှိသည့် cURL utility ၏အရင်းအမြစ်ကုဒ်တွင် ControlFlag ကိုအသုံးပြု၍ တည်ဆောက်ပုံဒြပ်စင် "s->keepon" ကိုအသုံးပြုသောအခါတွင် static ခွဲခြမ်းစိတ်ဖြာသူမှမတွေ့ရှိနိုင်သောအမှားတစ်ခုတွေ့ရှိခဲ့သည်၊ ဂဏန်းအမျိုးအစားတစ်ခုပါရှိသော်လည်း Boolean တန်ဖိုး TRUE နှင့် နှိုင်းယှဉ်ထားသည်။ OpenSSL ကုဒ်တွင်၊ အထက်ဖော်ပြပါ ပြဿနာအပြင် "(s1 == NULL) ∧ (s2 == NULL)" နှင့် "(-2 == rv)" ဟူသော စကားရပ်များတွင် ကွဲလွဲချက်များကိုလည်း ဖော်ထုတ်ခဲ့သည် (အနုတ်သည် typo) နှင့် "BIO_puts(bp, ":")

source: opennet.ru

မှတ်ချက် Add