Milarian bug dina LLVM 8 nganggo analisa PVS-Studio

Milarian bug dina LLVM 8 nganggo analisa PVS-Studio
Langkung ti dua taun parantos kapengker ti pamariksaan kode terakhir tina proyék LLVM nganggo analisa PVS-Studio kami. Hayu urang pastikeun yén analisa PVS-Studio masih mangrupikeun alat utama pikeun ngaidentipikasi kasalahan sareng poténsi kerentanan. Jang ngalampahkeun ieu, urang bakal pariksa jeung manggihan kasalahan anyar dina release LLVM 8.0.0.

Artikel anu bakal ditulis

Jujur, kuring henteu hoyong nyerat tulisan ieu. Éta henteu pikaresepeun pikeun nyerat ngeunaan proyék anu parantos kami pariksa sababaraha kali (1, 2, 3). Éta hadé nulis ngeunaan hal anyar, tapi kuring teu boga pilihan.

Unggal waktos versi anyar LLVM dileupaskeun atanapi diropéa Clang Statis Analyzer, kami nampi patarosan tina jinis ieu dina surat kami:

Tingali, versi anyar Clang Static Analyzer parantos diajar mendakan kasalahan énggal! Sigana mah yén relevansi ngagunakeun PVS-Studio ieu nurun. Clang mendakan langkung seueur kasalahan tibatan sateuacanna sareng nangkep kamampuan PVS-Studio. Kumaha saur anjeun ngeunaan ieu?

Pikeun ieu kuring sok hoyong ngajawab sapertos kieu:

Kami ogé henteu cicing! Kami parantos ningkat sacara signifikan kamampuan analisa PVS-Studio. Janten tong hariwang, urang teraskeun mimpin sapertos sateuacana.

Hanjakal, ieu téh jawaban goréng. Teu aya buktina. Sareng éta naha kuring nyerat tulisan ieu ayeuna. Janten, proyék LLVM parantos dipariksa deui sareng aya sababaraha kasalahan di jerona. Ayeuna kuring bakal nunjukkeun anu sigana pikaresepeun pikeun kuring. Clang Static Analyzer teu tiasa mendakan kasalahan ieu (atanapi teu pikaresepeun pisan pikeun ngalakukeunana kalayan bantosanana). Tapi urang tiasa. Sumawona, kuring mendakan sareng nyerat sadaya kasalahan ieu dina hiji wengi.

Tapi nulis artikel butuh sababaraha minggu. Kuring ngan teu bisa mawa diri nempatkeun sagala ieu kana téks :).

Ku jalan kitu, upami anjeun resep téknologi naon anu dianggo dina analisa PVS-Studio pikeun ngaidentipikasi kasalahan sareng kerentanan poténsial, maka kuring nyarankeun pikeun ngenalkeun ieu. Catetan.

Diagnostik anyar sareng lami

Sakumaha anu parantos dicatet, sakitar dua taun ka pengker proyék LLVM sakali deui dipariksa, sareng kasalahan anu dipendakan dilereskeun. Ayeuna tulisan ieu bakal nampilkeun sakumpulan kasalahan énggal. Naha bug anyar kapanggih? Aya 3 alesan pikeun ieu:

  1. Proyék LLVM ngembang, ngarobih kodeu lami sareng nambihan kode énggal. Alami, aya kasalahan anyar dina kode dirobah sarta ditulis. Ieu jelas nunjukkeun yén analisis statik kedah dianggo sacara teratur, sareng henteu aya kalana. Tulisan kami nunjukkeun kamampuan analisa PVS-Studio, tapi ieu teu aya hubunganana sareng ningkatkeun kualitas kode sareng ngirangan biaya ngalereskeun kasalahan. Anggo analisa kode statik sacara teratur!
  2. Kami ngabéréskeun sareng ningkatkeun diagnostik anu tos aya. Ku alatan éta, analisa tiasa ngaidentipikasi kasalahan anu henteu perhatikeun nalika scan sateuacana.
  3. Diagnostik anyar parantos muncul dina PVS-Studio anu henteu aya 2 sababaraha taun ka pengker. Kuring mutuskeun pikeun nyorot aranjeunna dina bagian anu misah pikeun jelas nunjukkeun pamekaran PVS-Studio.

