Ho fumana likokoana-hloko ho LLVM 8 ho sebelisa analyzer ea PVS-Studio

Ho fumana likokoana-hloko ho LLVM 8 ho sebelisa analyzer ea PVS-Studio
Ho se ho fetile lilemo tse fetang tse peli ho tloha ha ho hlahlojoa khoutu ea ho qetela ea morero oa LLVM ho sebelisoa analyzer ea rona ea PVS-Studio. Ha re etse bonnete ba hore mohlahlobi oa PVS-Studio e ntse e le sesebelisoa se ka sehloohong sa ho tseba liphoso le bofokoli bo ka bang teng. Ho etsa sena, re tla hlahloba le ho fumana liphoso tse ncha tokollong ea LLVM 8.0.0.

Sehlooho se tla ngoloa

Ho bua 'nete, ke ne ke sa batle ho ngola sehlooho sena. Ha ho monate ho ngola ka morero oo re seng re o hlahlobile makhetlo a 'maloa (1, 2, 3). Ho molemo ho ngola ka ntho e ncha, empa ha ke na boikhethelo.

Nako le nako ha mofuta o mocha oa LLVM o lokolloa kapa o ntlafatsoa Clang Static Analyzer, re fumana lipotso tsa mofuta o latelang mangolong a rona:

Bona, mofuta o mocha oa Clang Static Analyzer o ithutile ho fumana liphoso tse ncha! Ke bona eka bohlokoa ba ho sebelisa PVS-Studio bo ntse bo fokotseha. Clang o fumana liphoso tse ngata ho feta pele mme o ts'oara bokhoni ba PVS-Studio. U nahana'ng ka see?

Ho sena kamehla ke batla ho araba ntho e kang:

Le rona ha re lule re sa etse letho! Re ntlafalitse haholo bokhoni ba mohlahlobi oa PVS-Studio. Kahoo seke oa tšoenyeha, re tsoela pele ho etella pele joalo ka pele.

Ka bomalimabe, ena ke karabo e mpe. Ha ho na bopaki ho eona. Ke ka lebaka leo ke ngolang sehlooho sena hona joale. Kahoo, morero oa LLVM o boetse oa hlahlojoa 'me ho fumanoe liphoso tse fapaneng ho eona. Joale ke tla bonts'a tse neng li bonahala li khahla ho nna. Clang Static Analyzer ha e fumane liphoso tsena (kapa ho thata haholo ho etsa joalo ka thuso ea eona). Empa re ka khona. Ho feta moo, ke ile ka fumana le ho ngola liphoso tsena kaofela ka shoalane e le ’ngoe.

Empa ho ngola sehlooho seo ho ile ha nka libeke tse ’maloa. Ke ne ke sitoa ho itlhahisa ho beha tsena tsohle ka mongolo :).

Ka tsela, haeba u thahasella ho tseba hore na ho sebelisoa theknoloji efe ho PVS-Studio analyzer ho khetholla liphoso le bofokoli bo ka bang teng, joale ke fana ka tlhahiso ea ho tloaelana le sena. Hlokomela.

Litlhahlobo tse ncha le tsa khale

Joalokaha ho se ho boletsoe, hoo e ka bang lilemo tse peli tse fetileng morero oa LLVM o ile oa hlahlojoa hape, 'me liphoso tse fumanoeng li ile tsa lokisoa. Joale sengoloa sena se tla hlahisa liphoso tse ncha. Ke hobane'ng ha ho ile ha fumanoa likokoana-hloko tse ncha? Ho na le mabaka a 3 a sena:

  1. Morero oa LLVM oa fetoha, o fetola khoutu ea khale mme o eketsa khoutu e ncha. Ka tlhaho, ho na le liphoso tse ncha ho khoutu e fetotsoeng le e ngotsoeng. Sena se bontša ka ho hlaka hore tlhahlobo e tsitsitseng e lokela ho sebelisoa kamehla, eseng ka linako tse ling. Lingoliloeng tsa rona li bonts'a hantle bokhoni ba mohlahlobi oa PVS-Studio, empa sena ha se amane le ho ntlafatsa boleng ba khoutu le ho fokotsa litšenyehelo tsa ho lokisa liphoso. Sebelisa static code analyzer kamehla!
  2. Re phethela le ho ntlafatsa litlhahlobo tse teng hona joale. Ka hona, mohlahlobi a ka tseba liphoso tseo a sa kang a li hlokomela nakong ea liteko tse fetileng.
  3. Litlhahlobo tse ncha li hlahile ho PVS-Studio e neng e le sieo lilemong tse 2 tse fetileng. Ke ile ka etsa qeto ea ho li totobatsa karolong e fapaneng ho bontša ka ho hlaka tsoelo-pele ea PVS-Studio.

Mefokolo e bonweng ka tlhahlobo e neng e le teng dilemong tse 2 tse fetileng

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

