PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
PVS-Studio ခွဲခြမ်းစိတ်ဖြာမှုကို အသုံးပြုခြင်းအတွက် လက်ရှိအခြေအနေများထဲမှတစ်ခုမှာ CI စနစ်များနှင့် ပေါင်းစည်းခြင်းဖြစ်ပါသည်။ PVS-Studio ပရောဂျက်တစ်ခုအား စဉ်ဆက်မပြတ်ပေါင်းစည်းမှုစနစ်နီးပါးမှ ခွဲခြမ်းစိတ်ဖြာမှုအချို့ကို အမိန့်ပေးရုံအနည်းငယ်ဖြင့် တည်ဆောက်နိုင်သော်လည်း ဤလုပ်ငန်းစဉ်ကို ပိုမိုအဆင်ပြေစေရန် ကျွန်ုပ်တို့ ဆက်လက်လုပ်ဆောင်ပါသည်။ PVS-Studio သည် ယခုအခါ ခွဲခြမ်းစိတ်ဖြာမှုအထွက်အား TeamCity - TeamCity စစ်ဆေးရေးအမျိုးအစားအတွက် ဖော်မက်အဖြစ်သို့ ပြောင်းလဲရန်အတွက် ပံ့ပိုးမှုရှိပါသည်။ ဘယ်လိုအလုပ်လုပ်လဲ ကြည့်ရအောင်။

အသုံးပြုတဲ့ဆော့ဖ်ဝဲနဲ့ပတ်သက်တဲ့အချက်အလက်

PVS-Studio မှ — အမျိုးမျိုးသောအမှားများကိုရှာဖွေခြင်းနှင့်ပြုပြင်ခြင်းလုပ်ငန်းတာဝန်ကိုလွယ်ကူချောမွေ့စေရန်ဒီဇိုင်းပြုလုပ်ထားသော C, C++, C# နှင့် Java ကုဒ်များ၏တည်ငြိမ်သောခွဲခြမ်းစိတ်ဖြာသူ။ ခွဲခြမ်းစိတ်ဖြာသူအား Windows၊ Linux နှင့် macOS တို့တွင် အသုံးပြုနိုင်သည်။ ဤဆောင်းပါးတွင် ကျွန်ုပ်တို့သည် ခွဲခြမ်းစိတ်ဖြာသူကိုယ်တိုင်သာမက ၎င်း၏ဖြန့်ဖြူးမှုမှ အသုံးဝင်မှုအချို့ကိုလည်း တက်ကြွစွာအသုံးပြုပါမည်။

CLMonitor — compiler လွှင့်တင်မှုကို စောင့်ကြည့်စစ်ဆေးသည့် စောင့်ကြည့်ဆာဗာတစ်ခုဖြစ်သည်။ သင့်ပရောဂျက်ကို မတည်ဆောက်မီ ၎င်းကို ချက်ချင်းလုပ်ဆောင်ရပါမည်။ snooping မုဒ်တွင်၊ ဆာဗာသည် ပံ့ပိုးပေးထားသော compiler များအားလုံး၏ လုပ်ဆောင်ချက်များကို ကြားဖြတ်မည်ဖြစ်သည်။ ဤ utility ကို C/C++ ပရောဂျက်များကိုခွဲခြမ်းစိတ်ဖြာရန်သာအသုံးပြုနိုင်သည်မှာမှတ်သားထိုက်သည်။

PlogConverter - ခွဲခြမ်းစိတ်ဖြာမှုအစီရင်ခံစာများကို မတူညီသောဖော်မတ်များအဖြစ်သို့ ပြောင်းလဲခြင်းအတွက် အသုံးဝင်မှုတစ်ခု။

ပရောဂျက်နှင့်ပတ်သက်သော အချက်အလက်များကို လေ့လာနိုင်ပါသည်။

