Ịchọta ahụhụ na LLVM 8 site na iji PVS-Studio analyzer

Ịchọta ahụhụ na LLVM 8 site na iji PVS-Studio analyzer
Ihe karịrị afọ abụọ agafeela kemgbe nyocha koodu ikpeazụ nke ọrụ LLVM site na iji nyocha PVS-Studio anyị. Ka anyị jide n'aka na onye nyocha PVS-Studio ka bụ ihe na-eduga n'ịchọpụta njehie na adịghị ike. Iji mee nke a, anyị ga-elele wee chọta mperi ọhụrụ na ntọhapụ LLVM 8.0.0.

Edemede a ga-ede

N'ikwu eziokwu, Achọghị m ide akụkọ a. Ọ bụghị ihe na-adọrọ mmasị ide banyere ọrụ anyị nyochalarị ọtụtụ ugboro (1, 2, 3). Ọ ka mma ide banyere ihe ọhụrụ, ma enweghị m nhọrọ.

Oge ọ bụla ewepụtara ma ọ bụ emelite ụdị LLVM ọhụrụ Clang Static Analyzer, anyị na-enweta ajụjụ nke ụdị a na mail anyị:

Lee, ụdị Clang Static Analyzer ọhụrụ amụtala ịchọta mperi ọhụrụ! Ọ dị m ka mkpa iji PVS-Studio na-ebelata. Clang na-achọta ọtụtụ njehie karịa ka ọ dị na mbụ wee nweta ike nke PVS-Studio. Kedu ihe ị chere maka nke a?

Maka nke a, achọrọ m ịza ihe dịka:

Anyị anaghịkwa anọdụ ala nkịtị! Anyị emeziwanyela ike nke onye nyocha PVS-Studio. Ya mere, echegbula, anyị na-aga n'ihu na-edu dị ka ọ dị na mbụ.

N'ụzọ dị mwute, nke a bụ azịza ọjọọ. Enweghị ihe akaebe na ya. Ọ bụ ya mere m ji dee akụkọ a ugbu a. Yabụ, elelela ọrụ LLVM ọzọ wee hụ njehie dị iche iche na ya. Aga m egosi ugbu a ndị na-amasị m. Clang Static Analyzer enweghị ike ịchọta njehie ndị a (ma ọ bụ na ọ naghị adị mfe iji enyemaka ya mee ya). Ma anyị nwere ike. Ọzọkwa, ahụrụ m ma detuo njehie ndị a niile n'otu mgbede.

Ma ide akụkọ ahụ were ọtụtụ izu. Enweghị m ike iweta onwe m itinye ihe a niile na ederede :).

Site n'ụzọ, ọ bụrụ na ị nwere mmasị na teknụzụ ndị a na-eji na PVS-Studio analyzer iji chọpụta njehie na adịghị ike, mgbe ahụ, m na-atụ aro ka ị mara nke a. dee.

Nchọpụta nchọpụta ọhụrụ na nke ochie

Dị ka e kwuworo, ihe dị ka afọ abụọ gara aga, a na-enyocha ọrụ LLVM ọzọ, ma mezie njehie ndị ahụ. Ugbu a isiokwu a ga-eweta ogbe njehie ọhụrụ. Kedu ihe kpatara achọtara ahụhụ ọhụrụ? Enwere ihe atọ kpatara nke a:

  1. Ọrụ LLVM na-agbanwe, na-agbanwe koodu ochie yana ịgbakwunye koodu ọhụrụ. Dị ka o kwesịrị ịdị, enwere mperi ọhụrụ na koodu emegharịrị na nke edere. Nke a na-egosi n'ụzọ doro anya na ekwesịrị iji nyocha static mee ihe mgbe niile, ọ bụghịkwa mgbe ụfọdụ. Akụkọ anyị na-egosi nke ọma ike nke PVS-Studio analyzer, ma nke a enweghị ihe jikọrọ ya na imeziwanye koodu àgwà na ibelata ọnụ ahịa nke idozi njehie. Jiri ihe nyocha koodu static mgbe niile!
  2. Anyị na-emecha ma na-emeziwanye nchọpụta dị ugbu a. Ya mere, onye nyocha nwere ike ịchọpụta njehie ọ na-ahụghị n'oge nyocha gara aga.
  3. Nchọpụta ọhụụ apụtala na PVS-Studio nke na-adịbeghị afọ 2 gara aga. Ekpebiri m ime ka ha pụta ìhè na ngalaba dị iche iji gosi n'ụzọ doro anya mmepe nke PVS-Studio.

Achọpụtara ntụpọ site na nchọpụta nchọpụta dị adị afọ 2 gara aga

Iberibe N1: Copy-Paste

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

Ịdọ aka ná ntị PVS-Studio: V501 [CWE-570] E nwere otu okwu sub-okwu 'Aha.startswith("avx512.mask.permvar.")' n'aka ekpe na n'aka nri nke '||' onye ọrụ. AutoUpgrade.cpp 73