Tlhokomeliso ea PVS-Studio: V501 [CWE-570] Ho na le mapetjo a tšoanang 'Name.startswith("avx512.mask.permvar.")' ka ho le letšehali le ka ho le letona la '||' mosebeletsi. AutoUpgrade.cpp 73

Ho hlahlojoa habeli hore lebitso le qala ka "avx512.mask.permvar". Chekeng ea bobeli, ho hlakile hore ba ne ba batla ho ngola ntho e 'ngoe, empa ba lebala ho lokisa taba e kopilitsoeng.

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

Tlhokomeliso ea PVS-Studio: V501 Ho na le lipoleloana tse tšoanang 'CXNameRange_WantQualifier' ka ho le letšehali le ka ho le letona la '|' mosebeletsi. CIndex.cpp 7245

Ka lebaka la typo, e tšoanang e bitsoang constant e sebelisoa habeli CXNameRange_WantQualifier.

Sekhechana sa N3: Pherekano le boetapele ba opareitara

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

Tlhokomeliso ea PVS-Studio: V502 [CWE-783] Mohlomong '?:' o sebetsa ka tsela e fapaneng ho feta kamoo e neng e lebelletsoe. '?:' opareitara e na le maemo a tlase ho feta '==' opareitara. PPCTargetTransformInfo.cpp 404

Ka maikutlo a ka, ena ke phoso e ntle haholo. E, kea tseba hore ke na le maikutlo a makatsang ka botle :).

Jwale, ho latela lintho tse tlang pele ho basebelisi, polelo e hlahlojoa ka tsela e latelang:

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

Ho latela pono e sebetsang, boemo bo joalo ha bo utloahale, kaha bo ka fokotsoa ho:

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

Ena ke phoso e hlakileng. Mohlomong, ba ne ba batla ho bapisa 0/1 le phapang Index. Ho lokisa khoutu o hloka ho kenya masakaneng ho potoloha opareitara ea ternary:

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

Ka tsela, opereishene ea ternary e kotsi haholo mme e baka liphoso tse utloahalang. E-ba hlokolosi haholo ka eona 'me u se ke ua ba meharo ka masakaneng. Ke ile ka sheba sehlooho sena ka botlalo mona, khaolong e reng “Hlokomela ?: Opereishene ’me U E Koahele ka Masakaneng.”

Sekhechana sa N4, N5: Sesupa se se nang thuso

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

Tlhokomeliso ea PVS-Studio: V522 [CWE-476] Ho ka 'na ha e-ba le ho khelosoa ha "LHS" ea null pointer. TGParser.cpp 2152

Haeba pointer LHS ha e na thuso, ho lokela hore ho fanoe ka temoso. Leha ho le joalo, ho e-na le hoo, eona null pointer e tla hlakoloa: LHS->getAsString().

Ena ke boemo bo tloaelehileng haholo ha phoso e patiloe ho motho ea sebetsanang le liphoso, kaha ha ho motho ea ba lekang. Bahlahlobisisi ba tsitsitseng ba hlahloba khoutu eohle e fumanehang, ho sa tsotellehe hore na e sebelisoa hangata hakae. Ona ke mohlala o motle haholo oa hore na tlhahlobo e tsitsitseng e tlatsana joang le liteko tse ling le mekhoa ea ho sireletsa liphoso.

Phoso e ts'oanang ea ho sebetsana le pointer RHS e lumelletsoe khoutung e ka tlase feela: V522 [CWE-476] Ho khelosoa ha 'RHS' ho ka etsahala. TGParser.cpp 2186

Fragment N6: Ho sebelisa pointer ka mor'a ho falla

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

Tlhokomeliso ea PVS-Studio: V522 [CWE-476] Ho kheloha ha "ProgClone" ea null pointer ho ka etsahala. Miscompilation.cpp 601

Qalong sesupa se bohlale ProgClone e khaotsa ho ba mong'a ntho eo:

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

Ha e le hantle, hona joale ProgClone ke sesupa sa lefeela. Ka hona, null pointer dereference e lokela ho hlaha ka tlase mona:

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

Empa, bonneteng, sena se ke ke sa etsahala! Hlokomela hore loop ha e hlile ha e sebetse.

Qalong ea setshelo MiscompiledFunctions hlakotsoe:

MiscompiledFunctions.clear();

Ka mor'a moo, boholo ba setshelo sena bo sebelisoa maemong a loop:

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

Ho bonolo ho bona hore loop ha e qale. Ke nahana hore sena le sona ke phoso mme khoutu e lokela ho ngoloa ka tsela e fapaneng.

Ho bonahala eka re kopane le liphoso tseo tse tsebahalang! Phoso e 'ngoe e pata e' ngoe :).

Fragment N7: Ho sebelisa pointer ka mor'a ho falla

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