Cacad anu diidentipikasi ku diagnostik anu aya 2 taun ka pengker

Fragmen N1: Salin-témpél

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

Peringatan PVS-Studio: V501 [CWE-570] Aya sub-ekspresi idéntik 'Name.startswith("avx512.mask.permvar.")' ka kénca jeung ka katuhu tina '||' operator. AutoUpgrade.cpp 73

Ieu ganda dipariksa yén ngaran dimimitian ku substring "avx512.mask.permvar.". Dina cek kadua, aranjeunna écés hayang nulis hal sejenna, tapi poho pikeun ngabenerkeun téks tiron.

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

Awas PVS-Studio: V501 Aya sub-ekspresi idéntik 'CXNameRange_WantQualifier' ka kénca jeung ka katuhu tina '|' operator. CIndex.cpp 7245

Alatan salah ketik, konstanta ngaranna sarua dipaké dua kali CXNameRange_WantQualifier.

Fragmen N3: Kabingungan jeung precedence operator

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

Peringatan PVS-Studio: V502 [CWE-783] Panginten operator '?:' tiasa dianggo dina cara anu béda ti anu disangka. Operator '?:' boga prioritas leuwih handap ti operator '=='. PPCTargetTransformInfo.cpp 404

Dina pamanggih kuring, ieu téh kasalahan geulis pisan. Sumuhun, abdi terang abdi gaduh gagasan aneh ngeunaan kageulisan :).

Ayeuna, nurutkeun prioritas operator, éksprési dievaluasi saperti kieu:

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

Tina sudut pandang praktis, kaayaan sapertos kitu henteu masuk akal, sabab tiasa diréduksi jadi:

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

Ieu kasalahan jelas. Paling dipikaresep, maranéhna hayang ngabandingkeun 0/1 kalawan variabel daptar eusi. Pikeun ngalereskeun kodeu anjeun kedah nambihan kurung dina operator ternary:

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

Ku jalan kitu, operator ternary pisan bahaya sarta provokes kasalahan logis. Ati-ati pisan sareng ulah rakus ku kurung. Kuring nempo topik ieu dina leuwih jéntré di dieu, dina bab "Awas kana ?: Operator sareng Ngalampirkeun Dina Kurung."

Fragmén 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;
  }
  ....
}

Peringatan PVS-Studio: V522 [CWE-476] Dereferencing tina null pointer 'LHS' bisa lumangsung. TGParser.cpp 2152

Lamun pointer LHS nyaeta null, warning kudu dikaluarkeun. Sanajan kitu, gantina, null pointer sarua ieu bakal dereferenced: LHS->getAsString().

Ieu mangrupikeun kaayaan anu khas nalika kasalahan disumputkeun dina panangan kasalahan, sabab teu aya anu nguji aranjeunna. Analis statik mariksa sadaya kode anu tiasa dicapai, henteu paduli sabaraha sering éta dianggo. Ieu mangrupikeun conto anu saé kumaha analisis statik ngalengkepan tés sareng téknik panyalindungan kasalahan anu sanés.

Kasalahan penanganan pointer anu sami HRH diwenangkeun dina kode ngan handap: V522 [CWE-476] Dereferencing tina null pointer 'RHS' bisa lumangsung. TGParser.cpp 2186

Fragmen N6: Ngagunakeun pointer sanggeus pindah

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

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

PVS-Studio Warning: V522 [CWE-476] Dereferencing tina null pointer 'ProgClone' bisa lumangsung. Mikompilasi.cpp 601

Dina awal pointer pinter ProgClone ceases boga obyék:

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

Kanyataanna, ayeuna ProgClone mangrupakeun pointer null. Ku alatan éta, null pointer dereference kedah lumangsung ngan handap:

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

Tapi, dina kanyataanana, ieu moal kajadian! Catet yén loop henteu leres-leres dieksekusi.

Dina awal wadahna MicompiledFunctions diberesihan:

MiscompiledFunctions.clear();

Salajengna, ukuran wadahna ieu dianggo dina kaayaan loop:

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

Gampang ningali yén loop henteu ngamimitian. Jigana ieu ogé bug jeung kode kudu ditulis béda.