A na-enyocha ya ugboro abụọ na aha ahụ na-amalite site na mkpụrụedemede "avx512.mask.permvar." Na nlele nke abụọ, o doro anya na ha chọrọ ide ihe ọzọ, mana chefuru imezi ederede e depụtaghachiri.

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

Ịdọ aka ná ntị PVS-Studio: V501 E nwere otu okwu sub-nkwupụta 'CXNameRange_WantQualifier' n'aka ekpe na aka nri nke '|' onye ọrụ. Cindex.cpp 7245

N'ihi typo, a na-eji otu oge aha ya bụ ugboro abụọ CXNameRange_WantQualifier.

Iberibe N3: Ọgba aghara na ụzọ onye ọrụ

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

Ịdọ aka ná ntị PVS-Studio: V502 [CWE-783] Ikekwe '?:' onye ọrụ na-arụ ọrụ n'ụzọ dị iche karịa ka ọ tụrụ anya ya. Onye ọrụ '?:' nwere mkpa dị ala karịa onye ọrụ '=='. PPCTargetTransformInfo.cpp 404

N'uche nke m, nke a bụ mmejọ mara mma nke ukwuu. Ee, ama m na m nwere echiche dị iche iche gbasara ịma mma :).

Ugbu a, dị ka mkpa onye ọrụ, a na-enyocha okwu ahụ dị ka ndị a:

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

Site n'echiche bara uru, ọnọdụ dị otú ahụ enweghị isi, ebe ọ bụ na enwere ike belata ya:

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

Nke a bụ ndudue doro anya. O yikarịrị, ha chọrọ iji 0/1 tụnyere mgbanwe Index. Iji dozie koodu ahụ, ị ​​ga-agbakwunye akara akara n'akụkụ onye ọrụ ternary:

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

Site n'ụzọ, onye ọrụ ternary dị oke egwu ma kpasuo njehie ezi uche dị na ya. Kpachara anya nke ọma na ya, enwekwala anyaukwu n'ime akara aka. M lere isiokwu a anya n'ụzọ zuru ezu ebe a.

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

Ịdọ aka ná ntị PVS-Studio: V522 [CWE-476] Mkpesa nke null pointer 'LHS' nwere ike ime. TGParser.cpp 2152

Ọ bụrụ na pointer LHS ọ bụ efu, a ga-enye ịdọ aka ná ntị. Otú ọ dị, kama nke ahụ, a ga-ewepụ otu ihe ngosi efu a: LHS->getAsString().

Nke a bụ ọnọdụ a na-ahụkarị mgbe ezoro ezo njehie na onye na-ahụ maka mperi, ebe ọ nweghị onye na-anwale ha. Ndị nyocha static na-enyocha koodu niile enwere ike iru, n'agbanyeghị ugboro ole ejiri ya. Nke a bụ ezigbo ihe atụ nke otu nyocha static si akwado usoro nyocha na njehie ọzọ.

Njehie njikwa nrụtụ aka yiri ya RHS ekwenyere na koodu dị n'okpuru: V522 [CWE-476] Dereferencing nke null pointer 'RHS' nwere ike ime. TGParser.cpp 2186

Iberibe N6: Iji ihe nrịbama emechaa

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

Ịdọ aka ná ntị PVS-Studio: V522 [CWE-476] Mkpesa nke ihe ngosi efu 'ProgClone' nwere ike ime. Nkọwapụta.cpp 601

Na mbido smart pointer ProgClone kwụsịrị inwe ihe ahụ:

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

N'ezie, ugbu a ProgClone bụ ihe efu efu. Ya mere, ntughari null pointer kwesịrị ime n'okpuru:

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

Ma, n'eziokwu, nke a agaghị eme! Rịba ama na emeghị loop ahụ n'ezie.

Na mmalite nke akpa Ọrụ ezighi ezi kpochara:

MiscompiledFunctions.clear();

Na-esote, a na-eji nha nke akpa a na ọnọdụ akaghị:

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

Ọ dị mfe ịhụ na loop anaghị ebido. Echere m na nke a bụkwa ahụhụ ma ekwesịrị ide koodu ahụ n'ụzọ dị iche.

Ọ dị ka anyị ahụla ụdị njehie ahụ a ma ama! Otu mmejọ na-ekpuchi ọzọ :).

Iberibe N7: Iji ihe nrịbama emechaa

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

Ịdọ aka ná ntị PVS-Studio: V522 [CWE-476] Mkpesa nke null pointer 'Nnwale' nwere ike ime. Ihe nchikota.cpp 709