လက်တွေ့နမူနာတစ်ခုတွင် ဤလုပ်ဆောင်ချက်ကို စမ်းကြည့်ကြပါစို့ - OpenRCT2 ပရောဂျက်ကို ခွဲခြမ်းစိတ်ဖြာကြည့်ကြပါစို့။

OpenRCT2 - RollerCoaster Tycoon 2 (RCT2) ဂိမ်းကို လုပ်ဆောင်ချက်အသစ်များဖြင့် ချဲ့ထွင်ကာ ချို့ယွင်းချက်များကို ပြုပြင်ပေးသည့် ဂိမ်းကို ပွင့်လင်းစွာ အကောင်အထည်ဖော်ခြင်း။ ဂိမ်းကစားခြင်းသည် စီးနင်းမှုများ၊ ဈေးဆိုင်များနှင့် အဆောက်အဦများပါရှိသော အပန်းဖြေဥယျာဉ်ကို တည်ဆောက်ခြင်းနှင့် ထိန်းသိမ်းခြင်းတို့ကို လှည့်ပတ်သည်။ ကစားသမားသည် ဧည့်သည်များကို ပျော်ရွှင်စေရန်နှင့် ပန်းခြံ၏ နာမည်ကောင်းကို ထိန်းသိမ်းကာ အမြတ်အစွန်းရအောင် ကြိုးစားရမည်ဖြစ်သည်။ OpenRCT2 သည် သင့်အား ဇာတ်လမ်းများနှင့် sandbox နှစ်ခုလုံးတွင် ကစားရန် ခွင့်ပြုသည်။ ဇာတ်လမ်းများသည် ကစားသမားအား သတ်မှတ်အချိန်အတွင်း တိကျသောလုပ်ငန်းတာဝန်တစ်ခုပြီးမြောက်ရန် လိုအပ်သော်လည်း Sandbox သည် ကစားသမားအား ကန့်သတ်ချက်များ သို့မဟုတ် ငွေကြေးတစ်စုံတစ်ရာမရှိဘဲ ပိုမိုပြောင်းလွယ်ပြင်လွယ်ရှိသောပန်းခြံကို တည်ဆောက်နိုင်စေပါသည်။

သင့်အောင်လုပ်ခြင်း

အချိန်ကုန်သက်သာရန်အတွက်၊ ကျွန်ုပ်သည် ကျွန်ုပ်၏ကွန်ပြူတာတွင် TeamCity ဆာဗာကို လုပ်ဆောင်နေသည့်အချိန်မှ စတင်၍ တပ်ဆင်ခြင်းလုပ်ငန်းစဉ်ကို ကျော်သွားပေမည်။ ကျွန်ုပ်တို့သည် - localhost:{တပ်ဆင်ခြင်းလုပ်ငန်းစဉ်အတွင်း သတ်မှတ်ထားသော ဆိပ်ကမ်း} (ကျွန်ုပ်၏ကိစ္စတွင်၊ localhost:9090) သို့သွား၍ ခွင့်ပြုချက်ဒေတာကို ထည့်ပါ။ ဝင်ပြီးနောက် ကျွန်ုပ်တို့အား နှုတ်ဆက်ပါမည်။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
Create Project ခလုတ်ကို နှိပ်ပါ။ ထို့နောက် Manually ကိုရွေးချယ်ပြီး ကွက်လပ်များကို ဖြည့်စွက်ပါ။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
ခလုတ်ကိုနှိပ်ပြီးနောက် ဖန်တီးဆက်တင်များဖြင့် ပြတင်းပေါက်မှ ကြိုဆိုပါသည်။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
နှိပ်ကြည့်ရအောင် တည်ဆောက်မှုပုံစံကို ဖန်တီးပါ။.

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
ကွက်လပ်များကိုဖြည့်ပြီး ကလစ်နှိပ်ပါ။ ဖန်တီး. ဗားရှင်းထိန်းချုပ်မှုစနစ်ကို ရွေးချယ်ရန် သင့်အား တောင်းဆိုနေသည့် ဝင်းဒိုးတစ်ခုကို ကျွန်ုပ်တို့တွေ့မြင်ရသည်။ အရင်းအမြစ်များသည် ဒေသအလိုက် တည်ရှိနေပြီဖြစ်သောကြောင့်၊ နှိပ်ပါ။ ကြိုးခုန်.

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
နောက်ဆုံးတွင်၊ ကျွန်ုပ်တို့သည် ပရောဂျက်ဆက်တင်များသို့ ဆက်သွားပါ။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
စုစည်းမှု အဆင့်များကို ပေါင်းထည့်ကြပါစို့။ Build အဆင့်များ -> တည်ဆောက်မှုအဆင့်ကို ထည့်ပါ။.

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
ဤနေရာတွင် ကျွန်ုပ်တို့ ရွေးချယ်သည်-

  • Runner အမျိုးအစား -> Command Line
  • Run -> Custom Script ကိုဖွင့်ပါ။

