Ukuthola izimbungulu ku-LLVM 8 usebenzisa i-PVS-Studio analyzer

Ukuthola izimbungulu ku-LLVM 8 usebenzisa i-PVS-Studio analyzer
Sekudlule iminyaka engaphezu kwemibili kwahlolwa ikhodi yokugcina yephrojekthi ye-LLVM kusetshenziswa isihlaziyi sethu se-PVS-Studio. Masiqinisekise ukuthi isihlaziyi se-PVS-Studio siseyithuluzi eliholayo lokuhlonza amaphutha nokuba sengozini okungenzeka. Ukwenza lokhu, sizohlola futhi sithole amaphutha amasha ekukhishweni kwe-LLVM 8.0.0.

Isihloko esizobhalwa

Uma ngikhuluma iqiniso, ngangingafuni ukubhala lesi sihloko. Akujabulisi ukubhala ngephrojekthi esesivele siyihlolile izikhathi ezimbalwa (1, 2, 3). Kungcono ukubhala ngento entsha, kodwa anginakho ukukhetha.

Ngaso sonke isikhathi inguqulo entsha ye-LLVM ikhishwa noma ibuyekezwa I-Clang Static Analyzer, sithola imibuzo yohlobo olulandelayo kumeyili yethu:

Bheka, inguqulo entsha ye-Clang Static Analyzer ifunde ukuthola amaphutha amasha! Kimina kubonakala sengathi ukubaluleka kokusebenzisa i-PVS-Studio kuncipha. U-Clang uthola amaphutha amaningi kunangaphambili futhi ufinyelela amakhono e-PVS-Studio. Ucabangani ngalokhu?

Kulokhu ngihlala ngifuna ukuphendula into efana nale:

Nathi asihlali singenzi lutho! Sithuthukise kakhulu amandla okuhlaziya i-PVS-Studio. Ngakho-ke ungakhathazeki, siyaqhubeka nokuhola njengakuqala.

Ngeshwa, lena impendulo embi. Abukho ubufakazi kuyo. Futhi yingakho ngibhala lesi sihloko manje. Ngakho-ke, iphrojekthi ye-LLVM isiphinde yahlolwa futhi kwatholakala amaphutha ahlukahlukene kuyo. Manje ngizobonisa lezo ebezibonakala zithakaseleka kimi. I-Clang Static Analyzer ayikwazi ukuthola lawa maphutha (noma kuphazamisa kakhulu ukwenza kanjalo ngosizo lwayo). Kodwa singakwazi. Ngaphezu kwalokho, ngathola futhi ngabhala phansi wonke lawa maphutha ngobusuku obubodwa.

Kodwa ukubhala lesi sihloko kwathatha amasonto ambalwa. Angikwazanga nje ukubeka konke lokhu embhalweni :).

Ngendlela, uma unentshisekelo yokuthi ibuphi ubuchwepheshe obusetshenziswa ku-PVS-Studio analyzer ukukhomba amaphutha kanye nokuba sengozini okungenzeka, ngiphakamisa ukuthi ujwayelane nalokhu. inothi.

Ukuxilonga okusha nokudala

Njengoba sekushiwo, cishe eminyakeni emibili edlule iphrojekthi ye-LLVM yaphinde yahlolwa, futhi amaphutha atholakele alungiswa. Manje lesi sihloko sizokwethula iqoqo elisha lamaphutha. Kungani kwatholakala izimbungulu ezintsha? Kunezizathu ezi-3 zalokhu:

  1. Iphrojekthi ye-LLVM iyashintsha, ishintsha ikhodi endala futhi yengeza ikhodi entsha. Ngokwemvelo, kukhona amaphutha amasha kukhodi eguquliwe nebhaliwe. Lokhu kukhombisa ngokusobala ukuthi ukuhlaziya okumile kufanele kusetshenziswe njalo, hhayi ngezikhathi ezithile. Izihloko zethu zibonisa kahle amakhono omhlaziyi we-PVS-Studio, kodwa lokhu akuhlangene nokuthuthukisa ikhwalithi yekhodi nokunciphisa izindleko zokulungisa amaphutha. Sebenzisa i-static code analyzer njalo!
  2. Siphothula futhi sithuthukisa ukuxilonga okukhona kakade. Ngakho-ke, umhlaziyi angakwazi ukubona amaphutha angawabonanga ngesikhathi sokuskena kwangaphambilini.
  3. Ukuxilongwa okusha kuvele ku-PVS-Studio ebingekho eminyakeni emi-2 edlule. Nginqume ukuwaqokomisa esigabeni esihlukile ukuze ngibonise ngokucacile ukuthuthukiswa kwe-PVS-Studio.

Amaphutha akhonjwe ngokuxilongwa okwakukhona eminyakeni emi-2 edlule

Isiqephu esingu-N1: Kopisha-Namathisela

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
  ....
}