Otu ọnọdụ ọzọ. Na mbụ, a na-emegharị ihe dị n'ime ihe ahụ, mgbe ahụ, a na-eji ya eme ihe dị ka à ga-asị na ọ dịghị ihe merenụ. M na-ahụ ọnọdụ a ugboro ugboro na koodu mmemme mgbe semantics mmegharị pụtara na C ++. Nke a mere m ji hụ asụsụ C++ n'anya! Enwere ụzọ ọhụrụ ị ga-esi agbapụ ụkwụ gị. Onye nyocha PVS-Studio ga-enwe ọrụ mgbe niile :).

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

Ịdọ aka ná ntị PVS-Studio: V522 [CWE-476] Mkpesa nke ihe ngosi 'Ụdị' nwere ike ime. PrettyFunctionDumper.cpp 233

Na mgbakwunye na ndị na-ahụ maka mperi, anaghị anwale ọrụ mbipụta nbibi. Anyị nwere ụdị ikpe a n'ihu anyị. Ọrụ ahụ na-echere onye ọrụ, onye, ​​kama idozi nsogbu ya, a ga-amanye idozi ya.

N'ụzọ ziri ezi:

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

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

Ịdọ aka ná ntị PVS-Studio: V522 [CWE-476] Mkpesa nke ihe ngosi efu 'Ty' nwere ike ime. AchọgharịTableEmitter.cpp 614

Echere m na ihe niile doro anya na ọ dịghị achọ nkọwa.

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

Ịdọ aka ná ntị PVS-Studio: V570 A na-ekenye mgbanwe 'Identifier-> Ụdị' n'onwe ya. FormatTokenLexer.cpp 249

O nweghị uru inye onwe ya mgbanwe. O yikarịrị ka ha chọrọ ide:

Identifier->Type = Question->Type;

Iberibe N11: nkwụsịtụ enyo

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

Ịdọ aka ná ntị PVS-Studio: V622 [CWE-478] Tụlee inyocha nkwupụta 'mgbanwe'. Ọ ga-ekwe omume na onye ọrụ 'case' mbụ efu efu. SistemụZAsmParser.cpp 652

Enwere onye ọrụ na-enyo enyo na mbido ezumike. Ị chefuru ide ihe ọzọ ebe a?

Iberibe N12: Na-elele ntụnye mgbe emechara ya

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

Ịdọ aka ná ntị PVS-Studio: V595 [CWE-476] Ejiri akara ngosi 'Callee' tupu enyocha ya megide nullptr. Lelee ahịrị: 172, 174. AMDGPUInline.cpp 172

Nkọwa Callee na mbido, ewepụrụ n'oge a na-akpọ ọrụ ahụ nweta TTI.

Ma mgbe ahụ, ọ na-apụta na a ga-enyocha pointer a maka nha anya nullptr:

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

Mana ọ gafeela…

Iberibe N13 - N...: Na-elele ntụnye mgbe emechara ya

Ọnọdụ a tụlere na ibe koodu gara aga abụghị ihe pụrụ iche. Ọ pụtara ebe a:

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

Ịdọ aka ná ntị PVS-Studio: V595 [CWE-476] Ejiri akara 'CalleeFn' tupu enyocha ya megide nullptr. Lelee ahịrị: 1079, 1081. SimplifyLibCalls.cpp 1079

Na ebe a:

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

Ịdọ aka ná ntị PVS-Studio: V595 [CWE-476] Ejiri akara 'ND' tupu enyocha ya megide nullptr. Lelee ahịrị: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Na ebe a:

  • V595 [CWE-476] Ejiri akara ngosi 'U' tupu enyocha ya megide nullptr. Lelee ahịrị: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Ejiri akara ngosi 'ND' tupu enyocha ya megide nullptr. Lelee ahịrị: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Ma mgbe ahụ, enweghị m mmasị n'ịmụ ịdọ aka ná ntị na nọmba V595. Ya mere, amaghị m ma enwere njehie ndị ọzọ yiri nke ahụ ma e wezụga ndị edepụtara ebe a. O yikarịrị ka ọ dị.

Iberibe N17, N18: Mgbanwe na-enyo enyo

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

Ịdọ aka ná ntị PVS-Studio: V629 [CWE-190] Tụlee inyocha okwu '~ (Nha - 1) << 1'. Ịgbanwe ntakịrị nke uru 32-bit yana mgbasawanye na-esote na ụdị 64-bit. AArch64 na-agwa okwuModes.h 260

O nwere ike ọ gaghị abụ ahụhụ na koodu ahụ na-arụ ọrụ kpọmkwem ka e bu n'obi. Mana nke a doro anya na ebe a na-enyo enyo na ọ dị mkpa ka enyocha ya.

Ka anyị kwuo mgbanwe size hà nhata 16, ma onye dere koodu ahụ zubere iji nweta ya na mgbanwe NImms uru:

1111111111111111111111111111111111111111111111111111111111100000

Agbanyeghị, n'eziokwu, nsonaazụ ga-abụ:

0000000000000000000000000000000011111111111111111111111111100000

Nke bụ eziokwu bụ na ngụkọ niile na-eme site na iji ụdị 32-bit na-edeghị aha. Naanị mgbe ahụ, ụdị 32-bit a na-edebanyeghị aha ga-agbasa n'ezoghị ọnụ ruo Ugochukwu. N'okwu a, ihe kachasị mkpa ga-abụ efu.

Ị nwere ike idozi ọnọdụ dị ka nke a:

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

Ọnọdụ yiri ya: V629 [CWE-190] Tụlee inyocha okwu 'Immr << 6'. Ịgbanwe ntakịrị nke uru 32-bit yana mgbasawanye na-esote na ụdị 64-bit. AArch64 addressingModes.h 269

Iberibe N19: mkpụrụokwu efu ọzọ?

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

Ịdọ aka ná ntị PVS-Studio: V646 [CWE-670] Tụlee inyocha mgbagha ngwa ahụ. Ọ ga-ekwe omume na isiokwu 'ọzọ' na-efu. AMDGPUAsmParser.cpp 5655

Enweghị mmejọ ebe a. Ebe ọ bụ na mgbe ahụ-ngbochi nke mbụ if mechie na anọgide, mgbe ahụ ọ dịghị mkpa, e nwere isiokwu ọzọ ma ọ bụ ọ bụghị. N'ụzọ ọ bụla koodu ga-arụ ọrụ otu. A ka na-atụ uche ọzọ na-eme ka koodu ahụ doo anya ma dị ize ndụ. Ọ bụrụ na n'ọdịnihu anọgide na-apụ n'anya, koodu ahụ ga-amalite ịrụ ọrụ kpamkpam iche. N'uche m, ọ ka mma ịgbakwunye ọzọ.

Iberibe N20: typos anọ nke otu ụdị

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

Ịdọ aka ná ntị PVS-Studio:

  • V655 [CWE-480] Ejikọtara eriri ndị ahụ mana ejighị ya. Tụlee inyocha okwu 'Result + Name.str()'. Symbol.cpp 32
  • V655 [CWE-480] Ejikọtara eriri ndị ahụ mana ejighị ya. Tụlee inyocha okwu 'Result +"(ObjC Class)" + Name.str()'. Symbol.cpp 35
  • V655 [CWE-480] Ejikọtara eriri ndị ahụ mana ejighị ya. Tụlee inyocha okwu 'Result +"(ObjC Class EH)" + Name.str()'. Symbol.cpp 38
  • V655 [CWE-480] Ejikọtara eriri ndị ahụ mana ejighị ya. Tụlee inyocha okwu 'Result +"(ObjC IVar)" + Name.str()'. Symbol.cpp 41

Site na mberede, a na-eji onye na-ahụ maka ọrụ + karịa onye na-arụ ọrụ +=. Ihe si na ya pụta bụ atụmatụ na-enweghị ihe ọ pụtara.

Iberibe N21: Omume enweghị nkọwa

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

Gbalịa ịchọta koodu dị ize ndụ n'onwe gị. Na nke a bụ foto ịdọpụ uche ka ị ghara ilele azịza ya ozugbo:

Ịchọta ahụhụ na LLVM 8 site na iji PVS-Studio analyzer

Ịdọ aka ná ntị PVS-Studio: V708 [CWE-758] A na-eji ihe owuwu dị ize ndụ: 'FeaturesMap[Op] = FeaturesMap.size()', ebe 'FeaturesMap' bụ nke klaasị 'map'. Nke a nwere ike ibute omume enweghị nkọwa. RISCVCompressInstEmitter.cpp 490

Ahịrị nsogbu:

FeaturesMap[Op] = FeaturesMap.size();

Ọ bụrụ na mmewere Op achọtaghị ya, mgbe ahụ, a na-emepụta ihe ọhụrụ na map ma dee ọnụ ọgụgụ nke ihe dị na map a n'ebe ahụ. A maghị ma a ga-akpọ ọrụ ahụ size tupu ma ọ bụ mgbe ịgbakwunye ihe ọhụrụ.

Iberibe N22-N24: Ihe omume ugboro ugboro

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

Ịdọ aka ná ntị PVS-Studio: V519 [CWE-563] A na-ekenye mgbanwe 'NType' ụkpụrụ ugboro abụọ n'usoro. Ikekwe nke a bụ mmejọ. Lelee ahịrị: 1663, 1664. MachOObjectFile.cpp 1664

Echeghị m na e nwere ezigbo mmejọ ebe a. Naanị ọrụ ugboro ugboro na-enweghị isi. Mana ọ ka bụ mmejọ.

