Ukufumana iimpazamo kwi-LLVM 8 usebenzisa i-PVS-Studio analyzer

Ukufumana iimpazamo kwi-LLVM 8 usebenzisa i-PVS-Studio analyzer
Ngaphezu kweminyaka emibini sele idlulile oko kujongwe ikhowudi yokugqibela yeprojekthi yeLLVM kusetyenziswa umhlalutyi wethu wePVS-Studio. Masiqinisekise ukuba umhlalutyi we-PVS-Studio usesisixhobo esikhokelayo sokuchonga iimpazamo kunye nobuthathaka obunokubakho. Ukwenza oku, siya kujonga kwaye sifumane iimpazamo ezintsha kwi-LLVM 8.0.0 yokukhululwa.

Inqaku eliza kubhalwa

Xa ndithetha inyani, ndandingafuni ukubhala eli nqaku. Ayinamdla ukubhala malunga neprojekthi esele siyijongile amaxesha amaninzi (1, 2, 3). Kungcono ukubhala malunga nento entsha, kodwa andinakukhetha.

Ngalo lonke ixesha inguqulelo entsha ye-LLVM ikhutshwa okanye ihlaziywa Clang Static Analyzer, sifumana imibuzo yolu hlobo lulandelayo kwimeyile yethu:

Jonga, inguqulelo entsha yeClang Static Analyzer ifunde ukufumana iimpazamo ezintsha! Kum kubonakala ngathi ukufaneleka kokusebenzisa i-PVS-Studio kuyehla. UClang ufumana iimpazamo ezininzi kunangaphambili kwaye ubambe amandla ePVS-Studio. Ucinga ntoni ngale nto?

Kule nto ndihlala ndifuna ukuphendula into efana nale:

Nathi asihlali singenzi nto! Siphucule kakhulu amandla e-PVS-Studio analyzer. Sukuba nexhala, siyaqhubeka ukukhokela njengangaphambili.

Ngelishwa, le yimpendulo embi. Akukho bungqina kuyo. Yiyo loo nto ndibhala eli nqaku ngoku. Ke, iprojekthi ye-LLVM iphinde yajongwa kwaye iintlobo ezahlukeneyo zeempazamo zifunyenwe kuyo. Ngoku ndiza kubonisa ezo zibonakala zinomdla kum. Umhlalutyi weClang Static akakwazi kufumana ezi mpazamo (okanye akulula kakhulu ukwenza oko ngoncedo lwayo). Kodwa sinako. Ngaphezu koko, ndizifumene ndaza ndazibhala phantsi zonke ezi mpazamo ngengokuhlwa nje enye.

Kodwa ukubhala eli nqaku kwathabatha iiveki eziliqela. Andikwazanga ukuzisa konke oku kwisicatshulwa :).

Ngendlela, ukuba unomdla kobuphi ubuchwephesha obusetyenziswa kwi-PVS-Studio analyzer ukuchonga iimpazamo kunye nobuthathaka obunokwenzeka, ke ndicebisa ukuba uqhelane nale nto. Phawula.

Uxilongo olutsha kunye noludala

Njengoko sele kuphawuliwe, malunga neminyaka emibini edlulileyo iprojekthi ye-LLVM yaphinda yahlolwa, kwaye iimpazamo ezifunyenweyo zalungiswa. Ngoku eli nqaku liza kubonisa ibhetshi entsha yeempazamo. Kwakutheni ukuze kufunyanwe iziphene ezintsha? Kukho izizathu ezi-3 zoku:

  1. Iprojekthi ye-LLVM iyavela, itshintsha ikhowudi endala kwaye yongeza ikhowudi entsha. Ngokwemvelo, kukho iimpazamo ezintsha kwikhowudi elungisiweyo nebhaliweyo. Oku kubonisa ngokucacileyo ukuba uhlalutyo lwe-static kufuneka lusetyenziswe rhoqo, kwaye kungekhona ngamaxesha athile. Amanqaku ethu abonisa kakuhle amandla e-PVS-Studio analyzer, kodwa oku akunanto yakwenza nokuphucula umgangatho wekhowudi kunye nokunciphisa iindleko zokulungisa iimpazamo. Sebenzisa i-static code analyzer rhoqo!
  2. Siyagqibezela kwaye siphucula iindlela zokuxilonga ezikhoyo. Ke ngoko, umhlalutyi unokuchonga iimpazamo engakhange azibone ngexesha lokuskena kwangaphambili.
  3. Ukuxilongwa okutsha kuye kwavela kwi-PVS-Studio eyayingekho kwiminyaka eyi-2 eyadlulayo. Ndigqibe kwelokuba ndibaqaqambise kwicandelo elahlukileyo ukuze ndibonise ngokucacileyo uphuhliso lwePVS-Studio.

