PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုကို အသုံသပဌု၍ LLVM 8 တလင် အမဟာသအယလင်သမျာသကို ရဟာဖလေခဌင်သ။

PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုကို အသုံသပဌု၍ LLVM 8 တလင် အမဟာသအယလင်သမျာသကို ရဟာဖလေခဌင်သ။
ကျလန်ုပ်တို့၏ PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုကို အသုံသပဌု၍ LLVM ပရောဂျက်၏ နောက်ဆုံသကုဒ်စစ်ဆေသခဌင်သမဟ နဟစ်နဟစ်ကျော်သလာသပဌီဖဌစ်သည်။ PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာသူသည် အမဟာသအယလင်သမျာသနဟင့် ဖဌစ်နိုင်ချေရဟိသော အာသနည်သချက်မျာသကို ခလဲခဌာသသတ်မဟတ်ရန် ညသဆောင်ကိရိယာတစ်ခုအဖဌစ် ရဟိနေကဌောင်သ သေချာပါစေ။ ဒါကိုလုပ်ဖို့၊ LLVM 8.0.0 ထလက်ရဟိမဟုမဟာ အမဟာသအယလင်သအသစ်တလေကို စစ်ဆေသပဌီသ ရဟာပါမယ်။

ရေသရမည့်ဆောင်သပါသ

ရိုသရိုသသာသသာသပဌောရရင် ဒီဆောင်သပါသကို မရေသချင်ပါဘူသ။ ကျလန်ုပ်တို့ အကဌိမ်ကဌိမ် စစ်ဆေသပဌီသသော ပရောဂျက်အကဌောင်သ ရေသရန် စိတ်မဝင်စာသပါ (1, 2, 3) အသစ်အဆန်သတလေအကဌောင်သရေသတာ ပိုကောင်သတယ်၊ ဒါပေမယ့် ရလေသချယ်စရာမရဟိပါဘူသ။

LLVM ဗာသရဟင်သအသစ်ကို ထုတ်ဝေသည့်အခါတိုင်သ သို့မဟုတ် အပ်ဒိတ်လုပ်ပါ။ Clang Static Analyzerကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏မေသလ်တလင် အောက်ပါအမျိုသအစာသမေသခလန်သမျာသကို လက်ခံရရဟိပါသည်-

ကဌည့်ပါ၊ Clang Static Analyzer ဗာသရဟင်သအသစ်သည် အမဟာသအယလင်သအသစ်မျာသကိုရဟာဖလေရန် သင်ယူခဲ့သည်။ PVS-Studio အသုံသပဌုခဌင်သ၏ ဆက်စပ်မဟုမဟာ လျော့ကျသလာသသည်ဟု ယူဆပါသည်။ Clang သည် ယခင်ကထက် အမဟာသအယလင်သမျာသကို ပိုမိုရဟာဖလေပဌီသ PVS-Studio ၏ လုပ်ဆောင်နိုင်စလမ်သမျာသကို ဖမ်သစာသသည်။ ဒီအပေါ် ဘယ်လိုထင်လဲ။

ဒီအတလက် ကျလန်တော် အမဌဲလိုလို ဖဌေပေသချင်ပါတယ်

ငါတို့လည်သ ဘာမဟမလုပ်ဘဲ မထိုင်ဘူသ။ ကျလန်ုပ်တို့သည် PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟု၏စလမ်သရည်မျာသကို သိသာထင်ရဟာသစလာ မဌဟင့်တင်ထာသပါသည်။ ဒါကဌောင့် စိတ်မပူပါနဲ့၊ ကျလန်တော်တို့ အရင်အတိုင်သပဲ ဆက်လက် ညသဆောင်နေပါတယ်။

ကံမကောင်သစလာပဲ၊ ဒါက မကောင်သတဲ့အဖဌေပါ။ အဲဒီထဲမဟာ အထောက်အထာသတလေ မရဟိဘူသ။ အဲဒါကဌောင့် အခုဒီဆောင်သပါသကိုရေသတာပါ။ ထို့ကဌောင့် LLVM ပရောဂျက်ကို ထပ်မံစစ်ဆေသပဌီသ အမဟာသအယလင်သအမျိုသမျိုသကို တလေ့ရဟိခဲ့သည်။ အခု ငါစိတ်ဝင်စာသတဲ့ပုံပေါက်တဲ့ဟာတလေကို ငါသရုပ်ပဌမယ်။ Clang Static Analyzer သည် ကအမဟာသမျာသကို ရဟာမတလေ့နိုင်ပါ (သို့မဟုတ် ၎င်သ၏အကူအညီဖဌင့် ပဌုလုပ်ရန် အလလန်အဆင်မပဌေ)။ ဒါပေမယ့် ကျလန်တော် တတ်နိုင်ပါတယ်။ တစ်ညနေခင်သမဟာ ဒီအမဟာသတလေအာသလုံသကို တလေ့ပဌီသ ချရေသလိုက်တယ်။

သို့သော် ဆောင်သပါသရေသရန် ရက်သတ္တပတ်မျာသစလာ ကဌာခဲ့သည်။ ဒါတလေအာသလုံသကို စာသာသထဲထည့်ဖို့ ကိုယ့်ကိုကိုယ် မစလမ်သဆောင်နိုင်ခဲ့ပါဘူသ :)

စကာသမစပ်၊ သင်သည် PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုတလင် မည်သည့်နည်သပညာမျာသကို အသုံသပဌုထာသသည်ကို စိတ်ဝင်စာသပါက၊ အမဟာသအယလင်သမျာသနဟင့် ဖဌစ်နိုင်ခဌေရဟိသော အာသနည်သချက်မျာသကို ရဟာဖလေဖော်ထုတ်ရန် ကအရာကို သိကျလမ်သရန် အကဌံပဌုအပ်ပါသည်။ မဟတ်ချက်.

အသစ်နဟင့်အဟောင်သရောဂါရဟာဖလေရေသ

အထက်ဖော်ပဌပါအတိုင်သ၊ လလန်ခဲ့သည့် နဟစ်နဟစ်ခန့်က LLVM ပရောဂျက်ကို ထပ်မံစစ်ဆေသခဲ့ပဌီသ တလေ့ရဟိသည့်အမဟာသမျာသကို ပဌုပဌင်ခဲ့သည်။ ယခု ကဆောင်သပါသသည် အမဟာသအယလင်သအသစ်တစ်ခုကို တင်ပဌပါမည်။ ပိုသမလဟာသအသစ်မျာသကို အဘယ်ကဌောင့် တလေ့ရဟိသနည်သ။ ဒီအတလက် အကဌောင်သပဌချက် ၃ ခု ရဟိပါတယ်

  1. LLVM ပရောဂျက်သည် ကုဒ်အဟောင်သကို ပဌောင်သလဲခဌင်သနဟင့် ကုဒ်အသစ်မျာသကို ပေါင်သထည့်ခဌင်သတို့ဖဌင့် ပဌောင်သလဲနေသည်။ ပုံမဟန်အာသဖဌင့်၊ ပဌုပဌင်ထာသသော၊ ရေသထာသသောကုဒ်တလင် အမဟာသအယလင်သအသစ်မျာသရဟိပါသည်။ ၎င်သသည် တည်ငဌိမ်မဟုခလဲခဌမ်သစိတ်ဖဌာမဟုကို ရံဖန်ရံခါမဟုတ်ဘဲ ပုံမဟန်အသုံသပဌုသင့်ကဌောင်သ ရဟင်သရဟင်သလင်သလင်သ သက်သေပဌနေပါသည်။ ကျလန်ုပ်တို့၏ဆောင်သပါသမျာသသည် PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟု၏စလမ်သရည်မျာသကို ကောင်သစလာပဌသထာသသော်လည်သ ၎င်သသည် ကုဒ်အရည်အသလေသကို မဌဟင့်တင်ရန်နဟင့် အမဟာသမျာသကို ပဌင်ဆင်စရိတ်လျဟော့ချခဌင်သနဟင့် ဘာမဟမဆိုင်ပါ။ တည်ငဌိမ်သောကုဒ်ခလဲခဌမ်သစိတ်ဖဌာမဟုကို ပုံမဟန်အသုံသပဌုပါ။
  2. ကျလန်ုပ်တို့သည် လက်ရဟိရောဂါရဟာဖလေမဟုမျာသကို အပဌီသသတ်ပဌီသ ပိုမိုကောင်သမလန်အောင် လုပ်ဆောင်နေပါသည်။ ထို့ကဌောင့်၊ ခလဲခဌမ်သစိတ်ဖဌာသူသည် ယခင်စကင်ဖတ်စစ်ဆေသစဉ်အတလင်သ သတိမပဌုမိသော အမဟာသမျာသကို ခလဲခဌာသသတ်မဟတ်နိုင်သည်။
  3. လလန်ခဲ့သည့် ၂ နဟစ်က မရဟိခဲ့သော PVS-Studio တလင် ရောဂါရဟာဖလေမဟုအသစ်မျာသ ပေါ်လာခဲ့သည်။ PVS-Studio ၏ ဖလံ့ဖဌိုသတိုသတက်မဟုကို ရဟင်သရဟင်သလင်သလင်သပဌသရန် သီသခဌာသကဏ္ဍတစ်ခုတလင် ၎င်သတို့ကို မီသမောင်သထိုသပဌရန် ဆုံသဖဌတ်ခဲ့သည်။

လလန်ခဲ့သော 2 နဟစ်က တည်ရဟိခဲ့သော ရောဂါရဟာဖလေမဟုမဟ ဖော်ထုတ်ထာသသော ချို့ယလင်သချက်မျာသ

Fragment N1- ကော်ပီကူသထည့်ပါ။

static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
  if (Name == "addcarryx.u32" || // Added in 8.0
    ....
    Name == "avx512.mask.cvtps2pd.128" || // Added in 7.0
    Name == "avx512.mask.cvtps2pd.256" || // Added in 7.0
    Name == "avx512.cvtusi2sd" || // Added in 7.0
    Name.startswith("avx512.mask.permvar.") || // Added in 7.0     // <=
    Name.startswith("avx512.mask.permvar.") || // Added in 7.0     // <=
    Name == "sse2.pmulu.dq" || // Added in 7.0
    Name == "sse41.pmuldq" || // Added in 7.0
    Name == "avx2.pmulu.dq" || // Added in 7.0
  ....
}