N'otu aka ahụ:

  • V519 [CWE-563] A na-ekenye mgbanwe 'B.NDesc' ụkpụrụ ugboro abụọ n'usoro. Ikekwe nke a bụ mmejọ. Lelee ahịrị: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] A na-ekenye mgbanwe ahụ ụkpụrụ ugboro abụọ n'usoro. Ikekwe nke a bụ mmejọ. Lelee ahịrị: 59, 61. coff2yaml.cpp 61

Iberibe N25-N27: Mgbanwe ndị ọzọ

Ugbu a, ka anyị leba anya n'ụdị nhazigharị dịtụ iche.

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

Ịdọ aka ná ntị PVS-Studio: V519 [CWE-563] A na-ekenye ụkpụrụ 'nhazi' mgbanwe ugboro abụọ n'usoro. Ikekwe nke a bụ mmejọ. Lelee ahịrị: 1158, 1160. LoadStoreVectorizer.cpp 1160

Nke a bụ koodu iju anya nke o doro anya nwere mperi ezi uche dị na ya. Na mmalite, mgbanwe itinye n'ọnọdụ a na-ekenye uru dabere na ọnọdụ ahụ. Ma mgbe ahụ ọrụ ahụ na-eme ọzọ, ma ugbu a na-enweghị nlele ọ bụla.

Enwere ike ịhụ ọnọdụ ndị yiri ya ebe a:

  • V519 [CWE-563] The 'Effects' variable ka ekenyere ụkpụrụ ugboro abụọ n'usoro. Ikekwe nke a bụ mmejọ. Lelee ahịrị: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] A na-ekenye mgbanwe 'ExpectNoDerefChunk' ụkpụrụ ugboro abụọ n'usoro. Ikekwe nke a bụ mmejọ. Lelee ahịrị: 4970, 4973. SemaType.cpp 4973

Iberibe N28: Ọnọdụ eziokwu mgbe niile

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

Ịdọ aka ná ntị PVS-Studio: V547 [CWE-571] Okwu 'nextByte != 0x90' bụ eziokwu mgbe niile. X86DisassemblerDecoder.cpp 379

Nyochaa enweghị isi. Na-agbanwe agbanwe nextByte mgbe niile adịghị nhata uru 0X90, nke na-esote site na nlele gara aga. Nke a bụ ụdị njehie ezi uche dị na ya.

Iberibe N29 - N...: Ọnọdụ eziokwu/ụgha mgbe niile

Onye nyocha ahụ na-enye ọtụtụ ịdọ aka ná ntị na ọnọdụ ahụ dum (V547) ma ọ bụ akụkụ ya (V560) bụ eziokwu mgbe niile ma ọ bụ ụgha. Ọtụtụ mgbe, ndị a abụghị ezigbo mperi, kama ọ bụ naanị koodu sloppy, nsonaazụ nke mmụba nnukwu, na ihe ndị ọzọ. Otú ọ dị, ọ bụ ihe ezi uche dị na ya ileba ịdọ aka ná ntị ndị a nile anya, ebe ọ bụ na ezi ihie ụzọ ezi uche dị na ya na-eme site n'oge ruo n'oge. Dịka ọmụmaatụ, akụkụ koodu a na-enyo enyo:

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

Ịdọ aka ná ntị PVS-Studio: V560 [CWE-570] Akụkụ nke okwu ọnọdụ bụ ụgha mgbe niile: RegNo == 0xe. ARMDisassembler.cpp 939

0xE na-adịgide adịgide bụ uru 14 na decimal. Nyocha RegNo == 0xe enweghị isi n'ihi na ọ bụrụ RegNo> 13, mgbe ahụ, ọrụ ahụ ga-agwụcha ya.

Enwere ọtụtụ ịdọ aka ná ntị ndị ọzọ nwere NJ V547 na V560, mana dịka ọ dị V595, Enweghị m mmasị n'ịmụ ịdọ aka ná ntị ndị a. O doro anya na enwere m ihe zuru oke iji dee edemede :). Ya mere, a maghị ole njehie nke ụdị a nwere ike mata na LLVM site na iji PVS-Studio.

M ga-enye gị ihe atụ nke ihe mere ịmụ ihe ndị a na-akpata ji na-agwụ ike. Onye nyocha ahụ ziri ezi n'inye ịdọ aka ná ntị maka koodu na-esonụ. Mana nke a abụghị mmejọ.

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

Ịdọ aka ná ntị PVS-Studio: V547 [CWE-570] Okwu '! HasError' bụ ụgha mgbe niile. LineParser.cpp 1635

Iberibe N30: ​​Nlaghachi na-enyo enyo

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

Ịdọ aka ná ntị PVS-Studio: V612 [CWE-670] 'Nlaghachi' na-enweghị njedebe n'ime akaghị. R600UptimizeVectorRegisters.cpp 63

Nke a bụ njehie ma ọ bụ usoro a kapịrị ọnụ nke e bu n'obi kọwaara ndị mmemme na-agụ koodu ahụ. Nhazi a akọwaghị m ihe ọ bụla ma na-enyo enyo. Ọ ka mma ịghara ide otu ahụ :).