Iziphene ezichongiweyo ngoxilongo olwalukho kwiminyaka emi-2 eyadlulayo

Iqhekeza N1: Copy-Cola

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 isilumkiso: V501 [CWE-570] Kukho amagama asezantsi afanayo 'Name.startswith("avx512.mask.permvar.")' ukuya ekhohlo nasekunene kwe '||' umsebenzisi. Uphuculo oluzenzekelayo.cpp 73

Kukhangelwe kabini ukuba igama liqala ngomtya ongezantsi "avx512.mask.permvar.". Kwitshekhi yesibini, ngokucacileyo bafuna ukubhala enye into, kodwa balibale ukulungisa umbhalo okhutshelweyo.

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

Isilumkiso PVS-Studio: V501 Kukho amabinzana afanayo afanayo 'CXNameRange_WantQualifier' ukuya ekhohlo nasekunene kwe '|' umsebenzisi. CIndex.cpp 7245

Ngenxa yokuchwetheza, igama elifanayo lisetyenziswa kabini CXNameRange_WantQualifier.

I-fragment N3: Ukubhideka 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;
  ....
}

PVS-Studio isilumkiso: V502 [CWE-783] Mhlawumbi umsebenzisi '?:' usebenza ngendlela eyahlukileyo kunokuba ibilindelwe. Umsebenzisi '?:' unokubaluleka okuphantsi kunomsebenzisi '=='. PCTTargetTransformInfo.cpp 404

Ngokombono wam, le mpazamo enhle kakhulu. Ewe, ndiyazi ukuba ndinemibono engaqhelekanga malunga nobuhle :).

Ngoku, ngokutsho izinto eziphambili ngokubaluleka, intetho ivavanywa ngolu hlobo lulandelayo:

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

Ukusuka kwimbono ebonakalayo, imeko enjalo ayinangqondo, kuba inokuncitshiswa ibe:

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

Le yimpazamo ecacileyo. Ngokunokwenzeka, bebefuna ukuthelekisa u-0/1 noguquko isalathisi. Ukulungisa ikhowudi kufuneka udibanise ama-parentheses ajikeleze umsebenzisi we-ternary:

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

Ngendlela, umqhubi we-ternary uyingozi kakhulu kwaye uxhokonxa iimpazamo ezinengqiqo. Yilumkele kakhulu kwaye unganyolukeli izibiyeli. Ndijonge esi sihloko ngokubanzi apha, kwisahluko esithi β€œLumkela Isixhobo?

Iqhekeza le-N4, i-N5: Isalathi esingenanto

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 isilumkiso: V522 [CWE-476] Ukurhoxiswa kwesalathisi esingeyonyani 'LHS' kungenzeka. TGParser.cpp 2152

Ukuba isalathisi I-LHS akukho nto, kufuneka kukhutshwe isilumkiso. Nangona kunjalo, endaweni yoko, kwaesi salathisi singento yanto siya kususwa: LHS->getAsString().

Le yimeko eqhelekileyo xa impazamo ifihliwe kwisiphathi sempazamo, kuba akukho mntu ubavavanyayo. Abahlalutyi be-Static bajonga yonke ikhowudi efikelelekayo, kungakhathaliseki ukuba isetyenziswa rhoqo kangakanani. Lo ngumzekelo omhle kakhulu wendlela uhlalutyo lwe-static luhambelana nolunye uvavanyo kunye neendlela zokukhusela iimpazamo.

Imposiso yokuphatha isalathisi esifanayo HRH kuvunyelwe kwikhowudi engezantsi nje: V522 [CWE-476] Ukurhoxiswa kwesalathisi esingeyonyani 'RHS' kungenzeka. TGParser.cpp 2186

Iqhekeza N6: Ukusebenzisa isalathisi emva kokuhamba

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

Isilumkiso se-PVS-Studio: I-V522 [CWE-476] Ukurhoxiswa kwesalathisi esingenanto 'ProgClone' inokuthi yenzeke. Miscompilation.cpp 601

Ekuqaleni isalathisi esihlakaniphile ProgClone iyayeka ukuba ngumnini wento:

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

Enyanisweni, ngoku ProgClone sisalathi esingenanto. Ke ngoko, isalathisi esingeyiyo kufuneka senzeke apha ngezantsi:

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

Kodwa, enyanisweni, oku akuyi kwenzeka! Qaphela ukuba i-loop ayiqhutywanga.

Ekuqaleni kwesitya MiscompiledFunctions Icociwe:

MiscompiledFunctions.clear();

Okulandelayo, ubungakanani besi sikhongozeli busetyenziswa kwimeko yelophu:

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