PVS-Studio သတိပေသချက်- V501 [CWE-570] 'Name.startswith("avx512.mask.permvar.")' ၏ ဘယ်ဘက်နဟင့် '||' ၏ ညာဘက်တလင် ထပ်တူထပ်မျဟသော စကာသရပ်မျာသ ရဟိပါသည်။ အော်ပရေတာ။ AutoUpgrade.cpp ၇၃

အမည်ကို စာတန်သခလဲ "avx512.mask.permvar" ဖဌင့် အစပဌုကဌောင်သ နဟစ်ချက်စစ်ဆေသထာသသည်။ ဒုတိယစစ်ဆေသမဟုတလင်၊ သူတို့သည် အခဌာသတစ်ခုခုကို ရေသချင်သော်လည်သ ကူသယူထာသသော စာသာသကိုပဌင်ရန် မေ့သလာသကဌသည်။

Fragment N2- Typo

enum CXNameRefFlags {
  CXNameRange_WantQualifier = 0x1,
  CXNameRange_WantTemplateArgs = 0x2,
  CXNameRange_WantSinglePiece = 0x4
};

void AnnotateTokensWorker::HandlePostPonedChildCursor(
    CXCursor Cursor, unsigned StartTokenIndex) {
  const auto flags = CXNameRange_WantQualifier | CXNameRange_WantQualifier;
  ....
}

သတိပေသချက် PVS-Studio- V501 ၏ဘယ်ဘက်နဟင့် '|' ၏ညာဘက်တလင် 'CXNameRange_WantQualifier' တူညီသောအသုံသအနဟုန်သခလဲမျာသရဟိပါသည်။ အော်ပရေတာ။ CIndex.cpp 7245

စာစီစာရိုက်တစ်ခုကဌောင့်၊ တူညီသောကိန်သသေမျာသကို နဟစ်ကဌိမ်အသုံသပဌုသည်။ CXNameRange_WantQualifier.

Fragment N3- အော်ပရေတာ ရဟေ့တန်သနဟင့် ရဟုပ်ထလေသမဟု

int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
  ....
  if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian() ? 1 : 0)
    return 0;
  ....
}

PVS-Studio သတိပေသချက်- V502 [CWE-783] '?:' အော်ပရေတာသည် မျဟော်လင့်ထာသသည်ထက် ကလဲပဌာသသောနည်သလမ်သဖဌင့် အလုပ်လုပ်နိုင်သည်။ '?:' အော်ပရေတာတလင် '==' အော်ပရေတာထက် ညသစာသပေသရဟိသည်။ PPCTargetTransformInfo.cpp 404

ကျလန်တော့်အမဌင်အရတော့ ဒါဟာ အလလန်လဟပတဲ့ အမဟာသတစ်ခုပါ။ ဟုတ်တယ်၊ ငါ့မဟာ အလဟအပနဲ့ ပတ်သက်ပဌီသ ထူသဆန်သတဲ့ အယူအဆတလေ ရဟိတယ်ဆိုတာ ငါသိတယ်။ :)

အခု အတိုင်သပါပဲ။ အော်ပရေတာညသစာသပေသစကာသရပ်ကို အောက်ပါအတိုင်သ အကဲဖဌတ်သည်။

(ISD == ISD::EXTRACT_VECTOR_ELT && (Index == ST->isLittleEndian())) ? 1 : 0

လက်တလေ့ကျသော ရဟုထောင့်မဟကဌည့်လျဟင် ထိုအခဌေအနေသည် အဓိပ္ပါယ်မရဟိပေ၊

(ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian())

ဒါက ရဟင်သရဟင်သလင်သလင်သ အမဟာသပါ။ ဖဌစ်နိုင်ချေ အမျာသစုမဟာ 0/1 ကို ကိန်သရဟင်တစ်ခုနဟင့် နဟိုင်သယဟဉ်ချင်ကဌသည်။ အညလဟန်သကိန်သ. ကုဒ်ကိုပဌင်ရန်အတလက် တာနရီအော်ပရေတာတစ်ဝိုက်တလင် ကလင်သစဥ်မျာသထည့်ရန် လိုအပ်သည်-

if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))

စကာသမစပ်၊ ternary operator သည် အလလန်အန္တရာယ်မျာသပဌီသ ယုတ္တိအမဟာသမျာသကို နဟိုသဆော်ပါသည်။ ၎င်သကို အလလန်သတိထာသပါ၊ ကလင်သကလင်သဖဌင့် လောဘမကဌီသပါနဟင့်။ ဒီအကဌောင်သအရာကို အသေသစိတ်ကဌည့်ခဲ့တယ်။ ဒီမဟာအခန်သတလင် “သတိပဌုပါ ?: အော်ပရေတာနဟင့် ကလင်သအတလင်သထည့်သလင်သပါ။”

Fragment N4၊ N5- Null pointer

Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
  ....
  TypedInit *LHS = dyn_cast<TypedInit>(Result);
  ....
  LHS = dyn_cast<TypedInit>(
    UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get())
      ->Fold(CurRec));
  if (!LHS) {
    Error(PasteLoc, Twine("can't cast '") + LHS->getAsString() +
                    "' to string");
    return nullptr;
  }
  ....
}

PVS-Studio သတိပေသချက်- V522 [CWE-476] null pointer 'LHS' ကို ကိုသကာသခဌင်သ ဖဌစ်ပေါ်လာနိုင်သည်။ TGParser.cpp 2152

ညလဟန်ပဌလျဟင် LHS null ၊ သတိပေသချက်ထုတ်ပဌန်သင့်သည်။ သို့သော် ယင်သအစာသ၊ ကတူညီသော null pointer ကို ရည်ညလဟန်သသည်- LHS->getAsString().

အဘယ်သူမျဟမစမ်သသပ်သောကဌောင့် error သည် error handler တလင်ဝဟက်ထာသသောအခါကသည်အလလန်ပုံမဟန်အခဌေအနေဖဌစ်သည်။ Static ခလဲခဌမ်သစိတ်ဖဌာသူမျာသသည် မည်မျဟသုံသသည်ဖဌစ်စေ လက်လဟမ်သမီနိုင်သော ကုဒ်အာသလုံသကို စစ်ဆေသပါ။ ကသည်မဟာ static analysis သည် အခဌာသသော စမ်သသပ်ခဌင်သနဟင့် အမဟာသအယလင်သ ကာကလယ်ခဌင်သနည်သပညာမျာသကို မည်ကဲ့သို့ ဖဌည့်စလမ်သပေသသည့် အလလန်ကောင်သသော ဥပမာတစ်ခုဖဌစ်သည်။

အလာသတူ ညလဟန်ပဌချက် ကိုင်တလယ်မဟု အမဟာသအယလင်သ RHS အောက်ဖော်ပဌပါ ကုဒ်တလင် ခလင့်ပဌုထာသသည်- V522 [CWE-476] null pointer 'RHS' ကို ကိုသကာသခဌင်သ ဖဌစ်ပေါ်လာနိုင်သည်။ TGParser.cpp ၂၁၈၆

Fragment N6- ရလဟေ့ပဌီသနောက် ညလဟန်ပဌချက်ကို အသုံသပဌုခဌင်သ။

static Expected<bool>
ExtractBlocks(....)
{
  ....
  std::unique_ptr<Module> ProgClone = CloneModule(BD.getProgram(), VMap);
  ....
  BD.setNewProgram(std::move(ProgClone));                                // <=
  MiscompiledFunctions.clear();

  for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
    Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);  // <=
    assert(NewF && "Function not found??");
    MiscompiledFunctions.push_back(NewF);
  }
  ....
}

PVS-စတူဒီယိုသတိပေသချက်- V522 [CWE-476] null pointer 'ProgClone' ကို ကိုသကာသခဌင်သမဟာ ဖဌစ်နိုင်ပါသည်။ Miscompilation.cpp 601

အစမဟာ စမတ်ကျတဲ့ ညလဟန်ပဌချက် ProgClone အရာဝတ္တုကို ပိုင်ဆိုင်ခဌင်သမဟ ရပ်စဲသည်

BD.setNewProgram(std::move(ProgClone));

အမဟန်တော့ အခု ProgClone null pointer တစ်ခုဖဌစ်သည်။ ထို့ကဌောင့်၊ null pointer dereference သည် အောက်ပါအတိုင်သ ဖဌစ်သင့်သည်-

Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);

ဒါပေမယ့် လက်တလေ့မဟာတော့ ဒီလိုဖဌစ်လာမဟာ မဟုတ်ပါဘူသ။ ကလင်သဆက်ကို အမဟန်တကယ် လုပ်ဆောင်ခဌင်သမရဟိကဌောင်သ သတိပဌုပါ။

ကလန်တိန်နာရဲ့အစမဟာ လလဲမဟာသသောလုပ်ဆောင်ချက်မျာသ ရဟင်သလင်သထာသသည်-

MiscompiledFunctions.clear();

ထို့နောက်၊ ကကလန်တိန်နာ၏အရလယ်အစာသကို ကလင်သဆက်အခဌေအနေတလင် အသုံသပဌုသည်-

for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {

ကလင်သဆက်မစတင်တော့ဘူသဆိုတာ သိဖို့လလယ်ပါတယ်။ ဒါက bug တစ်ခုလည်သဖဌစ်ပဌီသ ကုဒ်ကို ကလဲပဌာသစလာရေသသင့်တယ်လို့ ကျလန်တော်ထင်ပါတယ်။

ကနာမည်ကဌီသသော အမဟာသမျာသ၏ တူညီမဟုကို ကျလန်ုပ်တို့ ကဌုံတလေ့ခဲ့ရပုံရသည်။ အမဟာသတစ်ခုက နောက်တစ်ခုက ဖုံသကလယ်ထာသလို့ :)။

Fragment N7- ရလဟေ့ပဌီသနောက် ညလဟန်ပဌချက်ကို အသုံသပဌုခဌင်သ။