Isexwayiso se-PVS-Studio: V501 [CWE-570] Kukhona izinkulumo ezincanyana ezifanayo 'Name.startswith("avx512.mask.permvar.")' kwesokunxele nakwesokudla se-'||' opharetha. Ukuthuthukiswa Okuzenzakalelayo.cpp 73

Kuhlolwe kabili ukuthi igama liqala ngochungechunge oluncane "avx512.mask.permvar.". Eshekeni lesibili, kusobala ukuthi babefuna ukubhala okunye, kodwa bakhohlwa ukulungisa umbhalo okopishiwe.

Isiqephu esingu-N2: I-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;
  ....
}

Isexwayiso se-PVS-Studio: V501 Kukhona izinkulumo ezincanyana ezifanayo 'CXNameRange_WantQualifier' kwesokunxele nakwesokudla se-'|' opharetha. I-CIndex.cpp 7245

Ngenxa ye-typo, okufanayo okuqanjwe njalo kusetshenziswa kabili CXNameRange_WantQualifier.

I-Fragment N3: Ukudideka nokuhamba phambili komsebenzisi

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

Isexwayiso se-PVS-Studio: V502 [CWE-783] Mhlawumbe i-'?:' opharetha isebenza ngendlela ehlukile kunaleyo ebilindelwe. Umsebenzisi we-'?:' unokubalulekile okuphansi kuno-'==' opharetha. PPCTargetTransformInfo.cpp 404

Ngokubona kwami, leli iphutha elihle kakhulu. Yebo, ngiyazi nginemibono eyinqaba ngobuhle :).

Manje, ngokusho okuza kuqala ku-opharetha, isisho sihlolwa kanje:

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

Ngokombono ongokoqobo, isimo esinjalo asinangqondo, ngoba singancishiswa sibe:

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

Leli iphutha elicacile. Ngokunokwenzeka, bebefuna ukuqhathanisa u-0/1 nokuguquguquka Index. Ukuze ulungise ikhodi udinga ukungeza abakaki eduze kwe-ternary operator:

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

Ngendlela, umqhubi we-ternary uyingozi kakhulu futhi uvusa amaphutha anengqondo. Qaphela kakhulu ngakho futhi ungabi nomhobholo kubakaki. Ngibheke lesi sihloko ngokuningiliziwe lapha, esahlukweni esithi “Qaphela I-?: Isisebenzisi Futhi Usivale Kobakaki.”

Isiqephu esingu-N4, i-N5: Isikhombi esingenalutho

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;
  }
  ....
}

Isexwayiso se-PVS-Studio: V522 [CWE-476] Ukuhoxiswa kwesikhombi esingenalutho 'LHS' kungenzeka. TGParser.cpp 2152

Uma i-pointer LHS akunalutho, kufanele kukhishwe isexwayiso. Kodwa-ke, esikhundleni salokho, lesi sikhombisi esingenalutho sizosuswa: LHS->getAsString().

Lesi yisimo esijwayelekile kakhulu lapho iphutha lifihliwe kusibambi samaphutha, njengoba kungekho muntu owahlolayo. Abahlaziyi be-Static bahlola yonke ikhodi efinyelelekayo, kungakhathaliseki ukuthi isetshenziswa kaningi kangakanani. Lesi isibonelo esihle kakhulu sokuthi ukuhlaziya okumile kuhambisana kanjani nezinye izindlela zokuhlola nokuvikela amaphutha.

Iphutha elifanayo lokubamba isikhombisi RHS kuvunyelwe kukhodi engezansi nje: V522 [CWE-476] Ukuhoxiswa kwesikhombi esingenalutho 'RHS' kungase kwenzeke. TGParser.cpp 2186

I-Fragment N6: Ukusebenzisa i-pointer ngemva kokunyakaza

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);
  }
  ....
}

Isexwayiso se-PVS-Studio: V522 [CWE-476] Ukuhoxiswa kwe-null pointer 'ProgClone' kungase kwenzeke. I-Miscompilation.cpp 601

Ekuqaleni isikhombi esihlakaniphile I-ProgClone uyeka ukuba ngumnikazi wento:

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

Eqinisweni, manje I-ProgClone iyisikhombi esingenalutho. Ngakho-ke, i-null pointer dereference kufanele yenzeke ngezansi nje:

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

Kodwa, empeleni, lokhu ngeke kwenzeke! Qaphela ukuthi i-loop ayisetshenziswanga ngempela.

Ekuqaleni kwesitsha I-MiscompiledFuncs kusuliwe:

MiscompiledFunctions.clear();

Okulandelayo, usayizi walesi sitsha usetshenziswa esimweni se-loop:

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

Kulula ukubona ukuthi iluphu ayiqali. Ngicabanga ukuthi lokhu futhi kuyiphutha futhi ikhodi kufanele ibhalwe ngendlela ehlukile.

Kubonakala sengathi sihlangabezane nalelo phutha elidumile! Iphutha elilodwa lifihla elinye :).

I-Fragment N7: Ukusebenzisa i-pointer ngemva kokunyakaza

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;
  }
  ....
}