Kulula ukubona ukuba i-loop ayiqalisi. Ndicinga ukuba oku kwakhona bug kwaye ikhowudi kufuneka ibhalwe ngokwahlukileyo.

Kubonakala ngathi siye sadibana naloo mpazamo idumileyo! Impazamo enye ifihla enye :).

Iqhekeza N7: Ukusebenzisa isalathisi emva kokuhamba

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

Isilumkiso se-PVS-Studio: I-V522 [CWE-476] Ukurhoxiswa kwesalathisi esingeyonyani 'Uvavanyo' lunokwenzeka. Miscompilation.cpp 709

Imeko efanayo kwakhona. Ekuqaleni, imixholo yento iyashukunyiswa, ize ke isetyenziswe ngokungathi akwenzekanga nto. Ndiyibona le meko ngakumbi nangakumbi kwikhowudi yenkqubo emva kokuba intshukumo yentshukumo ibonakala kwi-C ++. Kungenxa yoko le nto ndithanda ulwimi lwe-C++! Zininzi kwaye zininzi iindlela ezintsha zokudubula owakho umlenze. I-PVS-Studio analyzer iya kuhlala inomsebenzi :).

Iqhekeza le-N8: Isalathisi esingenanto

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

Isilumkiso se-PVS-Studio: V522 [CWE-476] Ukurhoxiswa kwesalathiso esingeyonyani 'Uhlobo' lunokwenzeka. PrettyFunctionDumper.cpp 233

Ukongeza kubaphathi beemposiso, ukulungisa iimpazamo kushicilelo imisebenzi ayisoloko ivavanywa. Sinemeko enjalo phambi kwethu. Umsebenzi ulindele umsebenzisi, owathi, endaweni yokusombulula iingxaki zakhe, uya kunyanzeliswa ukuba alungise.

Ngokuchanekileyo:

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

Iqhekeza le-N9: Isalathisi esingenanto

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

Isilumkiso se-PVS-Studio: V522 [CWE-476] Ukurhoxiswa kwesalathiso esingeyonyani 'Ty' kungenzeka. Itheyibhile eSekayoEmitter.cpp 614

Ndicinga ukuba yonke into icacile kwaye ayifuni ngcaciso.

Iqhekeza 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 isilumkiso: V570 'Isichongi->Uhlobo' oluguquguqukayo lwabelwe lona ngokwalo. FormatTokenLexer.cpp 249

Akukho sizathu sokwabela i-variable ngokwayo. Kunokwenzeka ukuba babefuna ukubhala:

Identifier->Type = Question->Type;

Iqhekeza N11: Ikhefu elikrokrisayo

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 isilumkiso: V622 [CWE-478] Cinga ngokuhlola ingxelo 'yokutshintsha'. Kungenzeka ukuba umqhubi 'wetyala' wokuqala ulahlekile. SystemZAsmParser.cpp 652

Kukho umntu osebenza ngokukrokra kakhulu ekuqaleni aphule. Ulibele ukubhala enye into apha?

Iqhekeza le-N12: Ukujonga isalathisi emva kokushenxiswa kwereferensi

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 isilumkiso: V595 [CWE-476] Isalathisi 'Callee' sasetyenziswa phambi kokuba singqinwe ngokuchasene ne-nullptr. Jonga imigca: 172, 174. AMDGPUInline.cpp 172

Isikhombisi Calee ekuqaleni ayijongwanga ngexesha ubizwa ngalo umsebenzi fumanaTTI.

Kwaye emva koko kuvela ukuba esi salathisi kufuneka sihlolwe ukulingana nullptr:

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

Kodwa seku late...

Iqhekeza N13 - N...: Ukujonga isalathisi emva kokurhoxiswa

Imeko exoxwe ngayo kwiqhekeza lekhowudi yangaphambili ayiyodwa. Ivela apha:

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

Isilumkiso se-PVS-Studio: V595 [CWE-476] Isalathisi se-'CalleeFn' sisetyenziswe ngaphambi kokuba singqinwe ngokuchasene ne-nullptr. Jonga imigca: 1079, 1081. SimplifyLibCalls.cpp 1079

Kwaye apha:

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

Isilumkiso se-PVS-Studio: V595 [CWE-476] Isalathisi 'ND' sisetyenzisiwe ngaphambi kokuba siqinisekiswe ngokuchasene ne-nullptr. Jonga imigca: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Kwaye apha:

  • V595 [CWE-476] Isalathisi 'U' sasetyenziswa phambi kokuba singqinwe ngokuchasene ne-nullptr. Jonga imigca: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Isalathisi 'ND' sisetyenziswe phambi kokuba singqinwe ngokuchasene ne-nullptr. Jonga imigca: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Kwaye ke ndiye ndangenamdla wokufunda izilumkiso ezinenombolo V595. Ke andazi ukuba kukho iimpazamo ezifanayo ngaphandle kwezi zidweliswe apha. Ngokunokwenzeka kukho.