ပရောဂျက်စုစည်းမှုအတွင်း ကျွန်ုပ်တို့သည် ခွဲခြမ်းစိတ်ဖြာမှုကို လုပ်ဆောင်မည်ဖြစ်သောကြောင့် စုစည်းမှုနှင့် ခွဲခြမ်းစိတ်ဖြာမှုသည် အဆင့်တစ်ဆင့်ဖြစ်သင့်သောကြောင့် ကွက်လပ်တွင် ဖြည့်စွက်ပါ။ စိတ်ကြိုက် Script:

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
နောက်ပိုင်းတွင် တစ်ဦးချင်း အဆင့်များကို ကြည့်ပါမည်။ ခွဲခြမ်းစိတ်ဖြာသူအား တင်ခြင်း၊ ပရောဂျက်ကို စုစည်းခြင်း၊ ခွဲခြမ်းစိတ်ဖြာခြင်း၊ အစီရင်ခံစာကို ထုတ်ပေးခြင်းနှင့် ဖော်မတ်ချခြင်းတို့သည် ကုဒ် ဆယ့်တစ်လိုင်းသာ ယူရန် အရေးကြီးပါသည်။

နောက်ဆုံးလုပ်ရမှာက Environment variable တွေကို သတ်မှတ်ပြီး သူတို့ရဲ့ ဖတ်ရှုနိုင်မှုကို မြှင့်တင်ဖို့ နည်းလမ်းတချို့ကို ဖော်ပြပေးထားပါတယ်။ ဒါကိုလုပ်ဖို့၊ ဆက်သွားကြရအောင်- ကန့်သတ်ချက်များ -> ပါရာမီတာအသစ်ထည့်ပါ။ နှင့် variable သုံးခုပေါင်းထည့်ပါ။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
သင်လုပ်ရန်မှာခလုတ်ကိုနှိပ်ပါ။ ပွေးသှား ညာဘက်အပေါ်ထောင့်မှာ။ ပရောဂျက်ကို စုစည်းပြီး ခွဲခြမ်းစိတ်ဖြာနေချိန်မှာ ဇာတ်ညွှန်းအကြောင်း ပြောပြမယ်။

တိုက်ရိုက်ပဲဗျ။

ဦးစွာ၊ ကျွန်ုပ်တို့သည် နောက်ဆုံးပေါ် PVS-Studio ဖြန့်ဖြူးမှုကို ဒေါင်းလုဒ်လုပ်ရန် လိုအပ်သည်။ ၎င်းအတွက် ကျွန်ုပ်တို့သည် Chocolatey ပက်ကေ့ဂျ်မန်နေဂျာကို အသုံးပြုပါသည်။ ဒီအကြောင်းကို ပိုသိချင်သူတွေအတွက်တော့ သက်ဆိုင်ရာတစ်ခုရှိပါတယ်။ ဆောင်းပါး:

choco install pvs-studio -y