Isexwayiso se-PVS-Studio: V522 [CWE-476] Ukuhoxiswa kwesikhombi esingenalutho 'Ukuhlola' kungase kwenzeke. I-Miscompilation.cpp 709

Isimo esifanayo futhi. Ekuqaleni, okuqukethwe kwento kuyanyakaziswa, bese kusetshenziswa sengathi akwenzekanga lutho. Ngibona lesi simo kaningi kukhodi yohlelo ngemuva kokuvela kwe-semantics yokunyakaza ku-C++. Yingakho ngithanda ulimi lwe-C++! Ziyanda izindlela ezintsha zokudubula owakho umlenze. I-PVS-Studio analyzer izohlala inomsebenzi :).

Isiqephu esingu-N8: Isikhombi esingenalutho

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);
}

Isexwayiso se-PVS-Studio: I-V522 [CWE-476] Ukuhoxiswa kwe-null pointer 'Type' kungase kwenzeke. I-PrettyFunctionDumper.cpp 233

Ngokungeziwe kuzibambi zamaphutha, imisebenzi yokuphrinta yokulungisa iphutha ngokuvamile ayihlolwa. Sinecala elinjalo nje phambi kwethu. Umsebenzi ulinde umsebenzisi, okuthi, esikhundleni sokuxazulula izinkinga zakhe, azophoqeleka ukuthi alungise.

Ngokuqondile:

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

Isiqephu esingu-N9: Isikhombi esingenalutho

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());
   ....
}

Isexwayiso se-PVS-Studio: V522 [CWE-476] Ukuhoxiswa kwesikhombi esingenalutho esithi 'Ty' kungase kwenzeke. I-SearchableTableEmitter.cpp 614

Ngicabanga ukuthi konke kucacile futhi akudingi kuchazwa.

Isiqephu esingu-N10: I-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;
}

Isexwayiso se-PVS-Studio: V570 I-'Identifier->Type' eguquguqukayo inikezwa yona ngokwayo. FormatTokenLexer.cpp 249

Akukho phuzu ekunikezeni okuguquguqukayo ngokwakho. Cishe babefuna ukubhala:

Identifier->Type = Question->Type;

Isiqephu esingu-N11: Ikhefu elisolisayo

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

Isexwayiso se-PVS-Studio: V622 [CWE-478] Cabangela ukuhlola isitatimende 'sokushintsha'. Kungenzeka ukuthi u-opharetha 'wecala' wokuqala ulahlekile. I-SystemZAsmParser.cpp 652

Kukhona u-opharetha osolisa kakhulu ekuqaleni ukuphuka. Ukhohlwe ukubhala okunye lapha?

I-Fragment N12: Ihlola isikhombisi ngemva kokuhoxiswa

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");
  ....
}

Isexwayiso se-PVS-Studio: V595 [CWE-476] Isikhombi se-'Callee' sisetshenziswe ngaphambi kokuthi siqinisekiswe ngokumelene ne-nullptr. Hlola imigqa: 172, 174. AMDGPUInline.cpp 172

Isikhombi Calee ekuqaleni kuhoxiswa lapho umsebenzi ubizwa ngawo utholeTTI.

Futhi-ke kuvela ukuthi lesi sikhombisi kufanele sihlolwe ngokulingana nullptr:

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

Kodwa sekwephuze kakhulu...

I-Fragment N13 - N...: Ihlola isikhombisi ngemva kokuhoxiswa

Isimo okuxoxwe ngaso esiqeshini sekhodi sangaphambilini asihlukile. Ivela lapha:

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()) {               // <=
  ....
}

Isexwayiso se-PVS-Studio: V595 [CWE-476] Isikhombi se-'CalleeFn' sisetshenziswe ngaphambi kokuthi siqinisekiswe ngokumelene ne-nullptr. Hlola imigqa: 1079, 1081. SimplifyLibCalls.cpp 1079

Futhi lapha:

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());     // <=
  ....
}

Isexwayiso se-PVS-Studio: V595 [CWE-476] Isikhombisi se-'ND' sisetshenziswe ngaphambi kokuthi siqinisekiswe ngokumelene ne-nullptr. Hlola imigqa: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Futhi lapha:

  • V595 [CWE-476] Isikhombisi se-'U' sasetshenziswa ngaphambi kokuthi siqinisekiswe ngokumelene ne-nullptr. Hlola imigqa: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Isikhombisi se-'ND' sisetshenziswe ngaphambi kokuthi siqinisekiswe ngokumelene ne-nullptr. Hlola imigqa: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Ngabe sengingenaso intshisekelo yokufunda izexwayiso ezinenombolo V595. Ngakho-ke angazi ukuthi akhona yini amaphutha afanayo ngaphandle kwalawa abhalwe lapha. Cishe kukhona.

Isiqephu esingu-N17, N18: Ukushintsha okusolisayo

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