Iqhekeza le-N17, i-N18: Ukutshintsha okukrokrisayo

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

PVS-Studio isilumkiso: V629 [CWE-190] Cinga ngokuhlola ibinzana elithi '~(Ubukhulu - 1) << 1'. Ukutshintsha kancinci kwexabiso le-32-bit kunye nokwandiswa okulandelayo kuhlobo lwe-64-bit. AArch64AddressingModes.h 260

Isenokungabi yimpazamo kwaye ikhowudi isebenza kanye njengoko bekucetyiwe. Kodwa ngokuqinisekileyo le yindawo ekrokrisa kakhulu kwaye kufuneka ijongwe.

Masithi ukuguquguquka ubungakanani ilingana no-16, kwaye ke umbhali wekhowudi ecetywayo ukuyifumana kwi-variable Nimms intsingiselo:

1111111111111111111111111111111111111111111111111111111111100000

Nangona kunjalo, enyanisweni umphumo uya kuba:

0000000000000000000000000000000011111111111111111111111111100000

Inyani yeyokuba zonke izibalo zenzeka kusetyenziswa uhlobo lwe-32-bit olungatyikitywanga. Kwaye kungoko kuphela, olu hlobo lwe-32-bit olungasayinwanga luyakwandiswa ngokuthe ngqo Uint64_t. Kule meko, amasuntswana abaluleke kakhulu aya kuba ngu-zero.

Ungayilungisa imeko ngolu hlobo:

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

Imeko efanayo: V629 [CWE-190] Cinga ngokuhlola ibinzana elithi 'Immr << 6'. Ukutshintsha kancinci kwexabiso le-32-bit kunye nokwandiswa okulandelayo kuhlobo lwe-64-bit. AArch64AddressingModes.h 269

Iqhekeza N19: Igama elingundoqo elilahlekileyo enye?

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 isilumkiso: V646 [CWE-670] Cinga ngokuhlola ingqiqo yesicelo. Kuyenzeka ukuba igama elithi 'enye' alikho. AMDGPUAsmParser.cpp 5655

Akukho mpazamo apha. Ukususela ngoko-block yokuqala if iphela nge uyaqhubeka, ke akunamsebenzi, kukho igama elingundoqo enye okanye hayi. Nokuba yeyiphi na indlela ikhowudi iya kusebenza ngokufanayo. Usakhumbula enye yenza ikhowudi icace ngakumbi kwaye ibe yingozi. Ukuba kwixesha elizayo uyaqhubeka iyanyamalala, ikhowudi iyakuqala ukusebenza ngokwahlukileyo ngokupheleleyo. Ngokombono wam kungcono ukongeza enye.

Iqhekeza N20: Iintlobo ezine zohlobo 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;
}

PVS-Studio izilumkiso:

  • V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola i 'Isiphumo + Igama.str()' intetho. Uphawu.cpp 32
  • V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola 'Isiphumo + "(Udidi lwe-ObjC)" + Igama.str()' intetho. Uphawu.cpp 35
  • V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola inkcazo ethi 'Isiphumo + "(ObjC Class EH) " + Name.str()'. Uphawu.cpp 38
  • V655 [CWE-480] Imitya yayidityanisiwe kodwa ayisetyenziswa. Cinga ngokuhlola 'Isiphumo + "(ObjC IVar)" + Igama.str()' intetho. Uphawu.cpp 41

Ngengozi, kusetyenziswe umsebenzisi + endaweni yomsebenzisi +=. Isiphumo soyilo luyilo olungenantsingiselo.

Iqhekeza N21: Indlela yokuziphatha engachazwanga

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 ukufumana ikhowudi eyingozi ngokwakho. Kwaye lo ngumfanekiso wokuphazamisa ingqalelo ukuze ungajongi ngokukhawuleza impendulo:

Ukufumana iimpazamo kwi-LLVM 8 usebenzisa i-PVS-Studio analyzer

PVS-Studio isilumkiso: V708 [CWE-758] Kusetyenziswa ulwakhiwo oluyingozi: 'FeaturesMap[Op] = FeaturesMap.size()', apho i'FeaturesMap' iyeyeklasi 'yemaphu'. Oku kunokukhokelela kwindlela yokuziphatha engachazwanga. RISCVCompressInstEmitter.cpp 490

Umgca wengxaki:

FeaturesMap[Op] = FeaturesMap.size();

Ukuba element Op ayifumanekanga, ngoko into entsha yenziwe kwimephu kwaye inani lezinto kule mephu libhalwe apho. Ayaziwa nje ukuba umsebenzi uya kubizwa ubungakanani phambi okanye emva kokongeza into entsha.