ထို့နောက်၊ CLMonitor ပရောဂျက်တည်ဆောက်ခြေရာခံခြင်း utility ကိုဖွင့်ကြပါစို့။

%CLmon% monitor –-attach

ထို့နောက် ကျွန်ုပ်တို့သည် ပရောဂျက်ကို ပတ်ဝန်း ကျင်ပြောင်းလဲမှုအဖြစ် တည်ဆောက်ပါမည်။ MSB ငါတည်ဆောက်ရန်လိုအပ်သော MSBuild ဗားရှင်းသို့လမ်းကြောင်းဖြစ်သည်။

%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable

PVS-Studio အတွက် အကောင့်ဝင်ခြင်းနှင့် လိုင်စင်ကီးကို ထည့်ကြပါစို့။

%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%

တည်ဆောက်မှုပြီးသွားသောအခါ၊ ကြိုတင်လုပ်ဆောင်ပြီးသားဖိုင်များနှင့် static ခွဲခြမ်းစိတ်ဖြာမှုကို ဖန်တီးရန်အတွက် CLMonitor ကို ထပ်မံလုပ်ဆောင်ပါ။

%CLmon% analyze -l "c:ptest.plog"

ထို့နောက် ကျွန်ုပ်တို့၏ ဖြန့်ဖြူးမှုမှ အခြားသော အသုံးဝင်မှုများကို အသုံးပြုပါမည်။ PlogConverter သည် အစီရင်ခံစာကို စံဖော်မတ်မှ TeamCity သီးသန့်ဖော်မတ်သို့ ပြောင်းသည်။ ၎င်းကိုကျေးဇူးတင်ပါသည်၊ ၎င်းကို build window တွင် တိုက်ရိုက်ကြည့်ရှုနိုင်မည်ဖြစ်သည်။

%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"

နောက်ဆုံးအဆင့်မှာ ဖော်မတ်လုပ်ထားသော အစီရင်ခံစာကို ပြသရန်ဖြစ်သည်။ တကယTeamCity parser မှ ကောက်ယူမည့်နေရာတွင်၊

type "C:tempptest.plog_TeamCity.txt"

ဇာတ်ညွှန်းကုဒ်အပြည့်အစုံ-

choco install pvs-studio -y
%CLmon% monitor --attach
set platform=x64
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
%CLmon% analyze -l "c:ptest.plog"
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
type "C:tempptest.plog_TeamCity.txt"

ဤအတောအတွင်း၊ ပရောဂျက်၏ စည်းဝေးပွဲနှင့် ခွဲခြမ်းစိတ်ဖြာမှု အောင်မြင်စွာ ပြီးသွားသဖြင့် တက်ဘ်သို့ သွားနိုင်ပါသည်။ စီမံကိန်းများ သေချာအောင်လုပ်ပါ။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
ကဲ နှိပ်လိုက်ကြရအောင် စုစုပေါင်းစစ်ဆေးခြင်း။ခွဲခြမ်းစိတ်ဖြာသူ အစီရင်ခံစာကို ကြည့်ရှုရန်-

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
သတိပေးချက်များကို ရောဂါရှာဖွေရေးစည်းမျဉ်းနံပါတ်များဖြင့် အုပ်စုဖွဲ့ထားသည်။ ကုဒ်ကိုဖြတ်၍ သွားလာရန် သတိပေးချက်ဖြင့် လိုင်းနံပါတ်ကို နှိပ်ရပါမည်။ ညာဘက်အပေါ်ထောင့်ရှိ မေးခွန်းအမှတ်အသားကို နှိပ်ခြင်းဖြင့် စာရွက်စာတမ်းများပါရှိသော တက်ဘ်အသစ်တစ်ခုကို သင့်အား ဖွင့်ပေးမည်ဖြစ်သည်။ ခွဲခြမ်းစိတ်ဖြာမှုသတိပေးချက်ဖြင့် လိုင်းနံပါတ်ပေါ်တွင် နှိပ်ခြင်းဖြင့် သင်သည် ကုဒ်မှတစ်ဆင့် သွားလာနိုင်သည်။ အသုံးပြုသည့်အခါ အဝေးထိန်းကွန်ပြူတာမှ လမ်းကြောင်းပြနိုင်သည်။ အရင်းအမြစ်TreeRoot အမှတ်အသား။ ခွဲခြမ်းစိတ်ဖြာသူ၏ ဤလုပ်ဆောင်မှုပုံစံကို စိတ်ဝင်စားသူ မည်သူမဆို သက်ဆိုင်ရာကဏ္ဍနှင့် ရင်းနှီးနိုင်ပါသည်။ စာရွက်စာတမ်း.