Isexwayiso se-PVS-Studio: V629 [CWE-190] Cabangela ukuhlola inkulumo ethi '~(Size - 1) << 1'. Ukushintsha kancane kwevelu engu-32-bit ngokunwetshwa okulandelayo kuhlobo lwamabhithi angama-64. AArch64AddressingModes.h 260

Kungase kungabi iphutha futhi ikhodi isebenza ngendlela ehlosiwe ngayo. Kodwa ngokusobala lena yindawo esolisa kakhulu futhi idinga ukubhekwa.

Ake sithi ukuguquguquka Usayizi ilingana no-16, bese kuba umbhali wekhodi ehlele ukuyithola ngokuguquguquka Nimms incazelo:

1111111111111111111111111111111111111111111111111111111111100000

Nokho, eqinisweni umphumela uzoba:

0000000000000000000000000000000011111111111111111111111111100000

Iqiniso liwukuthi zonke izibalo zenzeka kusetshenziswa uhlobo olungasayiniwe lwe-32-bit. Kulapho kuphela, lolu hlobo olungasayiniwe lwe-32-bit luzonwetshwa ngokusobala lube lindokuhle. Kulokhu, izingcezu ezibaluleke kakhulu zizoba ziro.

Ungakwazi ukulungisa isimo kanje:

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

Isimo esifanayo: V629 [CWE-190] Cabangela ukuhlola inkulumo ethi 'Immr << 6'. Ukushintsha kancane kwevelu engu-32-bit ngokunwetshwa okulandelayo kuhlobo lwamabhithi angama-64. AArch64AddressingModes.h 269

Isiqephu esingu-N19: Igama elingukhiye elingekho futhi?

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");
  }
  ....
}

Isexwayiso se-PVS-Studio: V646 [CWE-670] Cabangela ukuhlola ingqondo yohlelo lokusebenza. Kungenzeka ukuthi igama elingukhiye elithi 'enye' alikho. I-AMDGPUAsmParser.cpp 5655

Alikho iphutha lapha. Kusukela ngaleso sikhathi-block yokuqala if iphetha nge qhubeka, ke akunandaba, kukhona igama elingukhiye futhi noma cha. Noma iyiphi indlela ikhodi izosebenza ngendlela efanayo. Usaphuthelwe futhi yenza ikhodi ingacaci futhi ibe yingozi. Uma esikhathini esizayo qhubeka iyanyamalala, ikhodi izoqala ukusebenza ngokuhluke ngokuphelele. Ngokubona kwami ​​kungcono ukwengeza futhi.

Isiqephu esingu-N20: Ama-typos amane ohlobo olufanayo

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;
}

Izexwayiso ze-PVS-Studio:

  • I-V655 [CWE-480] Izintambo bezihlangene kodwa azisetshenziswa. Cabangela ukuhlola inkulumo ethi 'Umphumela + Name.str()'. I-Symbol.cpp 32
  • I-V655 [CWE-480] Izintambo bezihlangene kodwa azisetshenziswa. Cabangela ukuhlola inkulumo ethi 'Umphumela + "(ObjC Class)" + Name.str()'. I-Symbol.cpp 35
  • I-V655 [CWE-480] Izintambo bezihlangene kodwa azisetshenziswa. Cabangela ukuhlola inkulumo ethi 'Umphumela + "(ObjC Class EH) " + Name.str()'. I-Symbol.cpp 38
  • I-V655 [CWE-480] Izintambo bezihlangene kodwa azisetshenziswa. Cabangela ukuhlola inkulumo ethi 'Umphumela + "(ObjC IVar)" + Name.str()'. I-Symbol.cpp 41

Ngengozi, kusetshenziswa u-opharetha + esikhundleni sika-opharetha +=. Umphumela uba imiklamo engenancazelo.

Isiqephu esingu-N21: Ukuziphatha okungachazwanga

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();
    }
  }
}

Zama ukuthola ikhodi eyingozi ngokwakho. Futhi lesi yisithombe sokuphazamisa ukunaka ukuze ungabheki impendulo ngokushesha:

Ukuthola izimbungulu ku-LLVM 8 usebenzisa i-PVS-Studio analyzer

Isexwayiso se-PVS-Studio: V708 [CWE-758] Kusetshenziswa ukwakhiwa okuyingozi: 'FeaturesMap[Op] = FeaturesMap.size()', lapho i-'FeaturesMap' ingeyesigaba 'semephu'. Lokhu kungase kuholele ekuziphatheni okungachazwanga. I-RISCVCompressInstEmitter.cpp 490

Umugqa wenkinga:

FeaturesMap[Op] = FeaturesMap.size();

Uma isici Op ayitholakali, bese kwakhiwa into entsha kumephu futhi inani lezakhi kule mephu libhalwe lapho. Akwaziwa ukuthi umsebenzi uzobizwa yini usayizi ngaphambi noma ngemva kokwengeza into entsha.

Isiqephu esingu-N22-N24: Izabelo eziphindaphindiwe

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;
  }
  ....
}