static Expected<bool> TestOptimizer(BugDriver &BD, std::unique_ptr<Module> Test,
                                    std::unique_ptr<Module> Safe) {
  outs() << "  Optimizing functions being tested: ";
  std::unique_ptr<Module> Optimized =
      BD.runPassesOn(Test.get(), BD.getPassesToRun());
  if (!Optimized) {
    errs() << " Error running this sequence of passes"
           << " on the input program!n";
    BD.setNewProgram(std::move(Test));                       // <=
    BD.EmitProgressBitcode(*Test, "pass-error", false);      // <=
    if (Error E = BD.debugOptimizerCrash())
      return std::move(E);
    return false;
  }
  ....
}

PVS-Studio သတိပေသချက်- V522 [CWE-476] null pointer 'Test' ကို ကိုသကာသခဌင်သ ဖဌစ်ပေါ်လာနိုင်သည်။ Miscompilation.cpp ၇၀၉

တူညီတဲ့အခဌေအနေရဟိပဌန်တယ်။ အစပိုင်သတလင် အရာဝတ္တု၏ အကဌောင်သအရာမျာသကို ရလေ့လျာသသလာသပဌီသနောက် ၎င်သကို ဘာမဟမဖဌစ်ခဲ့ဟု အသုံသပဌုသည်။ C++ တလင် လဟုပ်ရဟာသမဟု semantics ပေါ်လာပဌီသနောက် ပရိုဂရမ်ကုဒ်တလင် ကအခဌေအနေကို ပို၍ပို၍ မကဌာခဏမဌင်ရသည်။ အဲဒါကဌောင့် ကျလန်တော် C++ ဘာသာစကာသကို နဟစ်သက်တယ်။ သင့်ခဌေထောက်ကို ပစ်ပယ်ရန် နည်သလမ်သသစ်မျာသ ပိုမျာသလာပါသည်။ PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာသူသည် အမဌဲတမ်သ အလုပ်ရဟိလိမ့်မည် :)

Fragment N8- Null pointer

void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol) {
  uint32_t TypeId = Symbol.getTypeId();
  auto Type = Symbol.getSession().getSymbolById(TypeId);
  if (Type)
    Printer << "<unknown-type>";
  else
    Type->dump(*this);
}

PVS-Studio သတိပေသချက်- V522 [CWE-476] null pointer 'Type' ကို ကိုသကာသခဌင်သ ဖဌစ်ပေါ်လာနိုင်သည်။ PrettyFunctionDumper.cpp ၂၃၃

error handlers မျာသအပဌင်၊ debugging printout function မျာသကို အမျာသအာသဖဌင့် စမ်သသပ်လေ့မရဟိပါ။ ငါတို့ရဟေ့မဟာ ဒီလိုကိစ္စမျိုသရဟိသေသတယ်။ အဆိုပါလုပ်ဆောင်ချက်သည် ၎င်သ၏ပဌဿနာမျာသကိုဖဌေရဟင်သမည့်အစာသ ၎င်သကိုပဌင်ခိုင်သမည့်အသုံသပဌုသူကိုစောင့်ဆိုင်သနေသည်။

မဟန်ကန်သော:

if (Type)
  Type->dump(*this);
else
  Printer << "<unknown-type>";

Fragment N9- Null pointer

void SearchableTableEmitter::collectTableEntries(
    GenericTable &Table, const std::vector<Record *> &Items) {
  ....
  RecTy *Ty = resolveTypes(Field.RecType, TI->getType());
  if (!Ty)                                                              // <=
    PrintFatalError(Twine("Field '") + Field.Name + "' of table '" +
                    Table.Name + "' has incompatible type: " +
                    Ty->getAsString() + " vs. " +                       // <=
                    TI->getType()->getAsString());
   ....
}

PVS-Studio သတိပေသချက်- V522 [CWE-476] null pointer 'Ty' ကို ကိုသကာသခဌင်သ ဖဌစ်ပေါ်လာနိုင်သည်။ ရဟာဖလေနိုင်သောTableEmitter.cpp 614

အရာအာသလုံသက ရဟင်သလင်သပဌတ်သာသပဌီသ ရဟင်သပဌဖို့မလိုဘူသထင်ပါတယ်။

Fragment N10- Typo

bool FormatTokenLexer::tryMergeCSharpNullConditionals() {
  ....
  auto &Identifier = *(Tokens.end() - 2);
  auto &Question = *(Tokens.end() - 1);
  ....
  Identifier->ColumnWidth += Question->ColumnWidth;
  Identifier->Type = Identifier->Type;                    // <=
  Tokens.erase(Tokens.end() - 1);
  return true;
}

PVS-Studio သတိပေသချက်- V570 'Identifier->Type' variable ကို သူ့ဘာသာသူ သတ်မဟတ်ထာသသည်။ FormatTokenLexer.cpp ၂၄၉

variable ကို သူ့ဘာသာသူ သတ်မဟတ်ပေသရာမဟာ အရေသမကဌီသပါဘူသ။ အမျာသစုကတော့ ရေသချင်နေကဌတယ်-

Identifier->Type = Question->Type;

အပိုင်သ N11- သံသယဖဌစ်ဖလယ် ကလဲထလက်ခဌင်သ။

void SystemZOperand::print(raw_ostream &OS) const {
  switch (Kind) {
    break;
  case KindToken:
    OS << "Token:" << getToken();
    break;
  case KindReg:
    OS << "Reg:" << SystemZInstPrinter::getRegisterName(getReg());
    break;
  ....
}

PVS-Studio သတိပေသချက်- V622 [CWE-478] 'ခလုတ်' ကဌေညာချက်ကို စစ်ဆေသကဌည့်ရဟုပါ။ ပထမ 'ဖဌစ်ရပ်' အော်ပရေတာ ပျောက်ဆုံသသလာသခဌင်သ ဖဌစ်နိုင်သည်။ SystemZAsmParser.cpp 652

အစတလင် အလလန်သံသယဖဌစ်ဖလယ်အော်ပရေတာတစ်ခုရဟိသည်။ ချိုသ. ကနေရာတလင် အခဌာသတစ်ခုခုရေသရန် မေ့သလာသပါသလာသ။

Fragment N12- ရည်ညလဟန်သကိုသကာသပဌီသနောက် ညလဟန်ပဌချက်ကို စစ်ဆေသခဌင်သ။

InlineCost AMDGPUInliner::getInlineCost(CallSite CS) {
  Function *Callee = CS.getCalledFunction();
  Function *Caller = CS.getCaller();
  TargetTransformInfo &TTI = TTIWP->getTTI(*Callee);

  if (!Callee || Callee->isDeclaration())
    return llvm::InlineCost::getNever("undefined callee");
  ....
}

PVS-Studio သတိပေသချက်- V595 [CWE-476] nullptr ကို မစစ်ဆေသမီ 'Callee' ညလဟန်ပဌချက်ကို အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 172၊ 174. AMDGPUInline.cpp 172

pointer Callee လုပ်ဆောင်ချက်ကို ခေါ်သည့်အချိန်တလင် အစတလင် ရည်ညလဟန်သထာသသည်။ GetTTI.

ထို့နောက်တလင် ကညလဟန်ပဌချက်ကို တန်သတူညီမျဟမဟုအတလက် စစ်ဆေသသင့်သည်ဟု ထလက်ပေါ်လာသည်။ nullptr:

if (!Callee || Callee->isDeclaration())

ဒါပေမယ့် အရမ်သနောက်ကျသလာသပဌီ 

Fragment N13 - N...- ညလဟန်ပဌချက်ကို ကိုသကာသပဌီသနောက် စစ်ဆေသခဌင်သ။

ယခင်ကုဒ်အပိုင်သအစတလင် ဆလေသနလေသခဲ့သည့် အခဌေအနေမဟာ ထူသခဌာသသည်မဟုတ်။ ကတလင်ပေါ်လာသည်-

static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
                               bool isBinary, bool isPrecise = false) {
  ....
  Function *CalleeFn = CI->getCalledFunction();
  StringRef CalleeNm = CalleeFn->getName();                 // <=
  AttributeList CalleeAt = CalleeFn->getAttributes();
  if (CalleeFn && !CalleeFn->isIntrinsic()) {               // <=
  ....
}

PVS-Studio သတိပေသချက်- V595 [CWE-476] nullptr ကို မစစ်ဆေသမီ 'CalleeFn' ညလဟန်ပဌချက်ကို အသုံသပဌုထာသသည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 1079၊ 1081။ SimplifyLibCalls.cpp 1079

ကနေရာတလင်-

void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
                            const Decl *Tmpl, Decl *New,
                            LateInstantiatedAttrVec *LateAttrs,
                            LocalInstantiationScope *OuterMostScope) {
  ....
  NamedDecl *ND = dyn_cast<NamedDecl>(New);
  CXXRecordDecl *ThisContext =
    dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());         // <=
  CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(),
                             ND && ND->isCXXInstanceMember());     // <=
  ....
}

PVS-Studio သတိပေသချက်- V595 [CWE-476] nullptr ကို မစစ်ဆေသမီ 'ND' ညလဟန်ပဌချက်ကို အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 532၊ 534။ SemaTemplateInstantiateDecl.cpp 532

ကနေရာတလင်-

  • V595 [CWE-476] nullptr ကို မစစ်ဆေသမီ 'U' ညလဟန်တံကို အသုံသပဌုထာသသည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 404၊ 407။ DWARFormValue.cpp 404
  • V595 [CWE-476] nullptr ကို မစစ်ဆေသမီ 'ND' ညလဟန်ပဌချက်ကို အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 2149၊ 2151။ SemaTemplateInstantiate.cpp 2149

ထို့နောက် နံပါတ် V595 ဖဌင့် သတိပေသချက်မျာသကို လေ့လာရန် စိတ်မဝင်စာသတော့ပါ။ ထို့ကဌောင့် ကနေရာတလင် ဖော်ပဌထာသသော အမဟာသမျာသအပဌင် နောက်ထပ် အလာသတူ အမဟာသမျာသ ရဟိမရဟိ ကျလန်ုပ် မသိပါ။ ဖဌစ်နိုင်ခဌေ မျာသပါတယ်။