ခွဲခြမ်းစိတ်ဖြာသူ၏ရလဒ်များကိုကြည့်ရှုခြင်း။

ယခု တည်ဆောက်မှုအား ဖြန့်ကျက်ပြီး ပြင်ဆင်သတ်မှတ်ခြင်း ပြီးသည်နှင့်၊ ကျွန်ုပ်တို့ ကြည့်ရှုနေသည့် ပရောဂျက်တွင် တွေ့ရှိရသည့် စိတ်ဝင်စားဖွယ် သတိပေးချက်အချို့ကို ကြည့်ပါ။

သတိပေးချက် N1

V773 [CWE-401] 'ရလဒ်' ညွှန်ပြချက်ကို မထုတ်ဘဲ ခြွင်းချက်အား ဖယ်ရှားခဲ့သည်။ Memory ယိုစိမ့်မှုဖြစ်နိုင်သည်။ libopenrct2 ObjectFactory.cpp ၄၄၃

Object* CreateObjectFromJson(....)
{
  Object* result = nullptr;
  ....
  result = CreateObject(entry);
  ....
  if (readContext.WasError())
  {
    throw std::runtime_error("Object has errors");
  }
  ....
}

Object* CreateObject(const rct_object_entry& entry)
{
  Object* result;
  switch (entry.GetType())
  {
    case OBJECT_TYPE_RIDE:
      result = new RideObject(entry);
      break;
    case OBJECT_TYPE_SMALL_SCENERY:
      result = new SmallSceneryObject(entry);
      break;
    case OBJECT_TYPE_LARGE_SCENERY:
      result = new LargeSceneryObject(entry);
      break;
    ....
    default:
      throw std::runtime_error("Invalid object type");
  }
  return result;
}

မမ်မိုရီကို ဒိုင်းနမစ်ခွဲဝေပေးပြီးနောက် ခွဲခြမ်းစိတ်ဖြာသူသည် အမှားတစ်ခုကို သတိပြုမိသည်။ CreateObjectခြွင်းချက်တစ်ခု ဖြစ်ပေါ်သောအခါ၊ မှတ်ဉာဏ်ကို မရှင်းလင်းဘဲ၊ မှတ်ဉာဏ်ယိုစိမ့်မှု ဖြစ်ပေါ်သည်။

သတိပေးချက် N2

V501 '|' ၏ ဘယ်ဘက်နှင့် ညာဘက်တွင် '(1ULL << WIDX_MONTH_BOX)' နှင့် ထပ်တူထပ်မျှသော စကားရပ်များ ရှိပါသည်။ အော်ပရေတာ။ libopenrct2ui Cheats.cpp ၄၈၇