Tlhokomeliso ea PVS-Studio: V522 [CWE-476] Ho khelosoa ha "Teko" ea null pointer ho ka etsahala. Miscompilation.cpp 709

Boemo bo tšoanang hape. Qalong, litaba tsa ntho eo lia sisinyeha, ebe joale li sebelisoa joalokaha eka ha ho letho le etsahetseng. Ke bona boemo bona khafetsa ho khoutu ea lenaneo kamora hore semantics ea motsamao e hlahe ho C ++. Ke kahoo ke ratang puo ea C++! Ho na le mekhoa e mecha ea ho ithunya leoto la hau. PVS-Studio analyzer e tla lula e na le mosebetsi :).

Sekhechana sa N8: Sesupa se se nang thuso

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

Tlhokomeliso ea PVS-Studio: V522 [CWE-476] Ho kheloha ha "Mofuta" oa null pointer ho ka etsahala. PrettyFunctionDumper.cpp 233

Ntle le ho sebetsana le liphoso, mesebetsi ea khatiso ea ho lokisa liphoso hangata ha e lekoe. Re na le nyeoe e joalo ka pel'a rona. Mosebetsi o emetse mosebedisi, eo, ho e-na le ho rarolla mathata a hae, a tla qobelloa ho e lokisa.

E nepahetse:

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

Sekhechana sa N9: Sesupa se se nang thuso

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

Tlhokomeliso ea PVS-Studio: V522 [CWE-476] Ho kheloha ha "Ty" ea null pointer ho ka etsahala. SearchableTableEmitter.cpp 614

Ke nahana hore tsohle li hlakile ebile ha li hloke tlhaloso.

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

Tlhokomeliso ea PVS-Studio: V570 Phapang ea 'Identifier->Type' e abetsoe eona. FormatTokenLexer.cpp 249

Ha ho na thuso ea ho fana ka phetoho ho eona. Ho ka etsahala hore ebe ba ne ba batla ho ngola:

Identifier->Type = Question->Type;

Sekhechana sa N11: Phomolo e belaetsang

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

Tlhokomeliso ea PVS-Studio: V622 [CWE-478] Nahana ka ho hlahloba polelo ea 'switch'. Ho ka etsahala hore ebe "case" ea pele ha e eo. SystemZAsmParser.cpp 652

Ho na le motho ea belaetsang haholo qalong khefu. Na u lebetse ho ngola se seng mona?

Fragment N12: Ho hlahloba sesupo ka mor'a ho kheloha

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

Tlhokomeliso ea PVS-Studio: V595 [CWE-476] Sesupa sa 'Callee' se ile sa sebelisoa pele se netefatsoa khahlano le nullptr. Sheba mela: 172, 174. AMDGPUInline.cpp 172

Sekhombi Callee qalong e qheletsoe ka thoko ka nako eo mosebetsi o bitsoang ka eona fumanaTTI.

'Me joale ho hlaha hore pointer ena e lokela ho hlahlojoa ho lekana nullptr:

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

Empa nako e se e le morao haholo...

Fragment N13 - N...: Ho hlahloba sesupo ka mor'a ho kheloha

Boemo boo ho buuoeng ka bona karolong e fetileng ea khoutu ha bo ikhethang. E hlaha mona:

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

Tlhokomeliso ea PVS-Studio: V595 [CWE-476] 'CalleeFn' pointer e sebelisitsoe pele e netefatsoa khahlanong le nullptr. Sheba mela: 1079, 1081. SimplifyLibCalls.cpp 1079

Mme mona:

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

Tlhokomeliso ea PVS-Studio: V595 [CWE-476] 'ND' pointer e sebelisitsoe pele e netefatsoa khahlanong le nullptr. Sheba mela: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Mme mona:

  • V595 [CWE-476] 'U' pointer e ile ea sebelisoa pele e netefatsoa khahlanong le nullptr. Sheba mela: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Sesupa sa 'ND' se ile sa sebelisoa pele se netefatsoa khahlano le nullptr. Sheba mela: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Eaba ke se ke sa thahaselle ho ithuta litemoso tse nang le nomoro ea V595. Kahoo ha ke tsebe hore na ho na le liphoso tse ling tse tšoanang ntle le tse thathamisitsoeng mona. Ho ka etsahala hore ebe ho na le.

Sekhechana sa N17, N18: Phetoho e belaetsang

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

Tlhokomeliso ea PVS-Studio: V629 [CWE-190] Nahana ka ho hlahloba poleloana ea '~(Size - 1) <<1'. Phetoho e nyane ea boleng ba 32-bit le katoloso e latelang ho mofuta oa 64-bit. AArch64AddressingModes.h 260

E kanna ea se be phoso mme khoutu e sebetsa hantle joalo ka ha e reriloe. Empa ho hlakile hore sena ke sebaka se belaetsang haholo 'me se hloka ho hlahlojoa.