Sigana mah urang geus encountered yén parity kawentar kasalahan! Hiji kasalahan topeng sejen :).

Fragmen N7: Ngagunakeun pointer sanggeus pindah

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

PVS-Studio warning: V522 [CWE-476] Dereferencing tina null pointer 'Test' bisa lumangsung. Kasalahan.cpp 709

Kaayaan nu sarua deui. Mimitina, eusi obyék dialihkeun, teras dianggo saolah-olah teu aya kajadian. Kuring ningali kaayaan ieu beuki sering dina kode program sanggeus semantik gerakan mucunghul dina C ++. Ieu naha Abdi bogoh C ++ basa! Aya beuki loba cara anyar pikeun némbak suku anjeun sorangan. The PVS-Studio analyzer bakal salawasna boga gawé :).

Fragmén N8: Null pointer

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

PVS-Studio warning: V522 [CWE-476] Dereferencing tina null pointer 'Tipe' bisa lumangsung. PrettyFunctionDumper.cpp 233

Salian panangan kasalahan, debugging fungsi printout biasana teu diuji. Kami gaduh kasus sapertos kitu sateuacan urang. Fungsina ngantosan pangguna, anu, tibatan ngarengsekeun masalahna, bakal kapaksa ngalereskeunana.

Bener:

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

Fragmén N9: Null pointer

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

PVS-Studio warning: V522 [CWE-476] Dereferencing tina null pointer 'Ty' bisa lumangsung. SearchableTableEmitter.cpp 614

Jigana sagalana jelas tur teu merlukeun katerangan.

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

Peringatan PVS-Studio: V570 Variabel 'Identifier-> Type' ditugaskeun ka dirina. FormatTokenLexer.cpp 249

Taya titik dina assigning variabel ka sorangan. Paling dipikaresep maranéhna hayang nulis:

Identifier->Type = Question->Type;

Fragmen N11: putus curiga

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

Peringatan PVS-Studio: V622 [CWE-478] Mertimbangkeun inspecting pernyataan 'switch'. Aya kamungkinan yén operator 'kasus' munggaran leungit. SystemZAsmParser.cpp 652

Aya operator pisan curiga di awal peunggas. Naha anjeun hilap nyerat anu sanés di dieu?

Fragmen N12: Mariksa pointer sanggeus dereferencing

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

Peringatan PVS-Studio: V595 [CWE-476] Pointer 'Callee' dianggo sateuacan diverifikasi ngalawan nullptr. Pariksa garis: 172, 174. AMDGPUInline.cpp 172

Указатель Callee di awal ieu dereferenced dina waktos fungsi disebut meunangTTI.

Lajeng tétéla yén pointer ieu kudu dipariksa pikeun sarua nullptr:

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

Tapi éta telat…

Fragmen N13 - N...: Mariksa pointer sanggeus dereferencing

Kaayaan anu dibahas dina sempalan kode saméméhna henteu unik. Nembongan di dieu:

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

PVS-Studio warning: V595 [CWE-476] The 'CalleeFn' pointer ieu garapan saméméh éta diverifikasi ngalawan nullptr. Pariksa garis: 1079, 1081. SimplifyLibCalls.cpp 1079

Sareng di dieu:

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

PVS-Studio warning: V595 [CWE-476] The 'ND' pointer dipaké saméméh éta diverifikasi ngalawan nullptr. Pariksa baris: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Sareng di dieu:

  • V595 [CWE-476] Pointer 'U' dianggo sateuacan diverifikasi ngalawan nullptr. Pariksa garis: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Pointer 'ND' dianggo sateuacan diverifikasi ngalawan nullptr. Pariksa baris: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Lajeng abdi janten uninterested diajar warnings kalawan nomer V595. Janten kuring henteu terang upami aya deui kasalahan anu sami salian ti anu didaptarkeun di dieu. Paling dipikaresep aya.

Fragmén N17, N18: shift curiga

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

Peringatan PVS-Studio: V629 [CWE-190] Pertimbangkeun mariksa ekspresi '~ (Ukuran - 1) << 1'. Bit shifting tina nilai 32-bit jeung ékspansi saterusna kana tipe 64-bit. AArch64AddressingModes.h 260