static uint64_t window_cheats_page_enabled_widgets[] = 
{
  MAIN_CHEAT_ENABLED_WIDGETS |
  (1ULL << WIDX_NO_MONEY) |
  (1ULL << WIDX_ADD_SET_MONEY_GROUP) |
  (1ULL << WIDX_MONEY_SPINNER) |
  (1ULL << WIDX_MONEY_SPINNER_INCREMENT) |
  (1ULL << WIDX_MONEY_SPINNER_DECREMENT) |
  (1ULL << WIDX_ADD_MONEY) |
  (1ULL << WIDX_SET_MONEY) |
  (1ULL << WIDX_CLEAR_LOAN) |
  (1ULL << WIDX_DATE_SET) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_MONTH_UP) |
  (1ULL << WIDX_MONTH_DOWN) |
  (1ULL << WIDX_YEAR_BOX) |
  (1ULL << WIDX_YEAR_UP) |
  (1ULL << WIDX_YEAR_DOWN) |
  (1ULL << WIDX_DAY_BOX) |
  (1ULL << WIDX_DAY_UP) |
  (1ULL << WIDX_DAY_DOWN) |
  (1ULL << WIDX_MONTH_BOX) |  // <=
  (1ULL << WIDX_DATE_GROUP) |
  (1ULL << WIDX_DATE_RESET),
  ....
};

static ခွဲခြမ်းစိတ်ဖြာသူမှလွဲ၍ အခြားလူအနည်းငယ်က ဤအာရုံစူးစိုက်မှုစမ်းသပ်မှုကို အောင်မြင်နိုင်သည်။ ဤကော်ပီကူးထည့်ထားသော ဥပမာသည် ဤအကြောင်းကြောင့် အတိအကျ ကောင်းပါသည်။

သတိပေးချက်များ N3

V703 'RCT12BannerElement' မှဆင်းသက်လာသောအတန်းရှိ 'အလံများ' အကွက်သည် အခြေခံအတန်း 'RCT12TileElementBase' တွင် အကွက်ကို ထပ်ရေးသည်မှာ ထူးဆန်းပါသည်။ လိုင်းများကို စစ်ဆေးပါ- RCT12.h:570၊ RCT12.h:259။ libopenrct2 RCT12.h 570

struct RCT12SpriteBase
{
  ....
  uint8_t flags;
  ....
};
struct rct1_peep : RCT12SpriteBase
{
  ....
  uint8_t flags;
  ....
};

ဟုတ်ပါတယ်၊ base class နဲ့ descendant မှာ နာမည်တူတဲ့ variable ကိုသုံးတာက အမြဲတမ်း error မဟုတ်ပါဘူး။ သို့ရာတွင်၊ အမွေဆက်ခံခြင်းနည်းပညာကိုယ်တိုင်က မိဘအတန်းအစား၏ နယ်ပယ်အားလုံးသည် ကလေးအတန်းအစားတွင် ရှိနေသည်ဟု ယူဆသည်။ အမွေဆက်ခံသူတွင် အမည်တူ နယ်ပယ်များကို ကြေညာခြင်းဖြင့် ကျွန်ုပ်တို့သည် ရှုပ်ထွေးမှုများကို မိတ်ဆက်ပေးသည်။

သတိပေးချက် N4

V793 'imageDirection / 8' ကြေညာချက်၏ ရလဒ်သည် အခြေအနေ၏ အစိတ်အပိုင်းတစ်ခုဖြစ်ကြောင်း ထူးဆန်းပါသည်။ ဤဖော်ပြချက်အား အခြားအရာများနှင့် နှိုင်းယှဉ်ကြည့်သင့်သည်။ libopenrct2 ObservationTower.cpp ၃၈

void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
  if ((imageDirection / 8) && (imageDirection / 8) != 3)
  {
    ....
  }
  ....
}