Isexwayiso se-PVS-Studio: V519 [CWE-563] I-'NType' eguquguqukayo inikezwa amanani kabili ngokulandelana. Mhlawumbe lokhu kuyiphutha. Hlola imigqa: 1663, 1664. MachOObjectFile.cpp 1664

Angicabangi ukuthi kunephutha langempela lapha. Isabelo esiphindaphindiwe nje esingadingekile. Kodwa namanje iphutha.

Ngokufanayo:

  • V519 [CWE-563] Okuguquguqukayo kwe-'B.NDesc' kwabelwa amanani kabili ngokulandelana. Mhlawumbe lokhu kuyiphutha. Hlola imigqa: 1488, 1489. llvm-nm.cpp 1489
  • I-V519 [CWE-563] Okuguquguqukayo kunikezwa amanani kabili ngokulandelana. Mhlawumbe lokhu kuyiphutha. Hlola imigqa: 59, 61. coff2yaml.cpp 61

I-Fragment N25-N27: Ukunikezwa kabusha okwengeziwe

Manje ake sibheke inguqulo ehluke kancane yokwabiwa kabusha.

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;
  ....
}

Isexwayiso se-PVS-Studio: V519 [CWE-563] Okuguquguqukayo 'kokuqondanisa' kwabiwa amanani kabili ngokulandelana. Mhlawumbe lokhu kuyiphutha. Hlola imigqa: 1158, 1160. LoadStoreVectorizer.cpp 1160

Lena ikhodi eyinqaba kakhulu ngokusobala equkethe iphutha elinengqondo. Ekuqaleni, ukushintshashintsha Ukubeka inani linikezwa kuye ngesimo. Bese-ke isabelo senzeka futhi, kodwa manje ngaphandle kwanoma yisiphi isheke.

Izimo ezifanayo zingabonakala lapha:

  • I-V519 [CWE-563] Okuguquguqukayo kwe-'Effects' kwabiwa amanani kabili ngokulandelana. Mhlawumbe lokhu kuyiphutha. Hlola imigqa: 152, 165. WebAssemblyRegStackify.cpp 165
  • I-V519 [CWE-563] I-'ExpectNoDerefChunk' eguquguqukayo inikezwa amanani kabili ngokulandelana. Mhlawumbe lokhu kuyiphutha. Hlola imigqa: 4970, 4973. SemaType.cpp 4973

I-Fragment N28: Isimo sangempela ngaso sonke isikhathi

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;
  }
  ....
}

Isexwayiso se-PVS-Studio: V547 [CWE-571] Inkulumo ethi 'nextByte != 0x90' ihlale iyiqiniso. X86DisassemblerDecoder.cpp 379

Ukuhlola akuwenzi umqondo. Iyaguquguquka nextByte njalo ayilingani nenani 0x90, okulandela eshekeni langaphambilini. Lolu uhlobo oluthile lwephutha elinengqondo.

Isiqephu esingu-N29 - N...: Izimo ezihlala ziyiqiniso/zingamanga

I-analyzer ikhipha izexwayiso eziningi zokuthi sonke isimo (V547) noma ingxenye yakho (V560) kuyiqiniso noma kungamanga. Ngokuvamile lawa akuwona amaphutha angempela, kodwa amakhodi alula, umphumela wokwanda okukhulu, nokunye okunjalo. Nokho, kunengqondo ukubheka zonke lezi zixwayiso, njengoba amaphutha eqiniso anengqondo eyenzeka ngezikhathi ezithile. Isibonelo, lesi sigaba sekhodi siyasolisa:

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;
  ....
}

Isexwayiso se-PVS-Studio: V560 [CWE-570] Ingxenye yenkulumo enemibandela ihlale ingamanga: RegNo == 0xe. I-ARMDisassembler.cpp 939

U-0xE ongashintshi uyinani elingu-14 ngedesimali. Ukuhlola I-RegNo == 0x akuzwakali ngoba uma I-RegNo > 13, bese umsebenzi uzoqedela ukuqaliswa kwawo.

Kube nezinye izexwayiso eziningi ezinomazisi V547 kanye no-V560, kodwa njengoba kunjalo V595, ngangingenaso isithakazelo sokutadisha lezi zixwayiso. Kwase kucacile ukuthi nginempahla eyanele yokubhala isihloko :). Ngakho-ke, akwaziwa ukuthi mangaki amaphutha alolu hlobo angabonakala ku-LLVM kusetshenziswa i-PVS-Studio.

Ngizokunikeza isibonelo sokuthi kungani ukufunda lezi zimbangela kuyisicefe. I-analyzer ilungile impela ekukhipheni isexwayiso sekhodi elandelayo. Kodwa lokhu akulona iphutha.

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

Isexwayiso se-PVS-Studio: V547 [CWE-570] Inkulumo ethi '!HasError' ingamanga njalo. I-UnwrappedLineParser.cpp 1635