Ha re re e feto-fetohang Size e lekana le 16, 'me joale mongoli oa khoutu o rerile ho e fumana ka ho feto-fetoha Nmms moelelo:

1111111111111111111111111111111111111111111111111111111111100000

Leha ho le joalo, ha e le hantle sephetho e tla ba:

0000000000000000000000000000000011111111111111111111111111100000

'Nete ke hore lipalo tsohle li etsahala ho sebelisoa mofuta o sa ngolisoang oa 32-bit. Ke ka nako eo feela, mofuta ona o sa ngolisoang oa 32-bit o tla atolosoa ka mokhoa o hlakileng nthabeleng. Tabeng ena, likarolo tsa bohlokoa ka ho fetisisa e tla ba zero.

U ka lokisa boemo ka tsela ena:

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

Boemo bo ts'oanang: V629 [CWE-190] Nahana ka ho hlahloba polelo ea 'Immr << 6'. Phetoho e nyane ea boleng ba 32-bit le katoloso e latelang ho mofuta oa 64-bit. AArch64AddressingModes.h 269

Sekhechana sa N19: Lentsoe la sehlooho le sieo hape?

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

Tlhokomeliso ea PVS-Studio: V646 [CWE-670] Nahana ka ho hlahloba mabaka a ts'ebeliso. Ho ka etsahala hore 'e' ngoe' lentsoe la sehlooho le sieo. AMDGPUAsmParser.cpp 5655

Haho phoso mona. Ho tloha ka nako eo-block ea pele if e qetella ka tsoela pele, joale ha ho na taba, ho na le keyword hape kapa eseng joalo. Ka tsela efe kapa efe khoutu e tla sebetsa joalo. Ke ntse ke fositse hape e etsa hore khoutu e se hlaka le ho ba kotsi. Haeba nakong e tlang tsoela pele e nyamela, khoutu e tla qala ho sebetsa ka tsela e fapaneng ka ho feletseng. Ka maikutlo a ka ho molemo ho eketsa hape.

Fragment N20: Mefuta e mene ea mofuta o le mong

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

Litemoso tsa PVS-Studio:

  • V655 [CWE-480] Likhoele li ne li kopantsoe empa ha li sebelisoe. Nahana ka ho hlahloba polelo ea 'Result + Name.str()'. Letšoao.cpp 32
  • V655 [CWE-480] Likhoele li ne li kopantsoe empa ha li sebelisoe. Nahana ka ho hlahloba polelo ea 'Result + "(ObjC Class)" + Name.str()'. Letšoao.cpp 35
  • V655 [CWE-480] Likhoele li ne li kopantsoe empa ha li sebelisoe. Nahana ka ho hlahloba polelo ea 'Result + "(ObjC Class EH) " + Name.str()'. Letšoao.cpp 38
  • V655 [CWE-480] Likhoele li ne li kopantsoe empa ha li sebelisoe. Nahana ka ho hlahloba polelo ea 'Result + "(ObjC IVar)" + Name.str()'. Letšoao.cpp 41

Ka phoso, ho sebelisoa +=opareitara sebakeng sa +=opareitara. Phello ke meralo e se nang moelelo.

Fragment N21: Boitšoaro bo sa hlalosoang

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

Leka ho fumana khoutu e kotsi ka bouena. 'Me sena ke setšoantšo se ka sitisang tlhokomelo e le hore u se ke ua sheba karabo hang-hang:

Ho fumana likokoana-hloko ho LLVM 8 ho sebelisa analyzer ea PVS-Studio

Tlhokomeliso ea PVS-Studio: V708 [CWE-758] Ho sebelisoa kaho e kotsi: 'FeaturesMap[Op] = FeaturesMap.size()', moo 'FeaturesMap' e leng ea sehlopha sa 'mapa'. Sena se ka lebisa boitšoarong bo sa hlalosoang. RISCVCompressInstEmitter.cpp 490

Tsela ea bothata:

FeaturesMap[Op] = FeaturesMap.size();

Haeba element Op ha e fumanehe, ebe ntho e ncha e etsoa 'mapeng' me palo ea likarolo tse 'mapeng ona e ngotsoe moo. Ha ho tsejoe feela hore na mosebetsi o tla bitsoa boholo pele kapa ka mora ho kenya elemente e ncha.

Sekhechana sa N22-N24: Likabelo tse phetoang

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

Tlhokomeliso ea PVS-Studio: V519 [CWE-563] Mofuta oa 'NType' o abeloa litekanyetso habeli ka tatellano. Mohlomong sena ke phoso. Sheba mela: 1663, 1664. MachOObjectFile.cpp 1664

Ha ke nahane hore ho na le phoso ea sebele mona. Kabelo feela e sa hlokahaleng khafetsa. Empa e ntse e le phoso.