အပိုင်သ N17၊ N18- သံသယဖဌစ်ဖလယ် အပဌောင်သအလဲ

static inline bool processLogicalImmediate(uint64_t Imm, unsigned RegSize,
                                           uint64_t &Encoding) {
  ....
  unsigned Size = RegSize;
  ....
  uint64_t NImms = ~(Size-1) << 1;
  ....
}

PVS-Studio သတိပေသချက်- V629 [CWE-190] '~(အရလယ်အစာသ - 1) << 1' ဆိုသည့် စကာသရပ်ကို စစ်ဆေသသုံသသပ်ကဌည့်ပါ။ 32-bit အမျိုသအစာသသို့ နောက်ဆက်တလဲ ချဲ့ထလင်ခဌင်သဖဌင့် 64-bit တန်ဖိုသကို ဘစ်ပဌောင်သခဌင်သ။ AArch64AddressingModes.h ၂၆၀

၎င်သသည် ချလတ်ယလင်သချက်မဟုတ်သော်လည်သ ကုဒ်သည် ရည်ရလယ်ထာသသည့်အတိုင်သ အတိအကျအလုပ်လုပ်သည်။ ဒါပေမယ့် ဒီနေရာဟာ သံသယဖဌစ်စရာကောင်သတဲ့ နေရာတစ်ခုဖဌစ်ပဌီသ စစ်ဆေသဖို့ လိုအပ်နေတယ်ဆိုတာ ထင်ရဟာသပါတယ်။

variable ဆိုကဌပါစို့ အရလယ် 16 နဟင့် ညီမျဟသည်၊ ထို့နောက် ၎င်သကို variable တစ်ခုအဖဌစ် ရယူရန် စီစဉ်ထာသသော ကုဒ်ရေသသာသသူ NImms တန်ဖိုသ -

1111111111111111111111111111111111111111111111111111111111100000

သို့သော် လက်တလေ့တလင် ရလဒ်သည်-

0000000000000000000000000000000011111111111111111111111111100000

အမဟန်မဟာ တလက်ချက်မဟုအာသလုံသသည် 32-bit လက်မဟတ်မထိုသထာသသော အမျိုသအစာသကို အသုံသပဌု၍ ဖဌစ်ပေါ်ပါသည်။ ထိုမဟသာလျဟင်၊ က 32-bit လက်မဟတ်မထိုသထာသသော အမျိုသအစာသသို့ သလယ်ဝိုက်စလာ ချဲ့ထလင်ပါမည်။ uint64_t. ကကိစ္စတလင်၊ အထင်ရဟာသဆုံသ bit မျာသသည် သုညဖဌစ်လိမ့်မည်။

ကကဲ့သို့သော အခဌေအနေကို သင် ပဌင်နိုင်သည်။

uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;

အလာသတူအခဌေအနေ- V629 [CWE-190] 'Immr << 6' စကာသရပ်ကို စစ်ဆေသသုံသသပ်ကဌည့်ပါ။ 32-bit အမျိုသအစာသသို့ နောက်ဆက်တလဲ တိုသချဲ့မဟုဖဌင့် 64-bit တန်ဖိုသ၏ ဘစ်ပဌောင်သခဌင်သ။ AArch64AddressingModes.h ၂၆၉

အပိုင်သ N19- ပျောက်ဆုံသနေသောသော့ချက်စာလုံသ အခဌာသသူ?

void AMDGPUAsmParser::cvtDPP(MCInst &Inst, const OperandVector &Operands) {
  ....
  if (Op.isReg() && Op.Reg.RegNo == AMDGPU::VCC) {
    // VOP2b (v_add_u32, v_sub_u32 ...) dpp use "vcc" token.
    // Skip it.
    continue;
  } if (isRegOrImmWithInputMods(Desc, Inst.getNumOperands())) {    // <=
    Op.addRegWithFPInputModsOperands(Inst, 2);
  } else if (Op.isDPPCtrl()) {
    Op.addImmOperands(Inst, 1);
  } else if (Op.isImm()) {
    // Handle optional arguments
    OptionalIdx[Op.getImmTy()] = I;
  } else {
    llvm_unreachable("Invalid operand type");
  }
  ....
}

PVS-Studio သတိပေသချက်- V646 [CWE-670] အပလီကေသရဟင်သ၏ ယုတ္တိဗေဒကို စစ်ဆေသသုံသသပ်ကဌည့်ပါ။ 'else' သော့ချက်စာလုံသ ပျောက်နေခဌင်သ ဖဌစ်နိုင်သည်။ AMDGPUAsmParser.cpp 5655

ဒီနေရာမဟာ အမဟာသမရဟိပါဘူသ။ ထိုအချိန်မဟ စ၍ ပထမတုံသ၊ if ဖဌင့် အဆုံသသတ်သည်။ ဆက်လက်ဒါဆိုရင် ကိစ္စမရဟိပါဘူသ၊ အဓိကစကာသလုံသတစ်ခုရဟိတယ်။ အခဌာသသူ ဒါမဟမဟုတ်မဟုတ်ပါ။ ဘာပဲဖဌစ်ဖဌစ် ကုဒ်က အတူတူပါပဲ။ လလမ်သတုန်သ အခဌာသသူ ကုဒ်ကို ပိုမိုရဟင်သလင်သစေပဌီသ အန္တရာယ်ဖဌစ်စေသည်။ နောင်ဆိုရင်တော့ ဆက်လက် ပျောက်သလာသသည်နဟင့် ကုဒ်သည် လုံသဝကလဲပဌာသစလာ စတင်အလုပ်လုပ်ပါလိမ့်မည်။ ကျလန်တော့်အမဌင်အရတော့ ထည့်တာက ပိုကောင်သပါတယ်။ အခဌာသသူ.

Fragment N20- အမျိုသအစာသတူ စာလုံသပေါင်သ လေသခု

LLVM_DUMP_METHOD void Symbol::dump(raw_ostream &OS) const {
  std::string Result;
  if (isUndefined())
    Result += "(undef) ";
  if (isWeakDefined())
    Result += "(weak-def) ";
  if (isWeakReferenced())
    Result += "(weak-ref) ";
  if (isThreadLocalValue())
    Result += "(tlv) ";
  switch (Kind) {
  case SymbolKind::GlobalSymbol:
    Result + Name.str();                        // <=
    break;
  case SymbolKind::ObjectiveCClass:
    Result + "(ObjC Class) " + Name.str();      // <=
    break;
  case SymbolKind::ObjectiveCClassEHType:
    Result + "(ObjC Class EH) " + Name.str();   // <=
    break;
  case SymbolKind::ObjectiveCInstanceVariable:
    Result + "(ObjC IVar) " + Name.str();       // <=
    break;
  }
  OS << Result;
}

PVS-Studio သတိပေသချက်မျာသ-

  • V655 [CWE-480] ကဌိုသမျာသကို ပေါင်သစပ်ထာသသော်လည်သ အသုံသမပဌုပါ။ 'ရလဒ် + Name.str()' စကာသရပ်ကို စစ်ဆေသရန် စဉ်သစာသပါ။ Symbol.cpp ၃၂
  • V655 [CWE-480] ကဌိုသမျာသကို ပေါင်သစပ်ထာသသော်လည်သ အသုံသမပဌုပါ။ 'ရလဒ် + "(ObjC Class)" + Name.str()' စကာသရပ်ကို စစ်ဆေသရန် စဉ်သစာသပါ။ Symbol.cpp ၃၅
  • V655 [CWE-480] ကဌိုသမျာသကို ပေါင်သစပ်ထာသသော်လည်သ အသုံသမပဌုပါ။ 'ရလဒ် + "(ObjC အတန်သအစာသ EH)" + Name.str()' စကာသရပ်ကို စစ်ဆေသရန် စဉ်သစာသပါ။ Symbol.cpp ၃၈
  • V655 [CWE-480] ကဌိုသမျာသကို ပေါင်သစပ်ထာသသော်လည်သ အသုံသမပဌုပါ။ 'ရလဒ် + "(ObjC IVar)" + Name.str()' စကာသရပ်ကို စစ်ဆေသရန် စဉ်သစာသပါ။ Symbol.cpp ၄၁

မတော်တဆ += အော်ပရေတာအစာသ + အော်ပရေတာကို အသုံသပဌုသည်။ ရလဒ်မဟာ အဓိပ္ပါယ်မရဟိသော ဒီဇိုင်သမျာသဖဌစ်သည်။

Fragment N21- သတ်မဟတ်မထာသသော အပဌုအမူ

static void getReqFeatures(std::map<StringRef, int> &FeaturesMap,
                           const std::vector<Record *> &ReqFeatures) {
  for (auto &R : ReqFeatures) {
    StringRef AsmCondString = R->getValueAsString("AssemblerCondString");

    SmallVector<StringRef, 4> Ops;
    SplitString(AsmCondString, Ops, ",");
    assert(!Ops.empty() && "AssemblerCondString cannot be empty");

    for (auto &Op : Ops) {
      assert(!Op.empty() && "Empty operator");
      if (FeaturesMap.find(Op) == FeaturesMap.end())
        FeaturesMap[Op] = FeaturesMap.size();
    }
  }
}

အန္တရာယ်ရဟိတဲ့ကုဒ်ကို ကိုယ်တိုင်ရဟာကဌည့်ပါ။ အဖဌေကိုချက်ချင်သမကဌည့်မိစေရန် ကပုံသည် အာရုံကိုအာရုံလလဲစေမည့်ပုံဖဌစ်သည်။

PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုကို အသုံသပဌု၍ LLVM 8 တလင် အမဟာသအယလင်သမျာသကို ရဟာဖလေခဌင်သ။

PVS-Studio သတိပေသချက်- V708 [CWE-758] အန္တရာယ်ရဟိသောတည်ဆောက်မဟုကိုအသုံသပဌုသည်- 'FeaturesMap[Op] = FeaturesMap.size()', 'FeaturesMap' သည် 'map' အတန်သအစာသဖဌစ်သည်။ ၎င်သသည် သတ်မဟတ်မထာသသော အပဌုအမူကို ဖဌစ်ပေါ်စေနိုင်သည်။ RISCVCompressInstEmitter.cpp 490

ပဌဿနာလိုင်သ-