Bisa jadi teu bug jeung kode jalan persis sakumaha dimaksud. Tapi ieu jelas tempat anu curiga pisan sareng kedah dipariksa.

Hayu urang nyebutkeun variabel ukuran sarua jeung 16, lajeng panulis kode rencanana pikeun meunangkeun eta dina variabel NImms nilai:

1111111111111111111111111111111111111111111111111111111111100000

Sanajan kitu, dina kanyataanana hasilna bakal kieu:

0000000000000000000000000000000011111111111111111111111111100000

Kanyataan yén sadaya itungan lumangsung ngagunakeun tipe unsigned 32-bit. Sarta ngan lajeng, tipe unsigned 32-bit ieu bakal implicitly dimekarkeun pikeun uint64_t. Dina hal ieu, bit paling signifikan bakal nol.

Anjeun tiasa ngalereskeun kaayaan sapertos kieu:

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

Kaayaan anu sami: V629 [CWE-190] Pertimbangkeun mariksa ekspresi 'Immr << 6'. Bit shifting tina nilai 32-bit jeung ékspansi saterusna kana tipe 64-bit. AArch64AddressingModes.h 269

Fragmen N19: Leungit kecap konci lamun henteu?

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

Peringatan PVS-Studio: V646 [CWE-670] Mertimbangkeun inspecting logika aplikasi urang. Aya kamungkinan yén kecap konci 'lain' leungit. AMDGPUAsmParser.cpp 5655

Teu aya kasalahan di dieu. Saprak harita-blok kahiji if ditungtungan ku terus, teras henteu masalah, aya kecap konci lamun henteu atanapi henteu. Barina ogé, kodeu bakal dianggo sami. Masih sono lamun henteu ngajadikeun kodeu beuki teu jelas tur bahaya. Lamun ka hareup terus disappears, kode bakal ngamimitian gawé lengkep béda. Dina pamadegan mah leuwih hade pikeun nambahkeun lamun henteu.

Fragmén N20: Opat typos tina tipe sarua

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

Peringatan PVS-Studio:

  • V655 [CWE-480] Senar dihijikeun tapi henteu dianggo. Mertimbangkeun inspecting éksprési 'Hasil + Name.str ()'. Lambang.cpp 32
  • V655 [CWE-480] Senar dihijikeun tapi henteu dianggo. Mertimbangkeun inspecting 'Hasil + "(ObjC Kelas)" + Name.str () 'ekspresi. Simbol.cpp 35
  • V655 [CWE-480] Senar dihijikeun tapi henteu dianggo. Mertimbangkeun inspecting 'Hasil + "(ObjC Kelas EH) " + Name.str () 'ekspresi. Lambang.cpp 38
  • V655 [CWE-480] Senar dihijikeun tapi henteu dianggo. Mertimbangkeun inspecting 'Hasil + "(ObjC IVar)" + Name.str () 'ekspresi. Lambang.cpp 41

Ku teu kahaja, operator + dipaké gaganti operator +=. Hasilna nyaéta desain anu teu aya hartina.

Fragmen N21: kabiasaan undefined

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

Coba pikeun manggihan sorangan kode bahaya. Sareng ieu mangrupikeun gambar pikeun ngaganggu perhatian supados henteu langsung ningali jawabanna:

Milarian bug dina LLVM 8 nganggo analisa PVS-Studio

Peringatan PVS-Studio: V708 [CWE-758] konstruksi picilakaeun dipaké: 'FeaturesMap [Op] = FeaturesMap.size () ', dimana 'FeaturesMap' mangrupa kelas 'peta'. Ieu bisa ngakibatkeun kabiasaan undefined. RISCVCompressInstEmitter.cpp 490

Garis masalah:

FeaturesMap[Op] = FeaturesMap.size();

Lamun unsur Op teu kapanggih, lajeng unsur anyar dijieun dina peta sarta jumlah elemen dina peta ieu ditulis aya. Ieu ngan kanyahoan naha fungsi bakal disebut ukuran saméméh atawa sanggeus nambahkeun unsur anyar.

Fragmen N22-N24: ngulang assignments

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