Iqhekeza N22-N24: Izabelo eziphindaphindiweyo

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 isilumkiso: V519 [CWE-563] Ukuguquguquka kwe-'NType' kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Khangela imigca: 1663, 1664. MachOObjectFile.cpp 1664

Andiqondi ukuba kukho impazamo yokwenyani apha. Isabelo nje esiphindaphindiweyo esingeyomfuneko. Kodwa kusekho impazamo.

Ngokunjalo:

  • V519 [CWE-563] Ukuguquguquka kwe-'B.NDesc' kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Ukuguquguquka kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Khangela imigca: 59, 61. coff2yaml.cpp 61

Iqhekeza N25-N27: Izabelo ezingakumbi

Ngoku makhe sijonge kuguqulelo olwahluke kancinane lokwabelwa ngokutsha.

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

Isilumkiso se-PVS-Studio: V519 [CWE-563] Ukuguquguquka 'koLungelelaniso' kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 1158, 1160. LoadStoreVectorizer.cpp 1160

Le yikhowudi engaqhelekanga kakhulu ebonisa ukuba iqulethe impazamo esengqiqweni. Ekuqaleni, iyatshintsha ulungelelwaniso ixabiso labelwe ngokuxhomekeke kwimeko. Kwaye ke isabelo senzeka kwakhona, kodwa ngoku ngaphandle kwetshekhi.

Iimeko ezifanayo zinokubonwa apha:

  • V519 [CWE-563] I-'Effects' variables yabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Ukuguquguquka kwe-'ExpectNoDerefChunk' kwabelwa amaxabiso kabini ngokulandelelanayo. Mhlawumbi le yimpazamo. Jonga imigca: 4970, 4973. SemaType.cpp 4973

Iqhekeza N28: Ihlala ikwimeko eyinyani

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 isilumkiso: V547 [CWE-571] Inkcazo ethi 'nextByte != 0x90' isoloko iyinyani. X86DisassemblerDecoder.cpp 379

Ukujonga akukho ngqiqweni. Iyaguquguquka ngokulandelayoByte ayisoloko ilingana nexabiso 0x90, elandela kwitshekhi yangaphambili. Olu luhlobo oluthile lwempazamo esengqiqweni.

Iqhekeza N29 - N...: Iimeko ezihlala ziyinyani / zibubuxoki

Umhlalutyi ukhupha izilumkiso ezininzi zokuba yonke imeko (V547) okanye inxalenye yayo (V560) isoloko iyinyani okanye bubuxoki. Rhoqo ezi ayizizo iimpazamo zokwenyani, kodwa ikhowudi nje engenamsebenzi, isiphumo sokwandiswa okukhulu, nokunye okunjalo. Noko ke, kusengqiqweni ukujonga zonke ezi zilumkiso, ekubeni iimpazamo zokwenene ezisengqiqweni zisenzeka ngamaxesha athile. Umzekelo, eli candelo lekhowudi liyakrokra:

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 isilumkiso: V560 [CWE-570] Inxalenye yovakaliso olunemiqathango luhlala lububuxoki: RegNo == 0xe. ARMDisassembler.cpp 939

U-0xE ongatshintshiyo lixabiso 14 kwidesimali. Uviwo RegNo == 0xe ayinangqondo kuba ukuba RegNo > 13, ngoko umsebenzi uzakugqibezela ukuphunyezwa kwawo.

Kwakukho ezinye izilumkiso ezininzi nge-ID V547 kunye ne-V560, kodwa njengaku V595, ndandingenamdla wokufunda ezi zilumkiso. Kwasele kucacile ukuba ndinezinto ezaneleyo zokubhala inqaku :). Ke ngoko, akwaziwa ukuba zingaphi iimpazamo zolu hlobo ezinokuchongwa kwi-LLVM usebenzisa i-PVS-Studio.

Ndiza kukunika umzekelo wokuba kutheni ukufunda ezi zinto zibangelayo kukruqulayo. I-analyzer ichanekile ngokupheleleyo ekukhupheni isilumkiso sekhowudi elandelayo. Kodwa oku akuyompazamo.

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

PVS-Studio Isilumkiso: V547 [CWE-570] Inkcazo ethi '!HasError' isoloko ibubuxoki. UnwrappedLineParser.cpp 1635

Iqhekeza N30: ​​Ukubuya okukrokrisayo

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 isilumkiso: V612 [CWE-670] 'Imbuyekezo' engenamiqathango ngaphakathi kwiluphu. R600OptimizeVectorRegisters.cpp 63