I-Fragment N30: ​​Ukubuya okusolisayo

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();
  }
  ....
}

Isexwayiso se-PVS-Studio: V612 [CWE-670] 'Ukubuyisela' okungenamibandela phakathi kweluphu. R600OptimizeVectorRegisters.cpp 63

Lokhu kungenzeka iphutha noma inqubo ethile ehloselwe ukuchaza okuthile kubahleli bohlelo abafunda ikhodi. Lo mklamo awungichazi lutho futhi ubukeka usolisa kakhulu. Kungcono ukungabhali kanjalo :).

Ukhathele? Bese kuyisikhathi sokwenza itiye noma ikhofi.

Ukuthola izimbungulu ku-LLVM 8 usebenzisa i-PVS-Studio analyzer

Amaphutha akhonjwe ukuxilonga okusha

Ngicabanga ukuthi ukwenziwa kusebenze okungu-30 kokuxilongwa okudala kwanele. Manje ake sibone ukuthi yiziphi izinto ezithakazelisayo ezingatholakala ngokuxilongwa okusha okuvele ku-analyzer ngemva kwalokho okwedlule amasheke. Sekukonke, ukuxilongwa kwenhloso ejwayelekile okungu-66 kwengezwe kumhlaziyi we-C++ ngalesi sikhathi.

Isiqephu esingu-N31: Ikhodi engafinyeleleki

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();
}

Isexwayiso se-PVS-Studio: V779 [CWE-561] Ikhodi engafinyeleleki itholiwe. Kungenzeka ukuthi iphutha likhona. I-ExecutionUtils.cpp 146

Njengoba ubona, zombili amagatsha opharetha if iphetha ngocingo oluya ku-opharetha ukubuya. Ngokuvumelana nalokho, isitsha I-CtorDtorsByPriority ayisoze yasulwa.

Isiqephu esingu-N32: Ikhodi engafinyeleleki

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;
}

Isexwayiso se-PVS-Studio: V779 [CWE-561] Ikhodi engafinyeleleki itholiwe. Kungenzeka ukuthi iphutha likhona. I-LLParser.cpp 835

Isimo esithakazelisayo. Ake sibheke le ndawo kuqala:

return ParseTypeIdEntry(SummaryID);
break;

Uma uthi nhlá, kubonakala sengathi alikho iphutha lapha. Kubukeka sengathi opharetha ukuphuka kukhona esengeziwe lapha, futhi ungakwazi ukuvele ukususe. Nokho, akuwona wonke elula kangaka.

Umhlaziyi ukhipha isexwayiso emigqeni:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Futhi ngempela, le khodi ayifinyeleleki. Wonke amacala ku switch iphetha ngocingo oluvela ku-opharetha ukubuya. Futhi manje engenangqondo yedwa ukuphuka ayibukeki ingenabungozi kangako! Mhlawumbe elinye lamagatsha kufanele liphele nge ukuphukahhayi kuqhubeke ukubuya?

I-Fragment N33: Ukusetha kabusha okungahleliwe kwamabhithi aphezulu

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);
  ....
}

Isexwayiso se-PVS-Studio: V784 Usayizi we-bit mask ungaphansi kosayizi we-operand yokuqala. Lokhu kuzodala ukulahleka kwamabhithi aphezulu. I-RuntimeDyld.cpp 815

Sicela uqaphele ukuthi umsebenzi getStubAlignment ibuyisela uhlobo akusayiniwe. Ake sibale inani lenkulumo, sicabange ukuthi umsebenzi ubuyisela inani 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

Manje qaphela ukuthi okuguquguqukayo DataSize inohlobo olungasayiniwe lwe-64-bit. Kuvele ukuthi uma wenza umsebenzi we-DataSize & 0xFFFFFFF8u, zonke izingcezu eziphezulu ezingamashumi amathathu nambili zizosethwa kabusha zibe ziro. Ngokunokwenzeka, akukhona lokhu obekufunwa ngumhleli. Ngisola ukuthi ubefuna ukubala: DataSize & 0xFFFFFFFFFFFFFFF8u.

Ukuze ulungise iphutha, kufanele ubhale lokhu:

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

Noma:

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

Isiqephu esingu-N34: Ihlulekile ukulingisa uhlobo olubekela obala

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);
  ....
}

Isexwayiso se-PVS-Studio: V1028 [CWE-190] Ukuchichima okungenzeka. Cabangela ukusakaza ama-opharetha we-'NumElts * Scale' ohlotsheni oluthi 'size_t', hhayi umphumela. X86ISelLowering.h 1577

Ukusakaza kohlobo olucacile kusetshenziselwa ukugwema ukuchichima lapho kuphindaphinda uhlobo oluhlukile Int. Nokho, ukusakaza kohlobo olusobala lapha akuvikeli ekuchichimeni. Okokuqala, okuguquguqukayo kuzophindaphindwa, bese kuphela umphumela we-32-bit wokuphindaphinda uzonwetshwa ohlotsheni. usayizi_t.