Peringatan PVS-Studio: V519 [CWE-563] Variabel 'NType' ditugaskeun nilai dua kali berturut-turut. Sugan ieu kasalahan. Pariksa garis: 1663, 1664. MachOObjectFile.cpp 1664

Ku teu sangka aya kasalahan nyata di dieu. Ngan hiji tugas diulang teu perlu. Tapi tetep blunder.

Kitu ogé:

  • V519 [CWE-563] Variabel 'B.NDesc' ditugaskeun nilai dua kali berturut-turut. Sugan ieu kasalahan. Pariksa garis: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Variabel ditugaskeun nilai dua kali berturut-turut. Sugan ieu kasalahan. Pariksa garis: 59, 61. coff2yaml.cpp 61

Fragmen N25-N27: Langkung reassignments

Ayeuna hayu urang tingali versi reassignment anu rada béda.

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

Peringatan PVS-Studio: V519 [CWE-563] Variabel 'Alignment' ditugaskeun nilai dua kali berturut-turut. Sugan ieu kasalahan. Pariksa garis: 1158, 1160. LoadStoreVectorizer.cpp 1160

Ieu kode pisan aneh nu tétéla ngandung kasalahan logis. Dina awalna, variabel alignment nilai a ditugaskeun gumantung kana kaayaan. Lajeng ngerjakeun lumangsung deui, tapi ayeuna tanpa dipariksa nanaon.

Kaayaan anu sami tiasa ditingali di dieu:

  • V519 [CWE-563] Variabel 'Pangaruh' ditugaskeun nilai dua kali berturut-turut. Sugan ieu kasalahan. Pariksa garis: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Variabel 'ExpectNoDerefChunk' ditugaskeun nilai dua kali berturut-turut. Sugan ieu kasalahan. Pariksa garis: 4970, 4973. SemaType.cpp 4973

Fragmen N28: Salawasna kaayaan leres

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

Peringatan PVS-Studio: V547 [CWE-571] Ekspresi 'nextByte != 0x90' salawasna leres. X86DisassemblerDecoder.cpp 379

Mariksa teu asup akal. Variabel nextByte salawasna teu sarua jeung nilai 0x90, nu kieu ti cék saméméhna. Ieu sababaraha jenis kasalahan logis.

Fragmen N29 - N ...: Salawasna leres / kaayaan salah

Analis ngaluarkeun seueur peringatan yén sadaya kaayaan (V547) atawa bagianana (V560) sok bener atawa salah. Mindeng ieu teu kasalahan nyata, tapi ngan kode beca, hasil ékspansi makro, jeung sajabana. Nanging, masuk akal pikeun ningali sadaya peringatan ieu, sabab kasalahan logis anu asli lumangsung ti jaman ka jaman. Contona, bagian kode ieu curiga:

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

Peringatan PVS-Studio: V560 [CWE-570] Bagian tina ekspresi kondisional sok palsu: RegNo == 0xe. ARMDisassembler.cpp 939

Konstanta 0xE nyaéta nilai 14 dina decimal. Pamariksaan RegNo == 0xe teu asup akal sabab lamun Nomer Reg > 13, teras fungsi bakal ngalengkepan palaksanaan na.

Aya loba warnings séjén kalawan ID V547 na V560, tapi sakumaha kalayan V595, Kuring teu kabetot dina diajar warnings ieu. Éta parantos jelas yén kuring ngagaduhan bahan anu cekap pikeun nyerat tulisan :). Ku alatan éta, teu dipikanyaho sabaraha kasalahan tina tipe ieu bisa dicirikeun dina LLVM maké PVS-Studio.

Kuring bakal masihan anjeun conto naha diajar pemicu ieu pikaboseneun. Analisa leres pisan dina ngaluarkeun peringatan pikeun kodeu di handap ieu. Tapi ieu teu kasalahan.

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

PVS-Studio Warning: V547 [CWE-570] Babasan '!HasError' sok palsu. UnwrappedLineParser.cpp 1635

Fragmen N30: ​​Balik deui curiga

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

Peringatan PVS-Studio: V612 [CWE-670] Hiji 'balik' saratna dina loop a. R600OptimizeVectorRegisters.cpp 63