Oku mhlawumbi yimpazamo okanye ubuchule obuthile obunenjongo yokucacisa into kubadwelisi benkqubo abafunda ikhowudi. Olu yilo aluchazi nto kum kwaye lukhangeleka lukrokra kakhulu. Kungcono ukuba ungabhali ngolo hlobo :).

Ndidiniwe? Emva koko lixesha lokwenza iti okanye ikofu.

Ukufumana iimpazamo kwi-LLVM 8 usebenzisa i-PVS-Studio analyzer

Iziphene ezichongwe ngoxilongo olutsha

Ndicinga ukuba ukusebenza kwe-30 yokuxilongwa kwakudala kwanele. Ngoku makhe sibone ukuba zeziphi izinto ezinomdla ezinokufunyanwa ngoxilongo olutsha oluvele kuhlalutyi emva koko ngaphambili iitshekhi. Ngeli xesha, i-66 iyonke yokuxilongwa kwenjongo jikelele yongezwa kwi-C ++ analyzer.

Iqhekeza N31: Ikhowudi engafikelelekiyo

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 isilumkiso: V779 [CWE-561] Ikhowudi engafikelelekiyo ichongiwe. Kungenzeka ukuba kukho impazamo. ExecutionUtils.cpp 146

Njengoko ubona, omabini amasebe omsebenzisi if iphela ngomnxeba oya kumsebenzisi buya. Ngokufanelekileyo, isitya CtorDtorsByPriority soze icocwe.

Iqhekeza N32: Ikhowudi engafikelelekiyo

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

Isilumkiso se-PVS-Studio: V779 [CWE-561] Ikhowudi engafumanekiyo ifunyenwe. Kungenzeka ukuba kukho impazamo. LLParser.cpp 835

Imeko enomdla. Makhe sijonge le ndawo kuqala:

return ParseTypeIdEntry(SummaryID);
break;

Ekuqaleni, kubonakala ngathi akukho mpazamo apha. Kubonakala ngathi umqhubi aphule kukho enye eyongezelelweyo apha, kwaye ungayicima ngokulula. Nangona kunjalo, ayizizo zonke ezilula.

Umhlalutyi ukhupha isilumkiso kwimigca:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Kwaye ngokwenene, le khowudi ayifikeleleki. Zonke iimeko kwi guqula iphela ngomnxeba osuka kumsebenzisi buya. Kwaye ngoku isidenge yedwa aphule ayibonakali ingenabungozi kangako! Mhlawumbi elinye lamasebe kufuneka liphele nge aphule, hayi kwi buya?

Iqhekeza N33: Ukusetwa kwakhona ngokungacwangciswanga kwamasuntswana 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);
  ....
}

PVS-Studio isilumkiso: V784 Ubungakanani be-bit mask bungaphantsi kobukhulu be-operand yokuqala. Oku kuya kubangela ilahleko yamasuntswana aphezulu. RuntimeDyld.cpp 815

Nceda uqaphele ukuba umsebenzi getStubAlignment ibuyisela uhlobo engatyikitywanga. Masibale ixabiso lentetho, sicingela ukuba umsebenzi ubuyisela ixabiso lesi-8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

Ngoku qaphela ukuba ukuguquguquka Ubungakanani beDatha inohlobo lwe-64-bit olungatyikitywanga. Kuyavela ukuba xa usenza i-DataSize & 0xFFFFFFF8u ukusebenza, zonke iibhithi ezingamashumi amathathu anesibini eziphezulu ziya kuphinda zibekwe kwi-zero. Okunokwenzeka, ayisiyiyo le nto ibifunwa ngumdwelisi. Ndiyakrokra ukuba ebefuna ukubala: DataSize & 0xFFFFFFFFFFFFFFFFF8u.

Ukulungisa impazamo, kufuneka ubhale oku:

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

Okanye kunjalo:

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

Iqhekeza N34: Aluphumelelanga ukuphoswa kohlobo olucacileyo

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 isilumkiso: V1028 [CWE-190] Ukuphuphuma okunokwenzeka. Cinga ngokuphosa ii-operands zomsebenzisi we-'NumElts * Scale' kudidi lwe-'size_t', hayi isiphumo. X86ISelLowering.h 1577

Ukuphosa kodidi olucacileyo kusetyenziswa ukunqanda ukuphuphuma xa uphinda-phinda uhlobo oluguquguqukayo int. Nangona kunjalo, uhlobo olucacileyo lokuphosa apha alukhuseli ngokuchasene nokuphuphuma. Okokuqala, izinto eziguquguqukayo ziya kwandiswa, kwaye kuphela emva koko isiphumo se-32-bit sophindaphindo siyakwandiswa kuhlobo. ubungakanani_t.