I-Fragment N35: Yehlulekile Ukukopisha-Namathisela

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] Kutholwe izingcezu ezimbili zekhodi ezifanayo. Mhlawumbe, lokhu ukuthayipha futhi okuguquguqukayo kwe-'Op1' kufanele kusetshenziswe esikhundleni sika-'Op0'. I-InstCombineCompares.cpp 5507

Lokhu kuhlola okusha okuthakazelisayo kuhlonza izimo lapho ucezu lwekhodi lukopishiwe khona futhi amanye amagama akulo aseqalile ukushintshwa, kodwa endaweni eyodwa awazange alulungise.

Sicela uqaphele ukuthi endaweni yesibili bashintshile I-Op0 on I-Op1. Kodwa endaweni eyodwa abazange bakulungise. Kungenzeka ukuthi kwakufanele kubhalwe kanje:

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

I-Fragment N36: Ukudideka Okuguquguqukayo

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

Isexwayiso se-PVS-Studio: V1001 [CWE-563] Okuguquguqukayo 'kwemodi' kwabelwe kodwa akusetshenziswa ekupheleni komsebenzi. SIModeRegister.cpp 48

Kuyingozi kakhulu ukunikeza izimpikiswano zomsebenzi amagama afanayo namalungu ekilasi. Kulula kakhulu ukudideka. Sinecala elinjalo nje phambi kwethu. Le nkulumo ayiwenzi umqondo:

Mode &= Mask;

Ukuphikisana komsebenzi kuyashintsha. Yilokho kuphela. Le mpikiswano ayisasetshenziswa. Kungenzeka ukuthi ngabe ukubhale kanje:

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

I-Fragment N37: Ukudideka Okuguquguqukayo

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;
}

Isexwayiso se-PVS-Studio: V1001 [CWE-563] Okuguquguqukayo 'kosayizi' kwabelwe kodwa akusetshenziswa ekupheleni komsebenzi. Into.cpp 424

Isimo siyefana nesedlule. Kufanele kubhalwe ukuthi:

this->Size += this->EntrySize;

Isiqephu esingu-N38-N47: Bakhohlwe ukuhlola inkomba

Ngaphambilini, sibheke izibonelo zezimbangela zokuxilonga V595. Ingqikithi yayo iwukuthi i-pointer ihoxiswa ekuqaleni, bese ihlolwa kuphela. Ukuxilonga abasha V1004 iphambene ngencazelo, kodwa futhi iveza amaphutha amaningi. Ikhomba izimo lapho isikhombi sihloliwe ekuqaleni bese sikhohlwa ukwenza kanjalo. Ake sibheke amacala anjalo atholakala ngaphakathi kwe-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());  // <=
  ....
}

Isexwayiso se-PVS-Studio: V1004 [CWE-476] Isikhombi se-'Ptr' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 729, 738. TargetTransformInfoImpl.h 738

Iyaguquguquka Ptr ingase ilingane nullptr, njengoba kufakazelwa isheke:

if (Ptr != nullptr)

Kodwa-ke, ngezansi lesi sikhombi sihoxiswa ngaphandle kokuhlolwa kokuqala:

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

Ake sicabangele elinye icala elifanayo.

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(); // <=
  ....
}

Isexwayiso se-PVS-Studio: V1004 [CWE-476] Isikhombi se-'FD' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 3228, 3231. CGDebugInfo.cpp 3231

Naka uphawu FD. Ngiqinisekile ukuthi inkinga ibonakala ngokucacile futhi akukho ncazelo ekhethekile edingekayo.

Futhi okunye:

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());     // <=
  ....
}

Isexwayiso se-PVS-Studio: V1004 [CWE-476] Isikhombi se-'PtrTy' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 960, 965. InterleavedLoadCombinePass.cpp 965

Ungazivikela kanjani emaphutheni anjalo? Qaphela kakhulu Ukubuyekeza Ikhodi futhi usebenzise i-PVS-Studio analyzer ukuze uhlole njalo ikhodi yakho.

Asikho isidingo sokucaphuna ezinye izingcezu zekhodi ezinamaphutha alolu hlobo. Ngizoshiya kuphela uhlu lwezexwayiso esihlokweni:

  • V1004 [CWE-476] Isikhombi se-'Expr' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] Isikhombi se-'PI' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Isikhombi se-'StatepointCall' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 4371, 4379. Verifier.cpp 4379
  • I-V1004 [CWE-476] Isikhombi se-'RV' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Isikhombi se-'CalleeFn' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Isikhombi se-'TC' sisetshenziswe ngokungaphephile ngemva kokuqinisekiswa ngokumelene ne-nullptr. Hlola imigqa: 1819, 1824. Driver.cpp 1824

I-Fragment N48-N60: Ayibalulekile, kodwa kunesici (ukuvuza kwenkumbulo okungenzeka)

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

Isexwayiso se-PVS-Studio: V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi 'Amasu' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-isel-fuzzer.cpp 58