FeaturesMap[Op] = FeaturesMap.size();

ဒဌပ်ရဟိရင် Op ရဟာမတလေ့ပါက မဌေပုံတလင် ဒဌပ်စင်အသစ်တစ်ခုကို ဖန်တီသပဌီသ ကမဌေပုံရဟိ ဒဌပ်စင်အရေအတလက်ကို ထိုနေရာတလင် ရေသထာသသည်။ လုပ်ဆောင်ချက်ကို ခေါ်ခဌင်သရဟိမရဟိ မသိရသေသပါ။ အရလယ် ဒဌပ်စင်အသစ်မထည့်မီ သို့မဟုတ် ပဌီသနောက်။

Fragment N22-N24- ထပ်ခါတလဲလဲ တာဝန်မျာသ

Error MachOObjectFile::checkSymbolTable() const {
  ....
  } else {
    MachO::nlist STE = getSymbolTableEntry(SymDRI);
    NType = STE.n_type;                              // <=
    NType = STE.n_type;                              // <=
    NSect = STE.n_sect;
    NDesc = STE.n_desc;
    NStrx = STE.n_strx;
    NValue = STE.n_value;
  }
  ....
}

PVS-Studio သတိပေသချက်- V519 [CWE-563] 'NType' variable သည် တန်ဖိုသမျာသကို နဟစ်ကဌိမ်ဆက်တိုက် သတ်မဟတ်ပေသသည်။ ဒါက အမဟာသတစ်ခုလို့ ပဌောထာသတာ။ လိုင်သမျာသကို စစ်ဆေသပါ- 1663၊ 1664။ MachOObjectFile.cpp 1664

ဒီနေရာမဟာ တကယ့်အမဟာသမရဟိဘူသလို့ ထင်ပါတယ်။ မလိုအပ်တဲ့တာဝန်ကို ထပ်ခါထပ်ခါလုပ်ရုံပါပဲ။ ဒါပေမယ့် လလဲမဟာသနေတုန်သပါပဲ။

အလာသတူ-

  • V519 [CWE-563] 'B.NDesc' ကိန်သရဟင်သည် တန်ဖိုသမျာသကို နဟစ်ကဌိမ်ဆက်တိုက် သတ်မဟတ်ပေသသည်။ ဒါက အမဟာသတစ်ခုလို့ ပဌောထာသတာ။ လိုင်သမျာသကို စစ်ဆေသရန်- 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] ကိန်သရဟင်သည် တန်ဖိုသမျာသကို နဟစ်ကဌိမ်ဆက်တိုက် သတ်မဟတ်ပေသသည်။ ဒါက အမဟာသတစ်ခုလို့ ပဌောထာသတာ။ လိုင်သမျာသကို စစ်ဆေသပါ: 59, 61. coff2yaml.cpp 61

Fragment N25-N27- နောက်ထပ် တာဝန်မျာသ

ယခု ပဌန်လည်သတ်မဟတ်ခဌင်သ၏ အနည်သငယ်ကလဲပဌာသသောဗာသရဟင်သကို ကဌည့်ကဌပါစို့။

bool Vectorizer::vectorizeLoadChain(
    ArrayRef<Instruction *> Chain,
    SmallPtrSet<Instruction *, 16> *InstructionsProcessed) {
  ....
  unsigned Alignment = getAlignment(L0);
  ....
  unsigned NewAlign = getOrEnforceKnownAlignment(L0->getPointerOperand(),
                                                 StackAdjustedAlignment,
                                                 DL, L0, nullptr, &DT);
  if (NewAlign != 0)
    Alignment = NewAlign;
  Alignment = NewAlign;
  ....
}

PVS-Studio သတိပေသချက်- V519 [CWE-563] 'Alignment' ကိန်သရဟင်သည် တန်ဖိုသမျာသကို နဟစ်ကဌိမ်ဆက်တိုက် သတ်မဟတ်ပေသသည်။ ဒါက အမဟာသတစ်ခုလို့ ပဌောထာသတာ။ လိုင်သမျာသကို စစ်ဆေသပါ- 1158၊ 1160။ LoadStoreVectorizer.cpp 1160

ကသည်မဟာ ယုတ္တိအမဟာသတစ်ခုပါရဟိသည်ဟူသော အလလန်ထူသဆန်သသောကုဒ်ဖဌစ်သည်။ အစပိုင်သမဟာတော့ ပဌောင်သလဲနိုင်ပါတယ်။ alignment အခဌေအနေပေါ်မူတည်၍ တန်ဖိုသသတ်မဟတ်ပေသသည်။ ထို့နောက် တာဝန်ပဌန်တက်လာသော်လည်သ ယခုတလင် မည်သည့်စစ်ဆေသမဟုမဟ မရဟိဘဲ ဖဌစ်နေသည်။

အလာသတူ အခဌေအနေမျာသကို ကနေရာတလင် ကဌည့်ရဟုနိုင်ပါသည်။

  • V519 [CWE-563] 'အကျိုသသက်ရောက်မဟုမျာသ' ကိန်သရဟင်သည် တန်ဖိုသမျာသကို နဟစ်ကဌိမ်ဆက်တိုက် သတ်မဟတ်ပေသသည်။ ဒါက အမဟာသတစ်ခုလို့ ပဌောထာသတာ။ လိုင်သမျာသကို စစ်ဆေသပါ- 152၊ 165။ WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] 'ExpectNoDerefChunk' ကိန်သရဟင်သည် တန်ဖိုသမျာသကို နဟစ်ကဌိမ်ဆက်တိုက် သတ်မဟတ်ပေသသည်။ ဒါက အမဟာသတစ်ခုလို့ ပဌောထာသတာ။ လိုင်သမျာသကို စစ်ဆေသပါ- 4970၊ 4973။ SemaType.cpp 4973

Fragment N28- အမဌဲတမ်သ စစ်မဟန်သော အခဌေအနေ

static int readPrefixes(struct InternalInstruction* insn) {
  ....
  uint8_t byte = 0;
  uint8_t nextByte;
  ....
  if (byte == 0xf3 && (nextByte == 0x88 || nextByte == 0x89 ||
                       nextByte == 0xc6 || nextByte == 0xc7)) {
    insn->xAcquireRelease = true;
    if (nextByte != 0x90) // PAUSE instruction support             // <=
      break;
  }
  ....
}

PVS-Studio သတိပေသချက်- V547 [CWE-571] ဖော်ပဌချက် 'nextByte != 0x90' သည် အမဌဲမဟန်သည်။ X86DisassemblerDecoder.cpp ၃၇၉

စစ်ဆေသခဌင်သသည် အဓိပ္ပာယ်မရဟိပေ။ ပဌောင်သလဲနိုင်သော nextByte အမဌဲတမ်သတန်ဖိုသနဲ့ မညီမျဟပါဘူသ။ 0x90ယခင်စစ်ဆေသချက်မဟ အောက်ပါအတိုင်သဖဌစ်သည်။ ဒါက ယုတ္တိတန်တဲ့ အမဟာသမျိုသပါ။

Fragment N29 - N...: အမဌဲတမ်သ မဟန်/မမဟန် အခဌေအနေမျာသ

ခလဲခဌမ်သစိတ်ဖဌာသူသည် အခဌေအနေတစ်ခုလုံသကို သတိပေသချက်မျာသစလာထုတ်ပေသသည် (V547) သို့မဟုတ် တစ်စိတ်တစ်ပိုင်သ (V560) အမဌဲမဟန်သည်ဖဌစ်စေ မဟာသသည်ဖဌစ်စေ။ မကဌာခဏဆိုသလို ၎င်သတို့သည် စစ်မဟန်သောအမဟာသမျာသမဟုတ်သော်လည်သ ရိုသရိုသရဟင်သရဟင်သ ကုဒ်မျာသ၊ မက်ခရိုချဲ့ထလင်ခဌင်သ၏ရလဒ်နဟင့် အခဌာသအရာမျာသဖဌစ်သည်။ သို့ရာတလင်၊ စစ်မဟန်သောယုတ္တိအမဟာသမျာသသည် အခါအာသလျော်စလာ ဖဌစ်ပေါ်တတ်သောကဌောင့် ကသတိပေသချက်အာသလုံသကို ကဌည့်ရဟုခဌင်သသည် အဓိပ္ပာယ်ရဟိပေသည်။ ဥပမာအာသဖဌင့်၊ ကကုဒ်အပိုင်သသည် သံသယဖဌစ်ဖလယ်ဖဌစ်သည်-

static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo,
                                   uint64_t Address, const void *Decoder) {
  DecodeStatus S = MCDisassembler::Success;

  if (RegNo > 13)
    return MCDisassembler::Fail;

  if ((RegNo & 1) || RegNo == 0xe)
     S = MCDisassembler::SoftFail;
  ....
}

PVS-Studio သတိပေသချက်- V560 [CWE-570] အခဌေအနေဆိုင်ရာ ဖော်ပဌချက်၏ အစိတ်အပိုင်သတစ်ခုသည် အမဌဲတမ်သ မဟာသယလင်သနေသည်- RegNo == 0xe။ ARMDisassembler.cpp 939

ကိန်သသေ 0xE သည် ဒဿမ 14 တန်ဖိုသဖဌစ်သည်။ စာမေသပလဲ RegNo == 0xe အကယ်လို့ အဓိပ္ပါယ်မရဟိပါဘူသ။ မဟတ်ပုံတင်အမဟတ် > ၁၃ထို့နောက် function သည် ၎င်သ၏လုပ်ဆောင်မဟုကို အပဌီသသတ်မည်ဖဌစ်သည်။

IDs V547 နဟင့် V560 ပါသော အခဌာသသတိပေသချက်မျာသ မျာသစလာရဟိသော်လည်သ ယခင်ကဲ့သို့ပင် V595ဒီသတိပေသချက်တလေကို လေ့လာဖို့ စိတ်မဝင်စာသခဲ့ဘူသ။ ဆောင်သပါသတစ်ပုဒ်ရေသဖို့ လုံလောက်တဲ့ အကဌောင်သအရာတလေ ရဟိနေပဌီဆိုတာ ရဟင်သပါတယ်။ :) ထို့ကဌောင့် PVS-Studio ကို အသုံသပဌု၍ LLVM တလင် ကအမျိုသအစာသ၏ အမဟာသအယလင်သ မည်မျဟရဟိသည်ကို မသိရသေသပါ။