အနီးကပ်ကြည့်ကြပါစို့။ စကားရပ် ပုံလမ်းညွှန်/၈ မှားရင် မှားလိမ့်မယ်။ ပုံလမ်းညွှန် အကွာအဝေး -7 မှ 7 အတွင်းရှိသည်။ ဒုတိယအပိုင်း- (imageDirection / 8) != ၃ စစ်ဆေးမှုများ ပုံလမ်းညွှန် အပိုင်းအခြားပြင်ပဖြစ်ခြင်းအတွက်- -31 မှ -24 နှင့် 24 မှ ​​31 အသီးသီး။ ဤနည်းဖြင့် အချို့သော အပိုင်းအခြားတစ်ခုတွင် နံပါတ်များပါဝင်ခြင်းအတွက် နံပါတ်များကို စစ်ဆေးခြင်းသည် ကျွန်ုပ်အတွက် အလွန်ထူးဆန်းပုံရပြီး၊ ဤကုဒ်အပိုင်းတွင် အမှားအယွင်းမရှိလျှင်ပင်၊ ဤအခြေအနေများကို ပိုမိုရှင်းလင်းစေရန် ပြန်လည်ရေးသားရန် အကြံပြုလိုပါသည်။ ၎င်းသည် ဤကုဒ်ကိုဖတ်ပြီး ထိန်းသိမ်းထားသူများအတွက် ဘဝကို ပိုမိုလွယ်ကူစေမည်ဖြစ်သည်။

သတိပေးချက် N5

V587 ဤကဲ့သို့သော တာဝန်များ၏ ထူးဆန်းသော အစီအစဥ်- A = B; B = A; လိုင်းများကို စစ်ဆေးပါ- 1115၊ 1118. libopenrct2ui MouseInput.cpp 1118

void process_mouse_over(....)
{
  ....
  switch (window->widgets[widgetId].type)
  {
    case WWT_VIEWPORT:
      ebx = 0;
      edi = cursorId;                                 // <=
      // Window event WE_UNKNOWN_0E was called here,
      // but no windows actually implemented a handler and
      // it's not known what it was for
      cursorId = edi;                                 // <=
      if ((ebx & 0xFF) != 0)
      {
        set_cursor(cursorId);
        return;
      }
      break;
      ....
  }
  ....
}

ဤကုဒ်အပိုင်းအစကို ခွဲခြမ်းစိတ်ဖြာခြင်းဖြင့် ရရှိနိုင်ခြေများသည်။ ထို့နောက် ကျန်ရှိသော မှတ်ချက်ဖြင့် အဆုံးအဖြတ်ပေးကာ အလုပ်မလုပ်သောကုဒ်၏ တစ်စိတ်တစ်ပိုင်းကို ဖယ်ရှားခဲ့သည်။ သို့သော်လည်း လုပ်ဆောင်ချက်အချို့ ကျန်နေသေးသည်။ cursorIdအဓိပ္ပါယ်လည်း သိပ်မရှိပါဘူး။

သတိပေးချက် N6

V1004 [CWE-476] nullptr ကို စစ်ဆေးပြီးနောက် 'ကစားသမား' ညွှန်ပြချက်ကို ဘေးကင်းစွာ အသုံးပြုခဲ့သည်။ လိုင်းများကို စစ်ဆေးပါ- 2085, 2094. libopenrct2 Network.cpp 2094

void Network::ProcessPlayerList()
{
  ....
  auto* player = GetPlayerByID(pendingPlayer.Id);
  if (player == nullptr)
  {
    // Add new player.
    player = AddPlayer("", "");
    if (player)                                          // <=
    {
      *player = pendingPlayer;
       if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
       {
         _serverConnection->Player = player;
       }
    }
    newPlayers.push_back(player->Id);                    // <=
  }
  ....
}

ဤကုဒ်သည် ပြင်ရန်အတော်လေးလွယ်ကူသည်၊ သင်သည် ၎င်းကို တတိယအကြိမ် စစ်ဆေးရန် လိုအပ်ပါသည်။ ကစားသူ null pointer သို့၊ သို့မဟုတ် conditional statement ၏ body သို့ ထည့်ပါ။ ငါဒုတိယ option ကိုအကြံပြုချင်ပါတယ်:

void Network::ProcessPlayerList()
{
  ....
  auto* player = GetPlayerByID(pendingPlayer.Id);
  if (player == nullptr)
  {
    // Add new player.
    player = AddPlayer("", "");
    if (player)
    {
      *player = pendingPlayer;
      if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
      {
        _serverConnection->Player = player;
      }
      newPlayers.push_back(player->Id);
    }
  }
  ....
}