Ike gwụrụ? Mgbe ahụ ọ bụ oge ịme tii ma ọ bụ kọfị.

Ịchọta ahụhụ na LLVM 8 site na iji PVS-Studio analyzer

Achọpụtaghị ntụpọ site na nchọpụta ọhụrụ

Echere m na 30 activations nke ochie diagnostics ezuru. Ka anyị hụ ugbu a ihe na-akpali ihe nwere ike ịhụ na ọhụrụ diagnostics pụtara na analyzer mgbe gara aga nyocha. N'ime oge a, agbakwunyere ngụkọta nke nyocha izugbe 66 na nyocha C++.

Iberibe N31: Koodu enweghị ike iru

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

Ịdọ aka ná ntị PVS-Studio: V779 [CWE-561] Achọpụtara koodu enweghị ike iru. O kwere omume na njehie dị. ExecutionUtils.cpp 146

Dị ka ị nwere ike ịhụ, alaka abụọ nke onye ọrụ if mechie na oku a na-akpọ onye ọrụ nloghachi. N'ihi ya, akpa ahụ CtorDtorsByPriority agaghị ekpochapụ.

Iberibe N32: Koodu enweghị ike iru

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

Ịdọ aka ná ntị PVS-Studio: V779 [CWE-561] Achọpụtara koodu enweghị ike iru. O kwere omume na njehie dị. LLParser.cpp 835

Ọnọdụ na-adọrọ mmasị. Ka anyị buru ụzọ leba anya n'ebe a:

return ParseTypeIdEntry(SummaryID);
break;

Na nlele mbụ, ọ dị ka ọ nweghị njehie ebe a. Ọ dị ka onye ọrụ ezumike enwere mgbakwunye ebe a, ị nwere ike ihichapụ ya naanị. Otú ọ dị, ọ bụghị ihe niile dị mfe.

Onye nyocha ahụ na-enye ịdọ aka ná ntị na ahịrị ndị a:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Na n'ezie, koodu a enweghị ike ịnweta. Okwu niile na mgba ọkụ mechie na oku sitere n'aka onye ọrụ nloghachi. Ma ugbu a enweghị isi naanị ezumike anaghị adị ka ihe adịghị njọ! Ikekwe otu n'ime alaka kwesịrị ịkwụsị na ezumike, ọ bụghị nloghachi?

Iberibe N33: Ntọgharị nke nnukwu ibe n'ibe

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

Ịdọ aka ná ntị PVS-Studio: V784 Ogo nke nkpuchi bit erughị nha nke operand nke mbụ. Nke a ga-eme ka mfu nke ibe n'ibe dị elu. Oge ojiriDyld.cpp 815

Biko mara na ọrụ ahụ nwetaStubNhazi nloghachi ụdị ejighi aha. Ka anyị gbakọọ uru nke okwu ahụ, na-eche na ọrụ ahụ weghachiri uru 8:

~ ( nwetaStubAlignment () - 1)

(8u-1)

0xFFFFFFFF8u

Ugbu a mara na agbanwe agbanwe Nha data nwere ụdị 64-bit enweghị akara. Ọ tụgharịrị na mgbe ị na-arụ ọrụ DataSize & 0xFFFFFFF8u, a ga-emegharị ihe niile dị elu iri atọ na abụọ na efu. O yikarịrị, nke a abụghị ihe onye mmemme chọrọ. Echere m na ọ chọrọ ịgbakọ: DataSize & 0xFFFFFFFFFFFFFFF8u.

Iji dozie njehie ahụ, ị ​​ga-ede nke a:

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

Ma ọ bụ ya mere:

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

Iberibe N34: Ụdị ihe nkedo pụtara ìhè dara

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

Ịdọ aka ná ntị PVS-Studio: V1028 [CWE-190] Ijubiga ókè nwere ike. Tụlee ịtụba operands nke onye ọrụ 'NumElts * Scale' n'ụdị 'size_t', ọ bụghị nsonaazụ ya. X86ISelLowering.h 1577

A na-eji ụdị nkedo akọwapụta ihe iji zere njupụta mgbe a na-amụba ụdị mgbanwe Int. Agbanyeghị, ụdị nkedo a kapịrị ọnụ ebe a anaghị echebe ya pụọ ​​​​na oke oke. Nke mbụ, a ga-amụba mgbanwe ndị ahụ, naanị mgbe ahụ, nsonaazụ 32-bit nke mmụba ga-agbasa na ụdị. Ibu.

Iberibe N35: Detuo-Tapawa dara

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] Ahụrụ iberibe koodu abụọ yiri ya. Ikekwe, nke a bụ typo na 'Op1' mgbanwe kwesịrị iji kama 'Op0'. InstCombineCompares.cpp 5507