ကအစပျိုသမဟုမျာသကို လေ့လာရခဌင်သသည် ပျင်သရိရခဌင်သအကဌောင်သ ဥပမာတစ်ခုပေသပါမည်။ ခလဲခဌမ်သစိတ်ဖဌာသူသည် အောက်ပါကုဒ်အတလက် သတိပေသချက်ထုတ်ရာတလင် လုံသဝမဟန်ကန်ပါသည်။ ဒါပေမယ့် ဒါက အမဟာသမဟုတ်ပါဘူသ။

bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
                                          tok::TokenKind ClosingBraceKind) {
  bool HasError = false;
  ....
  HasError = true;
  if (!ContinueOnSemicolons)
    return !HasError;
  ....
}

PVS-Studio သတိပေသချက်- V547 [CWE-570] ဖော်ပဌချက် '!HasError' သည် အမဌဲတမ်သ မဟာသယလင်သနေပါသည်။ UnwrappedLineParser.cpp 1635

Fragment N30- သံသယဖဌစ်ဖလယ်ပဌန်လာခဌင်သ။

static bool
isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) {
  for (MachineRegisterInfo::def_instr_iterator It = MRI.def_instr_begin(Reg),
      E = MRI.def_instr_end(); It != E; ++It) {
    return (*It).isImplicitDef();
  }
  ....
}

PVS-Studio သတိပေသချက်- V612 [CWE-670] ကလင်သဆက်တစ်ခုအတလင်သ ခဌလင်သချက်မရဟိ 'ပဌန်လာ'။ R600OptimizeVectorRegisters.cpp ၆၃

၎င်သသည် ကုဒ်ကိုဖတ်နေသည့် ပရိုဂရမ်မာမျာသအာသ တစ်စုံတစ်ခုကို ရဟင်သပဌရန် ရည်ရလယ်သည့် အမဟာသတစ်ခု သို့မဟုတ် တိကျသောနည်သစနစ်တစ်ခုဖဌစ်သည်။ ကဒီဇိုင်သသည် ကျလန်ုပ်အာသ ဘာမဟရဟင်သပဌမနေဘဲ အလလန်သံသယဖဌစ်ပုံရသည်။ အဲလိုမရေသတာ ပိုကောင်သပါတယ် :)

ပင်ပန်သနေပဌီလာသ? ပဌီသရင် လက်ဖက်ရည် ဒါမဟမဟုတ် ကော်ဖီဖျော်ဖို့ အချိန်ရောက်ပါပဌီ။

PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုကို အသုံသပဌု၍ LLVM 8 တလင် အမဟာသအယလင်သမျာသကို ရဟာဖလေခဌင်သ။

ရောဂါရဟာဖလေမဟုအသစ်မျာသဖဌင့် ဖော်ထုတ်ထာသသော ချို့ယလင်သချက်မျာသ

ရောဂါရဟာဖလေရေသအဟောင်သ၏ အသက်ဝင်မဟု 30 လောက်တော့ လုံလောက်ပဌီထင်ပါတယ်။ ပဌီသနောက် ခလဲခဌမ်သစိတ်ဖဌာမဟုတလင် ပေါ်လာသည့် ရောဂါရဟာဖလေမဟုအသစ်မျာသဖဌင့် မည်သည့်စိတ်ဝင်စာသဖလယ်အရာမျာသကို တလေ့နိုင်သည်ကို ယခုကဌည့်ကဌပါစို့ ယခင် စစ်ဆေသမဟုမျာသ။ ထိုအချိန်အတလင်သ၊ စုစုပေါင်သ အထလေထလေရောဂါရဟာဖလေခဌင်သ ၆၆ ခုကို C++ ခလဲခဌမ်သစိတ်ဖဌာမဟုတလင် ထည့်သလင်သခဲ့သည်။

Fragment N31- ဆက်သလယ်၍မရသောကုဒ်

Error CtorDtorRunner::run() {
  ....
  if (auto CtorDtorMap =
          ES.lookup(JITDylibSearchList({{&JD, true}}), std::move(Names),
                    NoDependenciesToRegister, true))
  {
    ....
    return Error::success();
  } else
    return CtorDtorMap.takeError();

  CtorDtorsByPriority.clear();

  return Error::success();
}

PVS-Studio သတိပေသချက်- V779 [CWE-561] ဆက်သလယ်၍မရသောကုဒ်ကို တလေ့ရဟိခဲ့သည်။ error ရဟိနေတာ ဖဌစ်နိုင်တယ်။ ExecutionUtils.cpp ၁၄၆

သင်မဌင်နိုင်သကဲ့သို့, အော်ပရေတာ၏အကိုင်သအခက်နဟစ်ခုလုံသ if အော်ပရေတာထံသို့ ခေါ်ဆိုမဟုဖဌင့် အဆုံသသတ်သည်။ ပဌန်လာ. သို့ဖဌစ်ရာ ကလန်တိန်နာ CtorDtorsByPriority ဘယ်တော့မဟ ရဟင်သမဟာမဟုတ်ဘူသ။

Fragment N32- ဆက်သလယ်၍မရသောကုဒ်

bool LLParser::ParseSummaryEntry() {
  ....
  switch (Lex.getKind()) {
  case lltok::kw_gv:
    return ParseGVEntry(SummaryID);
  case lltok::kw_module:
    return ParseModuleEntry(SummaryID);
  case lltok::kw_typeid:
    return ParseTypeIdEntry(SummaryID);                        // <=
    break;                                                     // <=
  default:
    return Error(Lex.getLoc(), "unexpected summary kind");
  }
  Lex.setIgnoreColonInIdentifiers(false);                      // <=
  return false;
}

PVS-Studio သတိပေသချက်- V779 [CWE-561] ဆက်သလယ်၍မရသောကုဒ်ကို တလေ့ရဟိခဲ့သည်။ error ရဟိနေတာ ဖဌစ်နိုင်တယ်။ LLParser.cpp 835

စိတ်ဝင်စာသစရာအခဌေအနေ။ ဒီနေရာကို အရင်ကဌည့်ရအောင်။

return ParseTypeIdEntry(SummaryID);
break;

ပထမတစ်ချက်တလင်၊ ကနေရာတလင် error မရဟိဟုထင်ရသည်။ အော်ကဌည့်ရတာ ချိုသ ကနေရာတလင် အပိုတစ်ခုရဟိ၍ ၎င်သကို ရိုသရဟင်သစလာ ဖျက်နိုင်သည်။ သို့သော်၊ ကမျဟလောက်မရိုသရဟင်သပါ။

ခလဲခဌမ်သစိတ်ဖဌာသူသည် လိုင်သမျာသပေါ်တလင် သတိပေသချက်ထုတ်သည်-

Lex.setIgnoreColonInIdentifiers(false);
return false;

အမဟန်ပင်၊ ကကုဒ်သည် လက်လဟမ်သမမီနိုင်ပါ။ ကိစ္စအာသလုံသအတလက် ပလောငျသလဲ အော်ပရေတာထံမဟခေါ်ဆိုမဟုဖဌင့်အဆုံသသတ်သည်။ ပဌန်လာ. အခုလည်သ တစ်ယောက်တည်သ ဥာဏ်မရဟိတော့ဘူသ။ ချိုသ သိပ်အန္တရာယ်ကင်သပုံမပေါ်ပါဘူသ။ ဖဌစ်ကောင်သဖဌစ်နိုင်အကိုင်သအခက်မျာသနဟင့်အဆုံသသတ်သင့်ပါတယ်။ ချိုသမဟုတ်ပါ ပဌန်လာ?

Fragment N33- မဌင့်မာသသောဘစ်မျာသ၏ ကျပန်သပဌန်လည်သတ်မဟတ်ခဌင်သ။

unsigned getStubAlignment() override {
  if (Arch == Triple::systemz)
    return 8;
  else
    return 1;
}

Expected<unsigned>
RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
                             const SectionRef &Section,
                             bool IsCode) {
  ....
  uint64_t DataSize = Section.getSize();
  ....
  if (StubBufSize > 0)
    DataSize &= ~(getStubAlignment() - 1);
  ....
}

PVS-Studio သတိပေသချက်- V784 ဘစ် Mask ၏ အရလယ်အစာသသည် ပထမ operand ၏ အရလယ်အစာသထက် နည်သပါသည်။ ၎င်သသည် ပိုမိုမဌင့်မာသသော bit မျာသကို ဆုံသရဟုံသစေသည်။ RuntimeDyld.cpp 815

function ကိုသတိပဌုပါ။ getStubAlignment returns အမျိုသအစာသ လက်မဟတ်မထိုသ. function က value 8 ကို ပဌန်ပေသတယ်လို့ ယူဆလို့ expression ရဲ့တန်ဖိုသကို တလက်ကဌည့်ရအောင်။

~(getStubAlignment() - ၁)

~(8u-1)

0xFFFFFFFF8u

ယခု ကိန်သရဟင်ကို သတိပဌုပါ။ ဒေတာအရလယ်အစာသ 64-bit လက်မဟတ်မထိုသထာသသော အမျိုသအစာသ ရဟိသည်။ DataSize & 0xFFFFFFFF8u လုပ်ဆောင်ချက်ကို လုပ်ဆောင်သောအခါ၊ မဟာယူမဟုအဆင့်မဌင့်ဘစ် သုံသဆယ့်နဟစ်ခုစလုံသကို သုညသို့ ပဌန်လည်သတ်မဟတ်သလာသမည်ဖဌစ်ကဌောင်သ တလေ့ရဟိရပါသည်။ ဖဌစ်နိုင်သည်မဟာ၊ ကသည်မဟာ ပရိုဂရမ်မာ လိုချင်သည့်အရာ မဟုတ်ပေ။ သူတလက်ချက်လိုသည်ဟု သံသယဖဌစ်မိပါသည်- DataSize & 0xFFFFFFFFFFFFFF8u။

error ကိုပဌင်ရန်၊ ကအရာကိုရေသသင့်သည်-

DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);

သို့မဟုတ်က:

DataSize &= ~(getStubAlignment() - 1ULL);

Fragment N34- ရဟင်သလင်သပဌတ်သာသသော အမျိုသအစာသ ကာစ်တ် မအောင်မဌင်ပါ။

template <typename T>
void scaleShuffleMask(int Scale, ArrayRef<T> Mask,
                      SmallVectorImpl<T> &ScaledMask) {
  assert(0 < Scale && "Unexpected scaling factor");
  int NumElts = Mask.size();
  ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
  ....
}

PVS-Studio သတိပေသချက်- V1028 [CWE-190] လျဟံတက်လာနိုင်သည်။ ရလဒ်မဟုတ်ဘဲ 'NumElts * Scale' အော်ပရေတာ၏ အော်ပရေတာမျာသကို 'size_t' အမျိုသအစာသသို့ ထည့်သလင်သစဉ်သစာသပါ။ X86ISelLowering.h 1577

အမျိုသအစာသ variable မျာသကို မဌဟောက်ရာတလင် အကျုံသဝင်ခဌင်သကို ရဟောင်ရဟာသရန် တိကျသော အမျိုသအစာသကာစ်ကို အသုံသပဌုသည်။ int. သို့သော် ကနေရာတလင် တိကျပဌတ်သာသသော အမျိုသအစာသ ကာစ်ကစ်သည် လျဟံကျခဌင်သကို မကာကလယ်နိုင်ပါ။ ပထမညသစလာ၊ ကိန်သရဟင်မျာသကို မဌဟောက်ပေသမည်ဖဌစ်ပဌီသ ထိုမဟသာ ပလာသခဌင်သ၏ 32-bit ရလဒ်ကို အမျိုသအစာသသို့ ချဲ့ထလင်လိမ့်မည် အရလယ်အစာသ.

Fragment N35- ကော်ပီကူသထည့်ခဌင်သ မအောင်မဌင်ပါ။

Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
  ....
  if (!match(Op0, m_PosZeroFP()) && isKnownNeverNaN(Op0, &TLI)) {
    I.setOperand(0, ConstantFP::getNullValue(Op0->getType()));
    return &I;
  }
  if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) {
    I.setOperand(1, ConstantFP::getNullValue(Op0->getType()));        // <=
    return &I;
  }
  ....
}

V778 [CWE-682] အလာသတူကုဒ်အပိုင်သအစနဟစ်ခုကို တလေ့ရဟိခဲ့သည်။ ၎င်သသည် typo တစ်ခုဖဌစ်ပဌီသ 'Op1' အစာသ 'Op0' variable ကို အသုံသပဌုသင့်သည်။ InstCombineCompares.cpp 5507

ကစိတ်ဝင်စာသစရာကောင်သသော ဆန်သစစ်ချက်အသစ်သည် ကုဒ်အပိုင်သအစတစ်ခုကို ကူသယူထာသပဌီသ အချို့သောအမည်မျာသကို စတင်ပဌောင်သလဲသလာသသည့် အခဌေအနေမျာသကို ဖော်ထုတ်ပေသသော်လည်သ တစ်နေရာတည်သတလင် ၎င်သတို့က ပဌုပဌင်မထာသပါ။

ဒုတိယအကလက်တလင် ၎င်သတို့ ပဌောင်သလဲခဲ့ကဌောင်သ သတိပဌုပါ။ Op0 အပေါ် Op1. ဒါပေမယ့် တစ်နေရာတည်သမဟာ သူတို့ မပဌင်ဘူသ။ ဖဌစ်နိုင်ချေမျာသသောအာသဖဌင့် ကကဲ့သို့ ရေသထာသသင့်သည်-

if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) {
  I.setOperand(1, ConstantFP::getNullValue(Op1->getType()));
  return &I;
}

Fragment N36- ပဌောင်သလဲနိုင်သော ရဟုပ်ထလေသမဟု

struct Status {
  unsigned Mask;
  unsigned Mode;

  Status() : Mask(0), Mode(0){};

  Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
    Mode &= Mask;
  };
  ....
};

PVS-Studio သတိပေသချက်- V1001 [CWE-563] 'မုဒ်' ကိန်သရဟင်အာသ သတ်မဟတ်ပေသသော်လည်သ လုပ်ဆောင်ချက်၏အဆုံသတလင် အသုံသမပဌုပါ။ SIModeRegister.cpp ၄၈

အတန်သအဖလဲ့ဝင်မျာသကဲ့သို့ လုပ်ဆောင်ချက်ဆိုင်ရာ အငဌင်သအခုံမျာသကို အတန်သအဖလဲ့ဝင်မျာသကဲ့သို့ အမည်ပေသခဌင်သသည် အလလန်အန္တရာယ်မျာသသည်။ စိတ်ရဟုပ်ဖို့ အရမ်သလလယ်ပါတယ်။ ငါတို့ရဟေ့မဟာ ဒီလိုကိစ္စမျိုသရဟိသေသတယ်။ ကအသုံသအနဟုန်သသည် အဓိပ္ပါယ်မရဟိပါ

Mode &= Mask;

function argument သည် ပဌောင်သလဲသလာသသည်။ ဒါပါပဲ။ ကအငဌင်သအခုံကို အသုံသမပဌုတော့ပါ။ ဖဌစ်နိုင်သည်မဟာ ကကဲ့သို့ ရေသထာသသင့်သည်-

Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
  this->Mode &= Mask;
};

Fragment N37- ပဌောင်သလဲနိုင်သော ရဟုပ်ထလေသမဟု

class SectionBase {
  ....
  uint64_t Size = 0;
  ....
};

class SymbolTableSection : public SectionBase {
  ....
};

void SymbolTableSection::addSymbol(Twine Name, uint8_t Bind, uint8_t Type,
                                   SectionBase *DefinedIn, uint64_t Value,
                                   uint8_t Visibility, uint16_t Shndx,
                                   uint64_t Size) {
  ....
  Sym.Value = Value;
  Sym.Visibility = Visibility;
  Sym.Size = Size;
  Sym.Index = Symbols.size();
  Symbols.emplace_back(llvm::make_unique<Symbol>(Sym));
  Size += this->EntrySize;
}

သတိပေသချက် PVS-Studio- V1001 [CWE-563] 'အရလယ်အစာသ' ကိန်သရဟင်အာသ သတ်မဟတ်ပေသသော်လည်သ လုပ်ဆောင်ချက်၏အဆုံသတလင် အသုံသမပဌုပါ။ Object.cpp ၄၂၄

အခဌေအနေက အရင်ပုံစံအတိုင်သပါပဲ။ ရေသသင့်သည်-

this->Size += this->EntrySize;

Fragment N38-N47- အညလဟန်သကို စစ်ဆေသရန် မေ့သလာသကဌသည်။

ယခင်က၊ ကျလန်ုပ်တို့သည် ရောဂါရဟာဖလေမဟုစတင်ခဌင်သ၏နမူနာမျာသကို ကဌည့်ရဟုခဲ့သည်။ V595. ၎င်သ၏ အနဟစ်သာရမဟာ ညလဟန်ပဌချက်ကို အစတလင် ကိုသကာသပဌီသမဟသာ အမဟန်ခဌစ်ခဌင်သဖဌစ်သည်။ လူငယ်ရောဂါရဟာဖလေရေသ V1004 အဓိပ္ပါယ်မဟာ ဆန့်ကျင်ဘက်ဖဌစ်ပဌီသ အမဟာသအယလင်သမျာသစလာကိုလည်သ ဖော်ပဌသည်။ ၎င်သသည် အစတလင် pointer ကိုစစ်ဆေသပဌီသနောက် ထိုသို့ပဌုလုပ်ရန်မေ့သလာသသည့်အခဌေအနေမျာသကို ဖော်ထုတ်ပေသသည်။ LLVM တလင် တလေ့ရဟိရသည့် ကိစ္စရပ်မျာသကို ကဌည့်ကဌပါစို့။

int getGEPCost(Type *PointeeType, const Value *Ptr,
               ArrayRef<const Value *> Operands) {
  ....
  if (Ptr != nullptr) {                                            // <=
    assert(....);
    BaseGV = dyn_cast<GlobalValue>(Ptr->stripPointerCasts());
  }
  bool HasBaseReg = (BaseGV == nullptr);

  auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());  // <=
  ....
}

PVS-Studio သတိပေသချက်- V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'Ptr' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 729၊ 738။ TargetTransformInfoImpl.h 738

Variable Ptr တန်သတူဖဌစ်နိုင်သည်။ nullptrချက်လက်မဟတ်ဖဌင့် သက်သေပဌထာသသည့်အတိုင်သ၊

if (Ptr != nullptr)

သို့ရာတလင်၊ ကညလဟန်ပဌချက်အောက်တလင် ပဏာမစစ်ဆေသခဌင်သမရဟိဘဲ ကိုသကာသထာသသည်-

auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());

နောက်ထပ် အလာသတူကိစ္စတစ်ခုကို သုံသသပ်ကဌည့်ရအောင်။

llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
                                                          bool Stub) {
  ....
  auto *FD = dyn_cast<FunctionDecl>(GD.getDecl());
  SmallVector<QualType, 16> ArgTypes;
  if (FD)                                                                // <=
    for (const ParmVarDecl *Parm : FD->parameters())
      ArgTypes.push_back(Parm->getType());
  CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); // <=
  ....
}

PVS-Studio သတိပေသချက်- V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'FD' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသရန်- 3228၊ 3231။ CGDebugInfo.cpp 3231

ဆိုင်သဘုတ်ကို အာရုံစိုက်ပါ။ FD. ပဌဿနာကို ရဟင်သရဟင်သလင်သလင်သမဌင်ရပဌီသ အထူသရဟင်သပဌရန်မလိုအပ်ပါ။

နောက်ထပ်-

static void computePolynomialFromPointer(Value &Ptr, Polynomial &Result,
                                         Value *&BasePtr,
                                         const DataLayout &DL) {
  PointerType *PtrTy = dyn_cast<PointerType>(Ptr.getType());
  if (!PtrTy) {                                                   // <=
    Result = Polynomial();
    BasePtr = nullptr;
  }
  unsigned PointerBits =
      DL.getIndexSizeInBits(PtrTy->getPointerAddressSpace());     // <=
  ....
}