သတိပေးချက် N7

V547 [CWE-570] 'name == nullptr' ဆိုသည့် စကားရပ်သည် အမြဲတမ်း လွဲမှားနေပါသည်။ libopenrct2 ServerList.cpp ၁၀၂

std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
  auto name = json_object_get(server, "name");
  .....
  if (name == nullptr || version == nullptr)
  {
    ....
  }
  else
  {
    ....
    entry.name = (name == nullptr ? "" : json_string_value(name));
    ....
  }
  ....
}

တစ်ရှိန်ထိုး ဖတ်ရခက်သော ကုဒ်လိုင်းတစ်ခုကို ဖယ်ရှားနိုင်ပြီး စစ်ဆေးခြင်းဖြင့် ပြဿနာကို ဖြေရှင်းနိုင်သည် ။ nullptr. အောက်ပါအတိုင်း ကုဒ်ပြောင်းရန် အကြံပြုပါသည်။

std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
  auto name = json_object_get(server, "name");
  .....
  if (name == nullptr || version == nullptr)
  {
    name = ""
    ....
  }
  else
  {
    ....
    entry.name = json_string_value(name);
    ....
  }
  ....
}

သတိပေးချက် N8

V1048 [CWE-1164] 'ColumnHeaderPressedCurrentState' variable သည် တူညီသောတန်ဖိုးကို သတ်မှတ်ပေးခဲ့သည်။ libopenrct2ui CustomListView.cpp 510

void CustomListView::MouseUp(....)
{
  ....
  if (!ColumnHeaderPressedCurrentState)
  {
    ColumnHeaderPressed = std::nullopt;
    ColumnHeaderPressedCurrentState = false;
    Invalidate();
  }
}

ကုဒ်က တော်တော်ထူးဆန်းပုံရသည်။ အခြေအနေတွင်ဖြစ်စေ သို့မဟုတ် variable ကို ပြန်လည်သတ်မှတ်ပေးသည့်အခါတွင် typo တစ်ခုရှိနေသည်ဟု ယူဆရပါသည်။ ColumnHeaderPressedCurrentState အဓိပ်ပါယျ မမှန်သော.

ကောက်ချက်

ကျွန်ုပ်တို့တွေ့မြင်ရသည့်အတိုင်း PVS-Studio static analyzer ကို သင်၏ TeamCity ပရောဂျက်တွင် ပေါင်းစည်းခြင်းသည် အလွန်ရိုးရှင်းပါသည်။ ဒီလိုလုပ်ဖို့၊ သေးငယ်တဲ့ configuration file တစ်ခုပဲရေးဖို့လုံလောက်ပါတယ်။ ကုဒ်ကိုစစ်ဆေးခြင်းသည် တပ်ဆင်ပြီးနောက် ပြဿနာများကို ချက်ချင်းဖော်ထုတ်နိုင်မည်ဖြစ်ပြီး၊ ရှုပ်ထွေးမှုနှင့် အပြောင်းအလဲများ၏ ကုန်ကျစရိတ်နည်းပါးနေသေးချိန်တွင် ၎င်းတို့ကို ဖယ်ရှားရှင်းလင်းနိုင်မည်ဖြစ်သည်။

PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။
ဤဆောင်းပါးကို အင်္ဂလိပ်စကားပြော ပရိသတ်နှင့် မျှဝေလိုပါက၊ ဘာသာပြန်လင့်ခ်- Vladislav Stolyarov ကို အသုံးပြုပါ။ PVS-Studio နှင့် စဉ်ဆက်မပြတ်ပေါင်းစပ်မှု- TeamCity။ Open RollerCoaster Tycoon 2 ပရောဂျက်ကို လေ့လာခြင်း။.

source: www.habr.com

မှတ်ချက် Add