Ieu mangrupikeun kasalahan atanapi téknik khusus anu dimaksudkeun pikeun ngajelaskeun hiji hal ka programer anu maca kodeu. Desain ieu teu ngajelaskeun nanaon ka kuring jeung Sigana pisan curiga. Leuwih hade ulah nulis kitu :).

capé? Teras waktosna ngadamel tea atanapi kopi.

Milarian bug dina LLVM 8 nganggo analisa PVS-Studio

Defects dicirikeun ku diagnostics anyar

Jigana 30 aktivasina tina diagnostics heubeul cukup. Hayu urang ayeuna ningali naon hal metot bisa kapanggih ku diagnostics anyar nu mucunghul dina analyzer sanggeus saméméhna cék. Antukna, jumlahna aya 66 diagnostik tujuan umum ditambahkeun kana analisa C ++.

Fragmén N31: Kodeu teu bisa dihontal

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

Peringatan PVS-Studio: V779 [CWE-561] Kode unreachable kauninga. Ieu mungkin yen aya kasalahan. ExecutionUtils.cpp 146

Sakumaha anjeun tiasa tingali, duanana cabang operator if ditungtungan ku panggero ka operator kasumpingan. Sasuai, wadahna CtorDtorsByPriority moal pernah diberesihan.

Fragmén N32: Kodeu teu bisa dihontal

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

PVS-Studio warning: V779 [CWE-561] Kode unreachable kauninga. Ieu mungkin yen aya kasalahan. LLParser.cpp 835

kaayaan metot. Hayu urang tingali heula tempat ieu:

return ParseTypeIdEntry(SummaryID);
break;

Dina glance kahiji, sigana teu aya kasalahan di dieu. Sigana mah operator peunggas aya hiji tambahan di dieu, jeung anjeun bisa kalayan gampang ngahapus eta. Sanajan kitu, teu kabeh jadi basajan.

Analis ngaluarkeun peringatan dina jalur:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Jeung memang, kode ieu unreachable. Sadaya kasus di sakelar ditungtungan ku telepon ti operator kasumpingan. Tur ayeuna teu boga akal sorangan peunggas teu kasampak jadi bahaya! Panginten salah sahiji dahan kedah ditungtungan ku peunggas, henteu dina kasumpingan?

Fragmén N33: reset acak tina bit tinggi

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

Peringatan PVS-Studio: V784 Ukuran bit mask kirang ti ukuran operan munggaran. Ieu bakal ngabalukarkeun leungitna bit luhur. RuntimeDyld.cpp 815

Punten dicatet yén fungsina getStubAlignment tipe mulih teu ditandatanganan. Hayu urang ngitung nilai éksprési, asumsina yén fungsi mulih nilai 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

Ayeuna perhatikeun yén variabel Ukuran Data ngabogaan tipe unsigned 64-bit. Tétéla yén nalika ngajalankeun operasi DataSize & 0xFFFFFFF8u, sadaya tilu puluh dua bit-urutan luhur bakal direset kana nol. Paling dipikaresep, ieu teu naon programmer hayang. Kuring curiga yén manéhna hayang ngitung: DataSize & 0xFFFFFFFFFFFFFFFF8u.

Pikeun ngalereskeun kasalahan, anjeun kedah nyerat ieu:

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

Atanapi kitu:

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

Fragmen N34: Gagal matak tipe eksplisit

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

Peringatan PVS-Studio: V1028 [CWE-190] Mungkin ngabahekeun. Mertimbangkeun casting operands tina operator 'NumElts * Skala' kana tipe 'size_t', teu hasilna. X86ISelLowering.h 1577

Casting tipe eksplisit dipaké pikeun ngahindarkeun overflow nalika ngalikeun variabel tipe int. Sanajan kitu, casting tipe eksplisit dieu teu ngajaga ngalawan mudal. Kahiji, variabel bakal dikalikeun, sarta ngan lajeng hasil 32-bit tina multiplication bakal dimekarkeun jadi tipe ukuran_t.

Fragmen N35: Gagal Salin-témpél

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] Dua fragmen kode sarupa kapanggih. Panginten, ieu mangrupikeun salah ketik sareng variabel 'Op1' kedah dianggo tibatan 'Op0'. InstCombineCompares.cpp 5507