Nchọpụta ọhụrụ a na-adọrọ mmasị na-achọpụta ọnọdụ ebe e depụtaghachiri koodu ma malite ịgbanwe aha ụfọdụ dị na ya, mana n'otu ebe ha edozibeghị ya.

Biko mara na na ngọngọ nke abụọ ha gbanwere Nke 0 on Nke 1. Ma n'otu ebe ha edozighị ya. O yikarịrị ka a ga-ede ya dị ka nke a:

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

Iberibe N36: Mgbagwoju anya mgbanwe

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

Ịdọ aka ná ntị PVS-Studio: V1001 [CWE-563] A na-ekenye mgbanwe 'Mode' mana ejighị ya na njedebe nke ọrụ ahụ. SIModeRegister.cpp 48

Ọ dị oke egwu ịnye arụmụka ọrụ otu aha dị ka ndị otu klas. Ọ dị nnọọ mfe inwe mgbagwoju anya. Anyị nwere ụdị ikpe a n'ihu anyị. Okwu a enweghị isi:

Mode &= Mask;

Arụmụka ọrụ na-agbanwe. Ọ gwụla. Ejikwaghị arụmụka a. O yikarịrị ka ị ga-ede ya dị ka nke a:

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

Iberibe N37: Mgbagwoju anya mgbanwe

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

Ịdọ aka ná ntị PVS-Studio: V1001 [CWE-563] A na-ekenye mgbanwe ' nha' mana ejighị ya na njedebe nke ọrụ ahụ. Ihe.cpp 424

Ọnọdụ ahụ yiri nke gara aga. Ekwesịrị ide ya:

this->Size += this->EntrySize;

Iberibe N38-N47: Ha chefuru ịlele index

Na mbụ, anyị lere anya n'ihe atụ nke ịkpalite nchọpụta ọrịa V595. Ihe kacha mkpa bụ na a na-ewepụ ihe nrịbama ahụ na mbido, wee lelee ya. Nchọpụta nchọpụta na-eto eto V1004 bụ ihe na-abụghị nke pụtara, ma na-ekpughe ọtụtụ njehie. Ọ na-achọpụta ọnọdụ ebe a na-enyocha pointer na mmalite wee chefuo ime ya. Ka anyị leba anya n'okwu ikpe ndị dị n'ime 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());  // <=
  ....
}

Ịdọ aka ná ntị PVS-Studio: V1004 [CWE-476] A na-eji ihe nrịbama 'Ptr' eme ihe n'enweghị nchebe mgbe enyochachara ya megide nullptr. Lelee ahịrị: 729, 738. TargetTransformInfoImpl.h 738

Mgbanwe Ptr nwere ike ha nhata nullptr, dị ka egosiri site na nlele:

if (Ptr != nullptr)

Agbanyeghị, n'okpuru ebe a ka ewepụrụ n'enweghị nlele mbụ:

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

Ka anyị tụlee ikpe ọzọ yiri nke ahụ.

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

Ịdọ aka ná ntị PVS-Studio: V1004 [CWE-476] A na-eji ihe nrịbama 'FD' eme ihe na-adịghị ize ndụ mgbe enyochachara ya megide nullptr. Lelee ahịrị: 3228, 3231. CGDebugInfo.cpp 3231

Lezienụ anya na akara FD. Eji m n'aka na a na-ahụ nsogbu ahụ nke ọma na ọ dịghị nkọwa pụrụ iche achọrọ.

Ọzọkwa:

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

Ịdọ aka ná ntị PVS-Studio: V1004 [CWE-476] A na-eji ihe nrịbama 'PtrTy' eme ihe n'enweghị nchebe mgbe enyochachara ya megide nullptr. Lelee ahịrị: 960, 965. InterleavedLoadCombinePass.cpp 965

Kedu ka ị ga-esi chebe onwe gị pụọ na njehie dị otú ahụ? Nwee ntị nke ọma na Usoro-Nyocha wee jiri PVS-Studio static analyzer na-elele koodu gị oge niile.

Ọ baghị uru ịkọwa iberibe koodu ndị ọzọ nwere njehie ụdị a. Aga m ahapụ naanị ndepụta ịdọ aka ná ntị n'isiokwu:

  • V1004 [CWE-476] A na-eji ihe nrịbama 'Expr' na-enweghị nchekwa mgbe enyochachara ya megide nullptr. Lelee ahịrị: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] A na-eji ihe nrịbama 'PI' eme ihe n'enweghị nchekwa mgbe enyochachara ya megide nullptr. Lelee ahịrị: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Ejiri ntụnye 'StatepointCall' na-enweghị nchekwa mgbe enyochachara ya megide nullptr. Lelee ahịrị: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] A na-eji ihe nrịbama 'RV' eme ihe n'enweghị nchekwa mgbe enyochachara ya megide nullptr. Lelee ahịrị: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Ejiri ntụnye 'CalleeFn' na-enweghị nchekwa mgbe enyochachara ya megide nullptr. Lelee ahịrị: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] A na-eji ihe nrịbama 'TC' eme ihe n'enweghị nchekwa mgbe enyochachara ya megide nullptr. Lelee ahịrị: 1819, 1824. Driver.cpp 1824