Ka mokhoa o ts'oanang:

  • V519 [CWE-563] Mofuta oa 'B.NDesc' o abeloa litekanyetso habeli ka tatellano. Mohlomong sena ke phoso. Sheba mela: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Phapang e abeloa litekanyetso habeli ka tatellano. Mohlomong sena ke phoso. Sheba mela: 59, 61. coff2yaml.cpp 61

Fragment N25-N27: Likabelo tse ling hape

Joale a re shebeng mofuta o fapaneng hanyane oa reassignment.

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

Tlhokomeliso ea PVS-Studio: V519 [CWE-563] Phapang ea 'Alignment' e abeloa litekanyetso habeli ka tatellano. Mohlomong sena ke phoso. Sheba mela: 1158, 1160. LoadStoreVectorizer.cpp 1160

Ena ke khoutu e makatsang haholo eo ho hlakileng hore e na le phoso e utloahalang. Qalong, fetoha lolamisiwa boleng bo abeloa ho latela maemo. 'Me joale kabelo e etsahala hape, empa joale ntle le cheke.

Maemo a tšoanang a ka bonoa mona:

  • V519 [CWE-563] Phapang ea 'Effects' e abeloa litekanyetso habeli ka tatellano. Mohlomong sena ke phoso. Sheba mela: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Mofuta oa 'ExpectNoDerefChunk' o abeloa litekanyetso habeli ka tatellano. Mohlomong sena ke phoso. Sheba mela: 4970, 4973. SemaType.cpp 4973

Fragment N28: Boemo ba 'nete kamehla

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

Tlhokomeliso ea PVS-Studio: V547 [CWE-571] Expression 'nextByte != 0x90' ke 'nete kamehla. X86DisassemblerDecoder.cpp 379

Ho hlahloba ha ho utloahale. E fetohang latelangByte kamehla ha e lekane le boleng 0x90, e latelang ho tsoa cheke e fetileng. Ena ke mofuta o itseng oa phoso e utloahalang.

Fragment N29 - N...: Maemo a kamehla a nnete/a bohata

Analyzer e fana ka litemoso tse ngata tsa hore boemo bohle (V547) kapa karolo ea eona (V560) ke nnete kapa leshano kamehla. Hangata tsena ha se liphoso tsa 'nete, empa ke khoutu e bohlasoa feela, sephetho sa katoloso e kholo, le tse ling tse joalo. Leha ho le joalo, hoa utloahala ho sheba litemoso tsena kaofela, kaha liphoso tsa sebele tse utloahalang li etsahala nako le nako. Ka mohlala, karolo ena ea khoutu e belaella:

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

Tlhokomeliso ea PVS-Studio: V560 [CWE-570] Karolo ea polelo ea maemo e lula e le leshano: RegNo == 0xe. ARMDisassembler.cpp 939

0xE ea kamehla ke boleng ba 14 ho decimal. Tlhahlobo RegNo == 0xe ha e utloahale hobane haeba RegNo> 13, joale ts'ebetso e tla phethela ts'ebetso ea eona.

Ho bile le litemoso tse ling tse ngata ka li-ID V547 le V560, empa joalo ka V595, ke ne ke sa thahaselle ho ithuta litemoso tsena. E ne e se e hlakile hore ke na le boitsebiso bo lekaneng ba ho ngola sehlooho :). Ka hona, ha ho tsejoe hore na ke liphoso tse kae tsa mofuta ona tse ka khetholloang ho LLVM ho sebelisa PVS-Studio.

Ke tla u fa mohlala oa hore na ke hobane'ng ha ho ithuta lintho tse susumetsang tsena ho tena. Analyzer e nepahetse ka ho feletseng ha e fana ka temoso bakeng sa khoutu e latelang. Empa sena hase phoso.

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

Tlhokomeliso ea PVS-Studio: V547 [CWE-570] Expression '!HasError' e lula e le leshano. UnwrappedLineParser.cpp 1635

Fragment N30: ​​Ho khutla ho belaetsang

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

Tlhokomeliso ea PVS-Studio: V612 [CWE-670] 'Ho khutla' ho sa hlokahaleng ka har'a lupu. R600OptimizeVectorRegisters.cpp 63

Ena ke phoso kapa mokhoa o itseng o reretsoeng ho hlalosetsa baetsi ba mananeo ba balang khoutu. Moralo ona ha o ntlhalosetse letho mme o shebahala o belaela haholo. Ho molemo hore u se ke ua ngola joalo :).

O khathetse? Joale ke nako ea ho etsa tee kapa kofi.

Ho fumana likokoana-hloko ho LLVM 8 ho sebelisa analyzer ea PVS-Studio

Mefokolo e khetholloang ke litlhahlobo tse ncha