Diagnostik anyar anu pikaresepeun ieu ngidentipikasi kaayaan dimana sapotong kode parantos disalin sareng sababaraha nami di dinya parantos dirobih, tapi dina hiji tempat aranjeunna henteu ngabenerkeunana.

Punten dicatet yén dina blok kadua aranjeunna robih op0 dina op1. Tapi di hiji tempat aranjeunna henteu ngalereskeunana. Paling dipikaresep eta kudu geus ditulis kawas kieu:

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

Fragmen N36: Variabel Galau

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

Peringatan PVS-Studio: V1001 [CWE-563] Variabel 'Mode' ditugaskeun tapi henteu dianggo dina tungtung fungsina. SIModeRegister.cpp 48

Bahaya pisan pikeun masihan argumen fungsi anu sami sareng anggota kelas. Gampang pisan bingung. Kami gaduh kasus sapertos kitu sateuacan urang. Ungkapan ieu teu asup akal:

Mode &= Mask;

Argumen fungsi robah. Éta hungkul. Argumen ieu henteu dianggo deui. Panginten anjeun kedah nyerat sapertos kieu:

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

Fragmen N37: Variabel Galau

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

Peringatan PVS-Studio: V1001 [CWE-563] Variabel 'Ukuran' ditugaskeun tapi henteu dianggo dina tungtung fungsina. Object.cpp 424

Kaayaanana sami sareng anu sateuacana. Ieu kudu ditulis:

this->Size += this->EntrySize;

Fragmen N38-N47: Aranjeunna poho pikeun pariksa indéks dina

Saméméhna, urang nempo conto triggering diagnostik V595. Intina nyaeta pointer ieu dereferenced di awal, sarta ngan lajeng dipariksa. Diagnostik ngora V1004 nyaéta sabalikna dina harti, tapi ogé nembongkeun loba kasalahan. Éta ngidentipikasi kaayaan dimana pointer dipariksa di awal teras hilap ngalakukeunana. Hayu urang tingali kasus sapertos anu aya di jero LLVM.

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

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

PVS-Studio warning: V1004 [CWE-476] The 'Ptr' pointer dipaké unsafely sanggeus ieu diverifikasi ngalawan nullptr. Pariksa garis: 729, 738. TargetTransformInfoImpl.h 738

Variabel Ptr bisa sarua nullptr, sakumaha dibuktikeun ku cek:

if (Ptr != nullptr)

Sanajan kitu, handap pointer ieu dereferenced tanpa mariksa awal:

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

Hayu urang nganggap kasus sarupa sejen.

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

PVS-Studio warning: V1004 [CWE-476] The 'FD' pointer dipaké unsafely sanggeus ieu diverifikasi ngalawan nullptr. Pariksa garis: 3228, 3231. CGDebugInfo.cpp 3231

Nengetan tanda FD. Kuring yakin masalahna jelas katingali sareng teu aya katerangan khusus anu diperyogikeun.

Sareng salajengna:

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

PVS-Studio warning: V1004 [CWE-476] The 'PtrTy' pointer dipaké unsafely sanggeus diverifikasi ngalawan nullptr. Pariksa garis: 960, 965. InterleavedLoadCombinePass.cpp 965

Kumaha ngajaga diri tina kasalahan sapertos kitu? Janten langkung ati-ati dina Code-Review sareng nganggo analisa statik PVS-Studio pikeun rutin pariksa kode anjeun.

Teu aya gunana nyebatkeun fragmen kode anu sanés kasalahan tina jinis ieu. Kuring ngan bakal ninggalkeun daptar warnings dina artikel:

  • V1004 [CWE-476] Pointer 'Expr' dipaké teu aman sanggeus diverifikasi ngalawan nullptr. Pariksa garis: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] The 'PI' pointer dipaké unsafely sanggeus diverifikasi ngalawan nullptr. Pariksa garis: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Pointer 'StatepointCall' dipaké teu aman sanggeus diverifikasi ngalawan nullptr. Pariksa garis: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] Pointer 'RV' dipaké teu aman sanggeus diverifikasi ngalawan nullptr. Pariksa garis: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Pointer 'CalleeFn' dipaké teu aman sanggeus diverifikasi ngalawan nullptr. Pariksa garis: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Pointer 'TC' dipaké teu aman sanggeus diverifikasi ngalawan nullptr. Pariksa garis: 1819, 1824. Driver.cpp 1824