Iberibe N48-N60: Ọ bụghị ihe dị oke egwu, mana ntụpọ (ebe nchekwa nwere ike ime)

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

Ịdọ aka ná ntị PVS-Studio: V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Strategies' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-isel-fuzzer.cpp 58

Ka ịgbakwunye ihe na njedebe nke akpa dị ka std :: vector > ị gaghị ede naanị xxx.push_back(X ọhụrụ), ebe ọ bụ na e nweghị ntughari n'ezoghị ọnụ si X* в std :: pụrụ iche_ptr.

Ihe ngwọta na-emekarị bụ ide xxx.emplace_back(X ọhụrụ)ebe ọ na-achịkọta: usoro emplace_back na-arụ otu mmewere ozugbo site na arụmụka ya ma nwee ike iji ihe nrụpụta doro anya.

Ọ dịghị mma. Ọ bụrụ na vector zuru ezu, mgbe ahụ a ga-ekenyekwa ebe nchekwa ọzọ. Ọrụ ebe nchekwa ebe nchekwa nwere ike daa, na-ebute ewepu ihe atụ std :: ọjọọ_alloc. N'okwu a, pointer ga-efunahụ ma ihe e kere eke agaghị ehichapụ.

Ihe ngwọta dị mma bụ ịmepụta iche_ptrnke ga-enwe ihe nrịbama ahụ tupu vector nwaa ibipụta ebe nchekwa:

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

Kemgbe C ++14, ị nwere ike iji 'std :: make_unique':

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

Ụdị ntụpọ a adịghị mkpa maka LLVM. Ọ bụrụ na enweghị ike ịkenye ebe nchekwa, ihe nchịkọta ga-akwụsị naanị. Otú ọ dị, maka ngwa nwere ogologo oge elu oge, nke na-enweghị ike ịkwụsị ma ọ bụrụ na oke ebe nchekwa dara, nke a nwere ike ịbụ ezigbo ahụhụ.

Yabụ, ọ bụ ezie na koodu a anaghị etinye LLVM egwu bara uru, achọpụtara m na ọ bara uru ikwu maka ụkpụrụ njehie a yana onye nyocha PVS-Studio amụtala ịmata ya.

Ụdị ịdọ aka ná ntị ndị ọzọ:

  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Passes' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. Onye njikwa ngafe.h 546
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'AA' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. AliasAnalysis.h 324
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya n'ime akpa 'Entinye' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'AllEdges' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. CFGMST.h 268
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'VMaps' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Records' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. FDRLogBuilder.h 30
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'PendingSubmodules' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. ModuleMap.cpp 810
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Ihe' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. DebugMap.cpp 88
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Strategies' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 685
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 686
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 688
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 689
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 690
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 691
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 692
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 693
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Modifiers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. lvm-stress.cpp 694
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Operands' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Stash' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] A na-agbakwunye ntụnye na-enweghị onye nwe ya na akpa 'Matchers' site na usoro 'emplace_back'. Mwepu ebe nchekwa ga-eme ma ọ bụrụ na ewepụrụ. GlobalISelEmitter.cpp 2702

nkwubi

Enyere m ịdọ aka ná ntị 60 n'ozuzu ya wee kwụsị. Enwere ntụpọ ndị ọzọ onye nyocha PVS-Studio na-achọpụta na LLVM? Ee, enwere m. Otú ọ dị, mgbe m na-edepụta iberiibe koodu maka isiokwu ahụ, ọ bụ n'uhuruchi, ma ọ bụ ọbụna n'abalị, ekpebiri m na oge eruola ịkpọ ya otu ụbọchị.

Enwere m olileanya na ọ masịrị gị ma chọọ ịnwale PVS-Studio analyzer.

Ị nwere ike ibudata ihe nyocha wee nweta igodo minesweeper na nke a.

Nke kachasị mkpa, na-eji nyocha static eme ihe mgbe niile. Nyocha otu oge, rụrụ site anyị ka popularize usoro nke static analysis na PVS-Studio abụghị a nkịtị dịruru ná njọ.

Jisie na-emeziwanye ogo na ntụkwasị obi nke koodu gị!

Ịchọta ahụhụ na LLVM 8 site na iji PVS-Studio analyzer

Ọ bụrụ na ịchọrọ ịkọrọ ndị na-ege ntị na-asụ Bekee akụkọ a, biko jiri njikọ ntụgharị asụsụ: Andrey Karpov. Ịchọta ahụhụ na LLVM 8 nwere PVS-Studio.

isi: www.habr.com

Tinye a comment