Ke nahana hore ts'ebetso ea 30 ea tlhahlobo ea khale e lekane. Ha re boneng hore na ke lintho life tse khahlisang tse ka fumanoang ka tlhahlobo e ncha e hlahileng ho analyzer kamora moo pejana licheke. Nakong ena, kakaretso ea 66 ea tlhahlobo ea sepheo se akaretsang e ile ea eketsoa ho mohlahlobi oa C ++.

Sekhechana sa N31: Khoutu e sa fihlelleheng

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

Tlhokomeliso ea PVS-Studio: V779 [CWE-561] Khoutu e sa fihlelleheng e fumanwe. Ho ka etsahala hore ebe phoso e teng. ExecutionUtils.cpp 146

Joalokaha u ka bona, makala ka bobeli a opareitara if e qetella ka mohala o yang ho opareitara khutlele. Ka lebaka leo, setshelo CtorDtorsByPriority e ke ke ea hlakoloa.

Sekhechana sa N32: Khoutu e sa fihlelleheng

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

Tlhokomeliso ea PVS-Studio: V779 [CWE-561] Khoutu e sa fihlelleheng e fumanoe. Ho ka etsahala hore ebe phoso e teng. LLParser.cpp 835

Boemo bo khahlisang. Ha re shebeng sebaka sena pele:

return ParseTypeIdEntry(SummaryID);
break;

Ha u sheba ka lekhetlo la pele, ho bonahala eka ha ho na phoso mona. E shebahala joaloka opareitara khefu ho na le e 'ngoe mona,' me u ka e hlakola feela. Leha ho le joalo, hase bohle ba bonolo hakaalo.

Analyzer e fana ka temoso meleng:

Lex.setIgnoreColonInIdentifiers(false);
return false;

'Me ka sebele, khoutu ena ha e fumanehe. Linyeoe tsohle ka fapoha e qetella ka mohala o tsoang ho opareitara khutlele. 'Me joale ke se nang kelello feela khefu ha e shebahale e se kotsi hakaalo! Mohlomong e 'ngoe ea makala e lokela ho fela ka khefu, eseng on khutlele?

Fragment N33: Ho tsosolosa ka tšohanyetso ha likotoana tse phahameng

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

Tlhokomeliso ea PVS-Studio: V784 Boholo ba maske hanyane bo tlase ho feta boholo ba operand ea pele. Sena se tla baka tahlehelo ea li-bits tse phahameng. RuntimeDyld.cpp 815

Ka kopo hlokomela hore ts'ebetso getStubAlignment mofuta oa ho khutlisa E sa ngolisoeng. Ha re bale boleng ba polelo, re nka hore mosebetsi o khutlisa boleng ba 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

Joale hlokomela hore ho feto-fetoha DataSize e na le mofuta o sa ngolisoang oa 64-bit. Hoa etsahala hore ha o etsa ts'ebetso ea DataSize & 0xFFFFFFF8u, likotoana tsohle tse mashome a mararo a metso e 'meli tse phahameng li tla khutlisetsoa ho zero. Ho ka etsahala hore sena ha se seo moqapi oa mananeo a neng a se batla. Ke belaela hore o ne a batla ho bala: DataSize & 0xFFFFFFFFFFFFFFFFF8u.

Ho lokisa phoso, o lokela ho ngola sena:

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

Kapa ho joalo:

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

Sekhechana sa N34: Sekhechana sa mofuta o hlakileng se hlolehileng

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

Tlhokomeliso ea PVS-Studio: V1028 [CWE-190] Ho ka etsahala ho khaphatseha. Nahana ka ho etsa mesebetsi ea 'NumElts * Scale' ho mofuta oa 'size_t', eseng sephetho. X86ISelLowering.h 1577

Mofuta o hlakileng oa ho lahlela o sebelisoa ho qoba ho tlala ha o atisa mefuta e fapaneng eth. Leha ho le joalo, mofuta o hlakileng oa ho lahlela mona ha o sireletse khahlanong le ho tlala. Taba ea pele, liphapang li tla ata, 'me ke ka nako eo feela sephetho sa 32-bit sa ho atisa se tla atolosoa ho mofuta. boholo_t.

Sekhechana sa N35: E hlolehile ho Copy-Paste

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] Ho ile ha fumanoa likaroloana tse peli tse tšoanang tsa khoutu. Mohlomong, ona ke typo mme phapano ea 'Op1' e lokela ho sebelisoa sebakeng sa 'Op0'. InstCombineCompares.cpp 5507

Tlhahlobo ena e ncha e thahasellisang e khetholla maemo ao ho 'ona sengoathoana sa khoutu se kopilitsoeng' me mabitso a mang ho sona a qalile ho fetoloa, empa sebakeng se le seng ha baa ka ba se lokisa.