Iqhekeza N35: Ayiphumelelanga iKopi-Cola

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] Iziqwenga ezimbini ezifanayo zekhowudi zafunyanwa. Mhlawumbi, oku kuchwetheza kwaye uguqulo lwe-'Op1' kufuneka lusetyenziswe endaweni ye-'Op0'. I-InstCombineCompares.cpp 5507

Olu vavanyo olutsha olunomdla luchonga iimeko apho isiqwenga sekhowudi siye sakhutshelwa kwaye amanye amagama kuyo aqalisile ukutshintshwa, kodwa kwindawo enye awayilungisanga.

Nceda uqaphele ukuba kwibhloko yesibini batshintshile Op0 phezu Op1. Kodwa kwenye indawo abazange bayilungise. Kunokwenzeka ukuba ibibhalwe ngolu hlobo:

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

Iqhekeza N36: Ukubhideka okuguquguqukayo

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

PVS-Studio isilumkiso: V1001 [CWE-563] Uguqulo 'lweNdlela' lwabelwe kodwa alusetyenziswa ekupheleni komsebenzi. SIModeRegister.cpp 48

Kuyingozi kakhulu ukunika iingxoxo zemisebenzi amagama afanayo namalungu eklasi. Kulula kakhulu ukubhideka. Sinemeko enjalo phambi kwethu. Le ntetho ayinangqiqo:

Mode &= Mask;

Ingxoxo yomsebenzi iyatshintsha. Kuko konke. Le ngxoxo ayisasetyenziswa. Okunokwenzeka ukuba ubuyibhale ngolu hlobo:

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

Iqhekeza N37: Ukubhideka 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;
}

Isilumkiso PVS-Studio: V1001 [CWE-563] Uguqulo 'Ubungakanani' lwabelwe kodwa alusetyenziswa ekupheleni komsebenzi. Into.cpp 424

Imeko iyafana naleyo yangaphambili. Kufuneka kubhalwe:

this->Size += this->EntrySize;

Iqhekeza N38-N47: Balibele ukujonga isalathiso

Ngaphambili, sijonge imizekelo ye-diagnostic triggering V595. Undoqo wayo kukuba isalathisi asijongwanga ekuqaleni, kwaye emva koko sijongiwe. Uxilongo oluncinci V1004 sisichasi kwintsingiselo, kodwa sikwaveza iimpazamo ezininzi. Ichonga iimeko apho isalathisi siye satshekishwa ekuqaleni saza salibaleka ukwenza njalo. Makhe sijonge iimeko ezinjalo ezifumaneka 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());  // <=
  ....
}

Isilumkiso se-PVS-Studio: V1004 [CWE-476] Isalathisi se-'Ptr' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Khangela imigca: 729, 738. TargetTransformInfoImpl.h 738

Eyahlukileyo Ptr inokulingana nullptr, njengoko kungqinwa yitshekhi:

if (Ptr != nullptr)

Nangona kunjalo, ngezantsi kwesi sikhombiso sirhoxiswa ngaphandle kokujonga kwangaphambili:

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

Makhe siqwalasele omnye umzekelo ofanayo.

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

Isilumkiso se-PVS-Studio: V1004 [CWE-476] Isalathisi 'FD' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 3228, 3231. CGDebugInfo.cpp 3231

Nikela ingqalelo kumqondiso FD. Ndiqinisekile ukuba ingxaki ibonakala ngokucacileyo kwaye akukho ngcaciso ikhethekileyo efunekayo.

Kwaye ngakumbi:

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

Isilumkiso se-PVS-Studio: V1004 [CWE-476] Isalathisi se-'PtrTy' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 960, 965. InterleavedLoadCombinePass.cpp 965

Indlela yokuzikhusela kwiimpazamo ezinjalo? Qaphela ngakumbi kwiKhowudi-Uphononongo kwaye usebenzise i-PVS-Studio uhlalutyo lwe-static ukujonga rhoqo ikhowudi yakho.

Akukho sizathu sokukhankanya amanye amaqhekeza ekhowudi aneempazamo zolu hlobo. Ndiza kushiya kuphela uluhlu lwezilumkiso kwinqaku:

  • V1004 [CWE-476] Isalathisi 'Expr' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] Isalathisi 'PI' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Isalathisi se-'StatepointCall' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] Isalathisi se-'RV' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Isalathisi se-'CalleeFn' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Jonga imigca: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Isalathisi 'TC' sisetyenziswe ngokungakhuselekanga emva kokuba siqinisekisiwe ngokuchasene ne-nullptr. Khangela imigca: 1819, 1824. Driver.cpp 1824

Iqhekeza N48-N60: Ayibalulekanga, kodwa isiphene (ukuvuza kwenkumbulo okunokwenzeka)

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