Ukwengeza i-elementi ekugcineni kwesiqukathi njenge std::vector > awukwazi ukubhala nje xxx.push_back(i-X entsha), njengoba kungekho ukuguqulwa okungacacile kusuka X* в std::okuhlukile_ptr.

Isixazululo esivamile ukubhala xxx.emplace_back(i-X entsha)njengoba ihlanganisa: indlela emplace_back wakha i-elementi ngokuqondile ngezimpikiswano zayo ngakho-ke angasebenzisa abakhi abacacile.

Akuphephile. Uma i-vector igcwele, inkumbulo inikezwa kabusha. Umsebenzi wokubuyisela kabusha inkumbulo ungase ungaphumeleli, okuholela ekuphonseni okuhlukile std::bad_alloc. Kulesi simo, i-pointer izolahleka futhi into edaliwe ayisoze yasuswa.

Isixazululo esiphephile ukudala unique_ptrokuzoba ngumnikazi wesikhombi ngaphambi kokuthi i-vector izame ukwaba kabusha inkumbulo:

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

Kusukela ku-C++14, ungasebenzisa okuthi 'std::make_unique':

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

Lolu hlobo lwesici alubalulekile ku-LLVM. Uma inkumbulo ingakwazi ukunikezwa, umhlanganisi uzomane ame. Nokho, izicelo nge eside isikhathi sokuphumula, engakwazi ukuvele inqamule uma ukwabiwa kwememori kwehluleka, lokhu kungaba iphutha elibi langempela.

Ngakho-ke, nakuba le khodi ingeyona ingozi engokoqobo ku-LLVM, ngithole kuwusizo ukukhuluma ngale iphethini yephutha nokuthi umhlaziyi we-PVS-Studio ufunde ukulikhomba.

Ezinye izexwayiso zalolu hlobo:

  • V1023 [CWE-460] Isikhombi esingenamnikazi singezwa esitsheni esithi 'Amaphasi' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-PassManager.h 546
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi sengezwa kusiqukathi se-'AAs' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-AliasAnalysis.h 324
  • V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi 'Okufakiwe' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] Isikhombi esingenamnikazi singezwa esitsheni se-'AllEdges' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. CFGMST.h 268
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi singezwa esitsheni se-'VMaps' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-SimpleLoopUnswitch.cpp 2012
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi 'Amarekhodi' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. FDRLogBuilder.h 30
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi sengezwa kusiqukathi se-'PendingSubmodules' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-ModuleMap.cpp 810
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi sengezwa kusiqukathi 'Izinto' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-DebugMap.cpp 88
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi singezwa esitsheni 'Amaqhinga' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-isel-fuzzer.cpp 60
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 685
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 686
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 688
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 689
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 690
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 691
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 692
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 693
  • I-V1023 [CWE-460] Isikhombi esingenaye umnikazi sengezwa kusiqukathi se-'Modifiers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. llvm-stress.cpp 694
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi sengezwa kusiqukathi se-'Operands' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-GlobalISElEmitter.cpp 1911
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi sengezwa esiqukathini esithi 'Stash' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-GlobalISElEmitter.cpp 2100
  • I-V1023 [CWE-460] Isikhombi esingenamnikazi sengezwa esitsheni 'Ama-Matchers' ngendlela ye-'emplace_back'. Ukuvuza kwenkumbulo kuzokwenzeka uma kwenzeka okuhlukile. I-GlobalISElEmitter.cpp 2702

isiphetho

Ngakhipha izexwayiso ezingu-60 sezizonke ngase ngiyeka. Ingabe akhona amanye amaphutha atholwa umhlaziyi we-PVS-Studio ku-LLVM? Yebo, nginayo. Nokho, lapho ngibhala izingcezu zekhodi zalesi sihloko, kwase kuhlwile, noma kunalokho kwakusihlwa, futhi nganquma ukuthi kwase kuyisikhathi sokuyibiza ngokuthi usuku.

Ngithemba ukuthi ukuthole kuthakazelisa futhi uzofuna ukuzama i-PVS-Studio analyzer.

Ungalanda i-analyzer futhi uthole ukhiye we-minesweeper ku leli khasi.

Okubaluleke kakhulu, sebenzisa ukuhlaziywa okumile njalo. Amasheke esikhathi esisodwa, okwenziwa yithi ukuze kwandiswe indlela yokuhlaziya okumile futhi i-PVS-Studio akusona isimo esijwayelekile.

Inhlanhla ekuthuthukiseni ikhwalithi nokuthembeka kwekhodi yakho!

Ukuthola izimbungulu ku-LLVM 8 usebenzisa i-PVS-Studio analyzer

Uma ufuna ukwabelana ngalesi sihloko nezithameli ezikhuluma isiNgisi, sicela usebenzise isixhumanisi sokuhumusha: Andrey Karpov. Ukuthola Iziphazamisi ku-LLVM 8 nge-PVS-Studio.

Source: www.habr.com

Engeza amazwana