Ka kopo hlokomela hore bolokong ba bobeli ba fetohile Op0 mabapi le Op1. Empa sebakeng se seng ha baa ka ba e lokisa. Ho ka etsahala hore ebe e ngotsoe tjena:

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

Sekhechana sa N36: Pherekano e Fetohang

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

Tlhokomeliso ea PVS-Studio: V1001 [CWE-563] Mofuta oa 'Mode' o abetsoe empa ha o sebelisoe qetellong ea tšebetso. SIModeRegister.cpp 48

Ho kotsi haholo ho fana ka likhang tsa tšebetso ka mabitso a tšoanang le a litho tsa sehlopha. Ho bonolo haholo ho ferekana. Re na le nyeoe e joalo ka pel'a rona. Polelo ena ha e utloahale:

Mode &= Mask;

Tlhaloso ea ts'ebetso e fetoha. Ke phetho. Khang ena ha e sa sebelisoa. Mohlomong u ka be u e ngotse tjena:

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

Sekhechana sa N37: Pherekano e Fetohang

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

Tlhokomeliso PVS-Studio: V1001 [CWE-563] Mofuta oa 'Size' o abetsoe empa ha o sebelisoe qetellong ea mosebetsi. Ntho.cpp 424

Boemo bo tšoana le ba pele. E lokela ho ngoloa:

this->Size += this->EntrySize;

Fragment N38-N47: Ba lebetse ho hlahloba index

Nakong e fetileng, re ile ra sheba mehlala ea ts'oaetso ea ho hlahloba V595. Moko wa yona ke hore sesupo ha se hlalosoe qalong, ebe se hlahlojwa feela. Litlhahlobo tsa bacha V1004 e fapane ka moelelo, empa hape e senola liphoso tse ngata. E hlwaya maemo ao ho ona sesupa se ileng sa hlahlojwa qalong mme sa lebala ho se etsa. Ha re shebeng linyeoe tse joalo tse fumanehang ka har'a 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());  // <=
  ....
}

Tlhokomeliso ea PVS-Studio: V1004 [CWE-476] 'Ptr' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Hlahloba mela: 729, 738. TargetTransformInfoImpl.h 738

E fapaneng Tšoaea e ka lekana nullptr, joalokaha ho pakoa ke cheke:

if (Ptr != nullptr)

Leha ho le joalo, ka tlase ho pointer ena ha e sebelisoe ntle le tlhahlobo ea pele:

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

A re hlahlobeng taba e ’ngoe e tšoanang.

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

Tlhokomeliso ea PVS-Studio: V1004 [CWE-476] 'FD' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Sheba mela: 3228, 3231. CGDebugInfo.cpp 3231

Ela hloko pontšo FD. Ke kholisehile hore bothata bo bonahala ka ho hlaka 'me ha ho hlokahale tlhaloso e khethehileng.

Le ho feta:

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

Tlhokomeliso ea PVS-Studio: V1004 [CWE-476] 'PtrTy' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Hlahloba mela: 960, 965. InterleavedLoadCombinePass.cpp 965

U ka itšireletsa joang liphosong tse joalo? E-ba hlokolosi haholoanyane ho Code-Review 'me u sebelise static analyzer ea PVS-Studio ho hlahloba khoutu ea hau khafetsa.

Ha ho na thuso ho qotsa likaroloana tse ling tsa khoutu tse nang le liphoso tsa mofuta ona. Ke tla siea feela lethathamo la litemoso sehloohong sena:

  • V1004 [CWE-476] 'Expr' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Sheba mela: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] 'PI' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Sheba mela: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] 'StatepointCall' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Sheba mela: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] 'RV' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Sheba mela: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] 'CalleeFn' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Sheba mela: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] 'TC' pointer e sebelisitsoe ka mokhoa o sa sireletsehang ka mor'a hore e netefatsoe khahlanong le nullptr. Sheba mela: 1819, 1824. Driver.cpp 1824

Fragment N48-N60: Ha e nyatsehe, empa ke sekoli (leak e ka bang teng ea memori)

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

Tlhokomeliso ea PVS-Studio: V1023 [CWE-460] Sesupa se se nang monga sona se kenngwa setshelong sa 'Strategies' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-isel-fuzzer.cpp 58

Ho kenya elemente qetellong ea setshelo joalo ka std::vector > o ka se ngole feela xxx.push_back(X e ncha), kaha ha ho na phetoho e hlakileng ho tloha X* в std::ikhetha_ptr.

Tharollo e tloaelehileng ke ho ngola xxx.emplace_back(X e ncha)kaha e bokella: mokhoa emplace_back e aga elemente ka tlhamalalo go tswa mo dikganetsanong tsa yona mme ka jalo a ka dirisa ditlhagi tse di tlhapileng.