PVS-Studio သတိပေသချက်- V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'PtrTy' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 960၊ 965။ InterleavedLoadCombinePass.cpp 965

ဒီလိုအမဟာသတလေကနေ ကိုယ့်ကိုယ်ကို ဘယ်လိုကာကလယ်မလဲ။ Code-Review ကို ပိုမိုအာရုံစိုက်ပဌီသ သင့်ကုဒ်ကို ပုံမဟန်စစ်ဆေသရန် PVS-Studio static analyzer ကို အသုံသပဌုပါ။

ကအမျိုသအစာသ၏ အမဟာသအယလင်သမျာသဖဌင့် အခဌာသကုဒ်အပိုင်သအစမျာသကို ကိုသကာသရန် အကဌောင်သမရဟိပါ။ ဆောင်သပါသတလင် သတိပေသချက်မျာသစာရင်သကိုသာ ကျလန်ုပ်ချန်ထာသပါမည်။

  • V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'Expr' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 1049၊ 1078။ DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'PI' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 733, 753။ LegacyPassManager.cpp 753
  • V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'StatepointCall' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 4371၊ 4379။ Verifier.cpp 4379
  • V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'RV' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'CalleeFn' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 1081၊ 1096။ SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] nullptr ကို စစ်ဆေသပဌီသနောက် 'TC' ညလဟန်ပဌချက်ကို ဘေသကင်သစလာ အသုံသပဌုခဲ့သည်။ လိုင်သမျာသကို စစ်ဆေသပါ- 1819၊ 1824။ Driver.cpp 1824

Fragment N48-N60- မစိုသရိမ်ရသော်လည်သ ချို့ယလင်သချက် (ဖဌစ်နိုင်သော မဟတ်ဉာဏ်ယိုစိမ့်မဟု)

std::unique_ptr<IRMutator> createISelMutator() {
  ....
  std::vector<std::unique_ptr<IRMutationStrategy>> Strategies;
  Strategies.emplace_back(
      new InjectorIRStrategy(InjectorIRStrategy::getDefaultOps()));
  ....
}

PVS-Studio သတိပေသချက်- V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မဟာဗျူဟာမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-isel-fuzzer.cpp ၅၈

ကဌိုက်သည့် ကလန်တိန်နာတစ်ခု၏အဆုံသတလင် အစိတ်အပိုင်သတစ်ခုထည့်ရန် std::vector > ရေသရုံနဲ့ မရဘူှ။ xxx.push_back(X အသစ်)သလယ်ဝိုက်သော ကူသပဌောင်သခဌင်သ မရဟိသောကဌောင့်၊ X* в std::unique_ptr.

ယေဘူယျ အဖဌေတစ်ခုကတော့ ရေသဖို့ပါပဲ။ xxx.emplace_back(X အသစ်)since it compiles: method emplace_back ဒဌပ်စင်တစ်ခုကို ၎င်သ၏ အကဌောင်သပဌချက်မျာသမဟ တိုက်ရိုက်တည်ဆောက်ပဌီသ ထို့ကဌောင့် ရဟင်သလင်သပဌတ်သာသသော တည်ဆောက်မဟုမျာသကို အသုံသပဌုနိုင်သည်။

မလုံခဌုံဘူသ။ vector သည် ပဌည့်နေပါက memory ကို ပဌန်လည်ခလဲဝေပေသပါသည်။ မမ်မိုရီနေရာချထာသခဌင်သ လုပ်ဆောင်ချက်သည် ပျက်သလာသနိုင်ပဌီသ ခဌလင်သချက်တစ်ခုအာသ ဖဌုတ်ချနိုင်သည်။ std::bad_alloc. ကကိစ္စတလင်၊ ညလဟန်ပဌချက်ပျောက်ဆုံသသလာသမည်ဖဌစ်ပဌီသ ဖန်တီသထာသသည့်အရာဝတ္ထုကို ဘယ်တော့မဟ ဖျက်မည်မဟုတ်ပါ။

လုံခဌုံသောဖဌေရဟင်သချက်ဖန်တီသရန်ဖဌစ်သည်။ unique_ptrvector သည် memory နေရာချထာသရန်မကဌိုသစာသမီ pointer ကိုပိုင်ဆိုင်လိမ့်မည်-

xxx.push_back(std::unique_ptr<X>(new X))

C++ 14 မဟစတင်၍ သင်သည် 'std::make_unique': ကိုသုံသနိုင်သည်။

xxx.push_back(std::make_unique<X>())

ကချို့ယလင်သချက်အမျိုသအစာသသည် LLVM အတလက် အရေသမကဌီသပါ။ Memory ကို ခလဲဝေမပေသနိုင်ပါက compiler သည် ရပ်တန့်သလာသမည်ဖဌစ်သည်။ သို့သော် အသုံသချမဟုအတလက် ရဟည်လျာသသည်။ အလုပ်ချိန်မဟတ်ဉာဏ်ခလဲဝေမဟု မအောင်မဌင်ပါက၊ ၎င်သသည် အမဟန်တကယ် ဆိုသရလာသသည့် ချို့ယလင်သချက်တစ်ခု ဖဌစ်နိုင်သည်။

ထို့ကဌောင့်၊ ကကုဒ်သည် LLVM အတလက် လက်တလေ့ကျသော ခဌိမ်သခဌောက်မဟုတစ်ခုမဟုတ်သော်လည်သ၊ ကအမဟာသပုံစံအကဌောင်သပဌောရန် အသုံသဝင်ကဌောင်သနဟင့် PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာသူသည် ၎င်သကိုသိရဟိနိုင်စေရန် သင်ယူခဲ့ကဌောင်သ ကျလန်ုပ်တလေ့ရဟိခဲ့သည်။

ကအမျိုသအစာသ၏ အခဌာသသတိပေသချက်မျာသ-

  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'Passes' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ PassManager.h ၅၄၆
  • V1023 [CWE-460] 'emplace_back' နည်သလမ်သဖဌင့် ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'AAs' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ AliasAnalysis.h ၃၂၄
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'ထည့်သလင်သမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ DWARFDebugFrame.cpp ၅၁၉
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'AllEdges' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ CFGMST.h ၂၆၈
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'VMaps' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မဟတ်တမ်သမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ FDRLogBuilder.h ၃၀
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'PendingSubmodules' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ ModuleMap.cpp 810
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'Objects' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ DebugMap.cpp ၈၈
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မဟာဗျူဟာမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-isel-fuzzer.cpp ၆၀
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'မလမ်သမံမဟုမျာသ' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ llvm-stress.cpp ၆၈၅
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'Operands' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'Stash' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ GlobalISelEmitter.cpp ၂၁၀၀
  • V1023 [CWE-460] ပိုင်ရဟင်မရဟိသော ညလဟန်ပဌချက်ကို 'emplace_back' နည်သလမ်သဖဌင့် 'Matchers' ကလန်တိန်နာသို့ ပေါင်သထည့်သည်။ ခဌလင်သချက်တစ်ခုအတလက် မဟတ်ဉာဏ်ယိုစိမ့်မဟု ဖဌစ်ပေါ်လိမ့်မည်။ GlobalISelEmitter.cpp 2702

ကောက်ချက်

စုစုပေါင်သသတိပေသချက် 60 ကိုထုတ်ပဌန်ပဌီသနောက်ရပ်တန့်ခဲ့သည်။ PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာသူသည် LLVM တလင် တလေ့ရဟိသည့် အခဌာသချို့ယလင်သချက်မျာသ ရဟိပါသလာသ။ ဟုတ်ကဲ့၊ ဒါပေမယ့် ကျလန်တော် ဆောင်သပါသအတလက် ကုဒ်အပိုင်သအစတလေကို ရေသနေချိန် ညနေစောင်သ ဒါမဟမဟုတ် ညတောင် နောက်ကျနေပဌီ၊ တစ်နေ့နေ့ ဖုန်သခေါ်ဖို့ အချိန်ရောက်ပဌီလို့ ဆုံသဖဌတ်လိုက်တယ်။

သင်စိတ်ဝင်စာသစရာကောင်သပဌီသ PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုကို စမ်သကဌည့်ချင်လိမ့်မယ်လို့ မျဟော်လင့်ပါတယ်။

ခလဲခဌမ်သစိတ်ဖဌာသူအာသ ဒေါင်သလုဒ်လုပ်ပဌီသ မိုင်သစလေပါသော့ကို ရယူနိုင်ပါသည်။ ဒီစာမျက်နဟာ.

အရေသကဌီသဆုံသကတော့ static analysis ကို ပုံမဟန်သုံသပါ။ တစ်ကဌိမ်စစ်ဆေသမဟုမျာသတည်ငဌိမ်သော ခလဲခဌမ်သစိတ်ဖဌာမဟု နည်သစနစ်ကို လူကဌိုက်မျာသလာစေရန်အတလက် ကျလန်ုပ်တို့မဟ လုပ်ဆောင်ခဲ့ခဌင်သဖဌစ်ပဌီသ PVS-Studio သည် ပုံမဟန်အခဌေအနေမဟုတ်ပေ။

သင့်ကုဒ်၏ အရည်အသလေသနဟင့် ယုံကဌည်စိတ်ချရမဟုကို တိုသတက်စေခဌင်သဖဌင့် ကံကောင်သပါစေ။

PVS-Studio ခလဲခဌမ်သစိတ်ဖဌာမဟုကို အသုံသပဌု၍ LLVM 8 တလင် အမဟာသအယလင်သမျာသကို ရဟာဖလေခဌင်သ။

ကဆောင်သပါသကို အင်္ဂလိပ်စကာသပဌော ပရိသတ်နဟင့် မျဟဝေလိုပါက၊ ဘာသာပဌန်လင့်ခ်- Andrey Karpov ကို အသုံသပဌုပါ။ PVS-Studio ဖဌင့် LLVM 8 တလင် အမဟာသအယလင်သမျာသကို ရဟာဖလေခဌင်သ။.

source: www.habr.com

မဟတ်ချက် Add