Fragmén N48-N60: Henteu kritis, tapi cacad (kamungkinan bocor mémori)

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

Peringatan PVS-Studio: V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Strategi' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-isel-fuzzer.cpp 58

Pikeun nambahkeun unsur ka tungtung wadahna kawas std::vektor > anjeun teu bisa ngan nulis xxx.push_back(X anyar), Kusabab euweuh konversi implisit ti X* в std::unique_ptr.

Solusi umum nyaéta nulis xxx.emplace_back(X anyar)saprak éta compiles: métode emplace_back constructs unsur langsung tina argumen na sahingga bisa ngagunakeun constructors eksplisit.

Éta henteu aman. Upami vektorna pinuh, teras mémori dialokasikeun deui. Operasi réalokasi mémori tiasa gagal, nyababkeun pengecualian dialungkeun std::bad_alloc. Dina hal ieu, pointer bakal leungit jeung objék dijieun moal pernah dihapus.

Solusi anu aman nyaéta nyiptakeun unique_ptranu bakal gaduh pointer sateuacan vektor nyobian ngalihkeun mémori:

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

Kusabab C++ 14, anjeun tiasa nganggo 'std::make_unique':

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

Jenis cacad ieu henteu kritis pikeun LLVM. Upami mémori teu tiasa dialokasikeun, kompiler bakal eureun. Nanging, pikeun aplikasi anu panjang uptime, nu teu bisa ngan nungtungan lamun alokasi memori gagal, ieu bisa jadi bug nasty nyata.

Janten, sanaos kode ieu henteu janten ancaman praktis pikeun LLVM, kuring mendakan éta mangpaat pikeun ngobrol ngeunaan pola kasalahan ieu sareng yén analisa PVS-Studio parantos diajar pikeun ngaidentipikasi éta.

Peringatan séjén tina jinis ieu:

  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Passes' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. PassManager.h 546
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'AAs' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. AliasAnalysis.h 324
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Entri' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'AllEdges' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. CFGMST.h 268
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'VMaps' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Records' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. FDRLogBuilder.h 30
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'PendingSubmodules' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. ModuleMap.cpp 810
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Objék' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. DebugMap.cpp 88
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Strategi' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 685
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 686
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 688
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 689
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 690
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 691
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 692
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 693
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Modifiers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. llvm-stress.cpp 694
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Operan' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Stash' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] A pointer tanpa boga ditambahkeun kana wadahna 'Matchers' ku métode 'emplace_back'. Bocor mémori bakal kajantenan upami aya pengecualian. GlobalISelEmitter.cpp 2702

kacindekan

Kuring ngaluarkeun 60 warnings dina total lajeng dieureunkeun. Aya defects séjén yén PVS-Studio analyzer ngadeteksi di LLVM? Sumuhun, abdi gaduh. Najan kitu, nalika kuring nulis kaluar fragmen kode pikeun artikel, éta telat malem, atawa malah peuting, sarta kuring mutuskeun yén éta waktu pikeun nelepon hiji poé.

Abdi ngarepkeun anjeun mendakan éta pikaresepeun sareng hoyong nyobian analisa PVS-Studio.

Anjeun tiasa ngundeur analyzer tur meunangkeun konci mineweeper di kaca ieu.

Anu paling penting, nganggo analisa statik sacara teratur. Cék sakalian, dilumangsungkeun ku urang guna popularize metodologi analisis statik jeung PVS-Studio sanes skenario normal.

Good tuah dina ngaronjatkeun kualitas sarta reliabilitas kode anjeun!

Milarian bug dina LLVM 8 nganggo analisa PVS-Studio

Upami anjeun hoyong ngabagikeun tulisan ieu ka pamiarsa anu nyarios basa Inggris, mangga nganggo tautan tarjamahan: Andrey Karpov. Manggihan Bugs di LLVM 8 kalawan PVS-Studio.

sumber: www.habr.com

Tambahkeun komentar