Ha e bolokehe. Haeba vector e tletse, joale memori e abeloa hape. Ts'ebetso ea kabo ea memori e kanna ea hloleha, ho baka hore ho be le mokhelo std::bad_alloc. Tabeng ena, pointer e tla lahleha mme ntho e entsoeng e ke ke ea hlakoloa.

Tharollo e sireletsehileng ke ho theha unique_ptre tla ba mong'a pointer pele vector e leka ho fetisetsa mohopolo hape:

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

Ho tloha ka C++14, o ka sebelisa 'std::make_unique':

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

Mofuta ona oa bofokoli ha o bohlokoa ho LLVM. Haeba memori e ke ke ea fanoa, moqapi o tla emisa feela. Leha ho le joalo, bakeng sa likopo tse nang le nako e telele uptime, e ke keng ea emisa feela haeba kabo ea memori e hloleha, sena e ka ba phoso e mpe.

Kahoo, leha khoutu ena e sa hlahise tšokelo e sebetsang ho LLVM, ke fumane ho le molemo ho bua ka mokhoa ona oa phoso le hore mohlahlobi oa PVS-Studio o ithutile ho e tseba.

Litemoso tse ling tsa mofuta ona:

  • V1023 [CWE-460] Sesupa se se nang monga sona se kenyelletswa setshelong sa 'Passes' ka mokgwa wa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. PassManejara.h 546
  • V1023 [CWE-460] Sesupa se se nang monga sona se kenyelletswa setshelong sa 'AAs' ka mokgwa wa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. AliasAnalysis.h 324
  • V1023 [CWE-460] Sesupa se se nang mong'a se kenyelletsoa ka har'a sets'oants'o sa 'Entries' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] Sesupa se se nang monga sona se kenyelletswa setshelong sa 'AllEdges' ka mokgwa wa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. CFGMST.h 268
  • V1023 [CWE-460] Sesupa se se nang mong'a se kenyeletsoa sejaneng sa 'VMaps' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Sesupa se se nang mong'a se kenyeletsoa ka har'a sets'oants'o sa 'Records' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. FDRLogBuilder.h 30
  • V1023 [CWE-460] Sesupa se se nang monga sona se kenngwa setshelong sa 'PendingSubmodules' ka mokgwa wa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. ModuleMap.cpp 810
  • V1023 [CWE-460] Sesupa se se nang monga sona se kenyelletswa setshelong sa 'Objects' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. DebugMap.cpp 88
  • V1023 [CWE-460] Sesupa se se nang monga sona se kenngwa setshelong sa 'Strategies' ka mokgwa wa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 685
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 686
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 688
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 689
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 690
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 691
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 692
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 693
  • V1023 [CWE-460] Sesupa se se nang mong'a se eketsoa ka har'a sets'oants'o sa 'Modifiers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. llvm-stress.cpp 694
  • V1023 [CWE-460] Sesupa se se nang mong'a se kenyeletsoa ho sets'oants'o sa 'Operands' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] Sesupa se se nang mong'a se kenyelletsoa ka har'a sets'oants'o sa 'Stash' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] Sesupa se se nang mong'a se kenyelletsoa ka har'a sets'oants'o sa 'Matchers' ka mokhoa oa 'emplace_back'. Ho tla ba le ho dutla ha memori haeba ho ka ba le mokgelo. GlobalISelEmitter.cpp 2702

fihlela qeto e

Ke ile ka fana ka litemoso tse 60 ka kakaretso eaba kea emisa. Na ho na le liphoso tse ling tseo mohlahlobi oa PVS-Studio a li fumanang ho LLVM? E, ke entse joalo. Leha ho le joalo, ha ke ntse ke ngola likhechana tsa khoutu bakeng sa sengoloa, e ne e se e le mantsiboea, kapa ho feta bosiu, 'me ke ile ka etsa qeto ea hore ke nako ea ho e bitsa letsatsi.

Ke tšepa hore u e fumane e thahasellisa 'me u tla batla ho leka PVS-Studio analyzer.

U ka khoasolla analyzer 'me u fumane senotlolo sa minesweeper ho leqepheng lena.

Habohlokoa ka ho fetisisa, sebelisa tlhahlobo e tsitsitseng kamehla. Licheke tsa nako e le 'ngoe, e entsoeng ke rona e le ho phatlalatsa mokhoa oa ho hlahloba static le PVS-Studio ha se boemo bo tloaelehileng.

Mahlohonolo a ho ntlafatsa boleng le ts'epahalo ea khoutu ea hau!

Ho fumana likokoana-hloko ho LLVM 8 ho sebelisa analyzer ea PVS-Studio

Haeba u batla ho arolelana sengoloa sena le bamameli ba buang Senyesemane, ka kopo sebelisa sehokelo sa phetolelo: Andrey Karpov. Ho fumana Litšitšili ho LLVM 8 ka PVS-Studio.

Source: www.habr.com

Eketsa ka tlhaloso