PVS-Studio isilumkiso: V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli 'soBuchule' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-isel-fuzzer.cpp 58

Ukongeza into ekupheleni kwesikhongozeli njenge std::vector > awukwazi ukubhala nje xxx.push_back(entsha X), kuba akukho guqulelo olucacileyo ukusuka X* Π² std::yahlukileyo_ptr.

Isisombululo esiqhelekileyo kukubhala xxx.emplace_back(entsha X)kuba ihlanganisa: indlela emplace_back wakha into ngokuthe ngqo kwiingxoxo zayo kwaye ke ngoko unokusebenzisa abakhi abacacileyo.

Ayikhuselekanga. Ukuba i-vector igcwele, imemori iphinda yabiwe. Umsebenzi wokwabelwa ngokutsha inkumbulo unokusilela, okukhokelela ekubeni kuphoswe ngaphandle std::bad_alloc. Kule meko, isalathisi siya kulahleka kwaye into eyenziweyo ayinakuze icinywe.

Isisombululo esikhuselekileyo kukudala unique_ptreya kuba yeyakho isalathi phambi kokuba i-vector izame ukubeka kwakhona imemori:

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

Ukusukela ku-C++14, ungasebenzisa 'std::make_unique':

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

Olu hlobo lwesiphene alubalulekanga kwi-LLVM. Ukuba imemori ayinakwabiwa, umqokeleli uya kumisa ngokulula. Nangona kunjalo, kwizicelo ezinde ixesha lokuphumla, engakwaziyo ukuphelisa ukuba ulwabiwo lwenkumbulo aluphumeleli, oku kunokuba yimpazamo yokwenene.

Ke, nangona le khowudi ingenabungozi kwi-LLVM, ndiyifumene iluncedo ukuthetha ngale pateni yempazamo kunye nokuba umhlalutyi we-PVS-Studio ufundile ukuyichonga.

Ezinye izilumkiso zolu hlobo:

  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli 'sokudlula' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. PassManejala.h 546
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwi-'AAs' isikhongozeli ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. Uhlalutyo lwe-Alias.h 324
  • V1023 [CWE-460] Isalathisi esingenamnikazi siyongezwa kwisikhongozeli 'soNgeniso' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'AllEdges' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. CFGMST.h 268
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwi-'VMaps' isikhongozeli ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. I-SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se'Record' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. FDRLogBuilder.h 30
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'PendingSubmodules' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. ModuleMap.cpp 810
  • V1023 [CWE-460] Isalathisi esingenamnini sidityaniswe kwisikhongozeli 'Izinto' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. DebugMap.cpp 88
  • V1023 [CWE-460] Isalathisi esingenamnikazi siyongezwa kwisikhongozeli 'soBuchule' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 685
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 686
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 688
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 689
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 690
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 691
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 692
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 693
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Modifiers' ngendlela 'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. llvm-stress.cpp 694
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Operands' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Stash' ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] Isalathisi esingenamnini sifakwe kwisikhongozeli se-'Matchers 'ngendlela ye-'emplace_back'. Ukuvuza kwememori kuya kwenzeka kwimeko ethile. GlobalISelEmitter.cpp 2702

isiphelo

Ndakhupha izilumkiso ezingama-60 zizonke ndaza ndayeka. Ngaba zikho ezinye iziphene ezifunyanwa ngumhlalutyi we-PVS-Studio kwi-LLVM? Ewe ndinayo. Nangona kunjalo, xa ndibhala iziqwenga zekhowudi zenqaku, kwakuhlwile, okanye kunobusuku, kwaye ndaye ndagqiba ekubeni lixesha lokuyibiza ngokuba yimini.

Ndiyathemba ukuba uyifumene inomdla kwaye uya kufuna ukuzama i-PVS-Studio analyzer.

Unokukhuphela i-analyzer kwaye ufumane iqhosha le-minesweeper kweli phepha.

Okubaluleke kakhulu, sebenzisa uhlalutyo lwe-static rhoqo. Iitshekhi zexesha elinye, olwenziwa sithi ukwenzela ukuba kuphakanyiswe indlela yohlalutyo lwe-static kunye ne-PVS-Studio ayiyona imeko eqhelekileyo.

Inhlanhla ekuphuculeni umgangatho kunye nokuthembeka kwekhowudi yakho!

Ukufumana iimpazamo kwi-LLVM 8 usebenzisa i-PVS-Studio analyzer

Ukuba ufuna ukwabelana ngeli nqaku kunye nabaphulaphuli abathetha isiNgesi, nceda usebenzise ikhonkco lokuguqulela: Andrey Karpov. Ukufumana iiBugs kwiLLVM 8 ngePVS-Studio.

umthombo: www.habr.com

Yongeza izimvo