Mitady bibikely ao amin'ny LLVM 8 amin'ny fampiasana ny mpandinika PVS-Studio

Mitady bibikely ao amin'ny LLVM 8 amin'ny fampiasana ny mpandinika PVS-Studio
Roa taona mahery no lasa hatramin'ny fanamarinana kaody farany momba ny tetikasa LLVM tamin'ny fampiasana ny analyser PVS-Studio. Andao ho azo antoka fa ny mpandinika PVS-Studio dia mbola fitaovana lehibe hamantarana ny lesoka sy ny fahalemena mety hitranga. Mba hanaovana izany dia hijery sy hahita lesoka vaovao amin'ny famoahana LLVM 8.0.0 izahay.

Lahatsoratra hosoratana

Raha ny marina, tsy te hanoratra ity lahatsoratra ity aho. Tsy mahaliana ny manoratra momba ny tetikasa iray izay efa nojerenay imbetsaka (1, 2, 3). Aleo manoratra momba ny zava-baovao, fa tsy manan-tsafidy aho.

Isaky ny avoaka na havaozina ny kinova vaovaon'ny LLVM Clang Static Analyzer, mahazo fanontaniana amin'ireto karazana manaraka ireto ao amin'ny mailakay izahay:

Jereo, ny kinova vaovao an'ny Clang Static Analyzer dia nianatra nahita fahadisoana vaovao! Amiko dia mihena ny maha-zava-dehibe ny fampiasana PVS-Studio. Clang dia mahita fahadisoana bebe kokoa noho ny teo aloha ary mahatratra ny fahaizan'ny PVS-Studio. Ahoana ny hevitrao momba izany?

Te-hamaly zavatra toy izao foana aho amin'ity:

Izahay koa tsy mipetra-potsiny! Nanatsara ny fahaizan'ny mpandinika PVS-Studio izahay. Koa aza manahy fa mbola mitarika toy ny teo aloha ihany izahay.

Indrisy fa valiny ratsy izany. Tsy misy porofo ao. Ary izany no antony hanoratako ity lahatsoratra ity izao. Nojerena indray, araka izany, ny tetikasa LLVM ary nahitana lesoka isan-karazany. Hasehoko izao ireo izay toa nahaliana ahy. Clang Static Analyzer dia tsy afaka mahita ireo lesoka ireo (na tena sarotra ny manao izany miaraka amin'ny fanampiany). Fa afaka. Ambonin'izany, hitako sy nosoratako ireo fahadisoana rehetra ireo tao anatin'ny takariva iray.

Naharitra herinandro maromaro anefa ny fanoratana ilay lahatsoratra. Tsy azoko atao ny mametraka izany rehetra izany amin'ny lahatsoratra :).

Raha ny tokony ho izy, raha liana amin'ny teknolojia ampiasaina amin'ny mpandinika PVS-Studio ianao hamantarana ny lesoka sy ny fahalemena mety hitranga, dia manoro hevitra aho ny hifankazatra amin'izany. Fanamarihana.

Diagnostika vaovao sy taloha

Araka ny efa nomarihina dia roa taona teo ho eo izay no nojerena indray ny tetikasa LLVM, ary nahitsy ireo lesoka hita. Ankehitriny ity lahatsoratra ity dia hanolotra andiana fahadisoana vaovao. Nahoana no nisy bibikely vaovao hita? Misy antony 3 mahatonga izany:

  1. Mivoatra ny tetikasa LLVM, manova kaody taloha ary manampy kaody vaovao. Mazava ho azy fa misy lesoka vaovao ao amin'ny code novaina sy nosoratana. Izany dia mampiseho mazava tsara fa ny fanadihadiana static dia tokony hampiasaina tsy tapaka, fa tsy indraindray. Ny lahatsoratray dia mampiseho tsara ny fahaizan'ny mpandinika PVS-Studio, saingy tsy misy ifandraisany amin'ny fanatsarana ny kalitaon'ny code sy ny fampihenana ny vidin'ny fanamboarana ny lesoka. Mampiasà mpanadihady kaody static tsy tapaka!
  2. Mamarana sy manatsara ny diagnostika efa misy izahay. Noho izany, ny mpandinika dia afaka mamantatra ny fahadisoana izay tsy tsikaritra nandritra ny scan teo aloha.
  3. Ny diagnostika vaovao dia niseho tao amin'ny PVS-Studio izay tsy nisy 2 taona lasa izay. Nanapa-kevitra ny hanasongadina azy ireo amin'ny fizarana misaraka aho mba hampisehoana mazava ny fivoaran'ny PVS-Studio.

Ny lesoka fantatra amin'ny diagnostika efa nisy 2 taona lasa izay

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

PVS-Studio fampitandremana: V501 [CWE-570] Misy fehezanteny mitovy amin'ny hoe 'Name.startswith("avx512.mask.permvar.")' eo ankavia sy eo ankavanan'ny '||' mpandraharaha. AutoUpgrade.cpp 73

Voamarina indroa fa manomboka amin'ny zana-tsipika "avx512.mask.permvar" ny anarana. Tamin'ny fanamarinana faharoa, mazava ho azy fa te hanoratra zavatra hafa izy ireo, saingy hadinon'izy ireo ny nanitsy ny lahatsoratra nadika.

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

Fampitandremana PVS-Studio: V501 Misy zana-teny mitovy 'CXNameRange_WantQualifier' eo ankavia sy eo ankavanan'ny '|' mpandraharaha. CIndex.cpp 7245

Noho ny fahadisoana diso dia ampiasaina indroa ilay antsoina hoe constant CXNameRange_WantQualifier.

Sombiny N3: Misafotofoto amin'ny laharam-pahamehan'ny mpandraharaha

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

PVS-Studio fampitandremana: V502 [CWE-783] Angamba ny '?:' dia miasa amin'ny fomba hafa tsy araka ny nantenaina. Ny '?:' dia manana laharam-pahamehana ambany kokoa noho ny '==' operator. PPCTargetTransformInfo.cpp 404

Raha ny hevitro dia fahadisoana tena tsara izany. Eny, fantatro fa manana hevitra hafahafa momba ny hatsaran-tarehy aho :).

Ankehitriny, araka ny laharam-pahamehana ny mpandraharaha, ny fomba fiteny dia tombanana toy izao:

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

Amin'ny fomba fijery azo ampiharina, ny fepetra toy izany dia tsy mitombina, satria azo ahena ho:

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

Fahadisoana mazava izany. Azo inoana fa te hampitaha ny 0/1 amin'ny variable izy ireo Index. Mba hanamboarana ny kaody dia mila manampy fononteny manodidina ny operator ternary ianao:

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

Teny an-dalana, ny ternary operator dia tena mampidi-doza ary mampahatezitra ny lojika fahadisoana. Mitandrema tsara amin'izany ary aza mitsiriritra amin'ny fononteny. Nojereko tamin'ny antsipiriany bebe kokoa ity lohahevitra ity eto, ao amin’ilay toko hoe “Tandremo ny ?: Mpampiasa ary Ampidiro ao anaty fononteny ilay izy”.

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

PVS-Studio fampitandremana: V522 [CWE-476] Mety hitranga ny fanafoanana ny tondro tsy misy dikany 'LHS'. TGParser.cpp 2152

Raha ny tondro LHS dia tsy misy dikany, tokony hisy fampitandremana. Na izany aza, ho solon'izay, ity pointer null ity dia hofoanana: LHS->getAsString().

Toe-javatra mahazatra ity rehefa misy hadisoana miafina amin'ny mpandrindra fahadisoana, satria tsy misy mitsapa azy ireo. Ny mpanadihady static dia manamarina ny kaody azo tratrarina, na impiry impiry izy no ampiasaina. Ity dia ohatra tena tsara amin'ny fomba famenon'ny famakafakana static ny teknika fitiliana sy fiarovana hafa.

Fahadisoana amin'ny fitantanana fanondro mitovy RHS avela ao amin'ny kaody etsy ambany: V522 [CWE-476] Mety hitranga ny fanafoanana ny tondro tsy misy dikany 'RHS'. TGParser.cpp 2186

Sombiny N6: Mampiasa ny fanondro rehefa avy mihetsika

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

Fampitandremana amin'ny PVS-Studio: V522 [CWE-476] Mety hitranga ny fanafoanana ny pointer null 'ProgClone'. Micompilation.cpp 601

Amin'ny voalohany, tondro marani-tsaina ProgClone mitsahatra tsy manana ny zavatra:

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

Raha ny marina, ankehitriny ProgClone dia tondro null. Noho izany, tsy maintsy miseho eto ambany ny fanondroana null:

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

Saingy, raha ny marina, dia tsy hitranga izany! Mariho fa ny loop dia tsy tena tanterahina.

Eo am-piandohan'ny container MicompiledFunctions voafafa:

MiscompiledFunctions.clear();

Manaraka, ny haben'ity fitoeran-javatra ity dia ampiasaina amin'ny toetry ny loop:

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

Mora ny mahita fa tsy manomboka ny loop. Heveriko fa bibikely ihany koa ity ary tokony ho hafa ny fanoratana ny kaody.

Toa efa nihaona tamin'izany fahadisoan-kevitra malaza izany isika! Ny fahadisoana iray dia misaron-tava hafa :).

Sombiny N7: Mampiasa ny fanondro rehefa avy mihetsika

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

Fampitandremana PVS-Studio: V522 [CWE-476] Mety hitranga ny fanafoanana ny tondro tsy misy dikany. Micompilation.cpp 709

Ny toe-javatra mitovy indray. Amin'ny voalohany dia ahetsiketsika ny ao anatin'ilay zavatra, ary avy eo dia ampiasaina toy ny tsy nisy na inona na inona. Hitako matetika kokoa ity toe-javatra ity ao amin'ny kaody programa taorian'ny fisehoan'ny semantika hetsika tao amin'ny C ++. Izany no antony tiako ny fiteny C++! Mihamaro hatrany ny fomba vaovao hitifirana ny tongotrao. Hanana asa foana ny mpandinika PVS-Studio :).

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

Fampitandremana PVS-Studio: V522 [CWE-476] Mety hitranga ny fanafoanana ny 'karazana' pointer null. PrettyFunctionDumper.cpp 233

Ho fanampin'ny mpandrindra fahadisoana, matetika tsy voasedra ny fampandehanana ny fanontana fanontana. Misy tranga toy izany eo anoloantsika. Ny fiasa dia miandry ny mpampiasa, izay, fa tsy mamaha ny olany, dia voatery hanamboatra azy io.

hanitsy:

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

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

Fampitandremana PVS-Studio: V522 [CWE-476] Mety hitranga ny fanafoanana ny tondro tsy misy dikany 'Ty'. SearchableTableEmitter.cpp 614

Heveriko fa mazava ny zava-drehetra ary tsy mila fanazavana.

Sombiny N10: Typo

bool FormatTokenLexer::tryMergeCSharpNullConditionals() {
  ....
  auto &Identifier = *(Tokens.end() - 2);
  auto &Question = *(Tokens.end() - 1);
  ....
  Identifier->ColumnWidth += Question->ColumnWidth;
  Identifier->Type = Identifier->Type;                    // <=
  Tokens.erase(Tokens.end() - 1);
  return true;
}

PVS-Studio fampitandremana: V570 Ny fari-piadidiana 'Identifier-> Type' dia voatendry ho azy. FormatTokenLexer.cpp 249

Tsy misy dikany ny manendry variable ho azy. Azo inoana fa te hanoratra izy ireo:

Identifier->Type = Question->Type;

Sombiny N11: Fiatoana mampiahiahy

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

PVS-Studio fampitandremana: V622 [CWE-478] Diniho ny fanaraha-maso ny fanambarana 'switch'. Mety ho tsy hita ilay mpandraharaha 'tranga' voalohany. SystemZAsmParser.cpp 652

Misy mpandraharaha tena mampiahiahy any am-piandohana break. Adinonao ve ny nanoratra zavatra hafa eto?

Sombiny N12: Fanamarinana tondro aorian'ny fanafoanana

InlineCost AMDGPUInliner::getInlineCost(CallSite CS) {
  Function *Callee = CS.getCalledFunction();
  Function *Caller = CS.getCaller();
  TargetTransformInfo &TTI = TTIWP->getTTI(*Callee);

  if (!Callee || Callee->isDeclaration())
    return llvm::InlineCost::getNever("undefined callee");
  ....
}

PVS-Studio fampitandremana: V595 [CWE-476] Ny tondro 'Callee' dia nampiasaina talohan'ny nanamarinana azy tamin'ny nullptr. Jereo ny tsipika: 172, 174. AMDGPUInline.cpp 172

manondro Callee eo am-piandohana dia dereference amin'ny fotoana iantsoana ny asa getTTI.

Ary avy eo dia hita fa tokony hojerena amin'ny fitoviana io tondro io nullptr:

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

Saingy efa tara loatra…

Sombiny N13 - N...: Fanamarinana tondro aorian'ny fanafoanana

Ny toe-javatra noresahina tao amin'ny sombin-kaody teo aloha dia tsy miavaka. Hita eto izany:

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 fampitandremana: V595 [CWE-476] Ny tondro 'CalleeFn' dia nampiasaina talohan'ny nanamarinana azy tamin'ny nullptr. Jereo ny tsipika: 1079, 1081. SimplifyLibCalls.cpp 1079

Ary eto:

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 fampitandremana: V595 [CWE-476] Ny tondro 'ND' dia nampiasaina talohan'ny nanamarinana azy tamin'ny nullptr. Jereo ny tsipika: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Ary eto:

  • V595 [CWE-476] Ny tondro 'U' dia nampiasaina talohan'ny nanamarinana azy tamin'ny nullptr. Jereo ny tsipika: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Ny tondro 'ND' dia nampiasaina talohan'ny nanamarinana azy tamin'ny nullptr. Jereo ny tsipika: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Ary avy eo dia nanjary tsy liana tamin'ny fandalinana ireo fampitandremana misy laharana V595 aho. Ka tsy haiko raha misy lesoka mitovitovy amin'izany ankoatra ireo voatanisa eto. Azo inoana fa misy.

Sombiny N17, N18: fiovana mampiahiahy

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

PVS-Studio fampitandremana: V629 [CWE-190] Diniho ny fijerena ny '~(Habe - 1) << 1'. Ny fiovan'ny sanda 32-bit miaraka amin'ny fanitarana manaraka amin'ny karazana 64-bit. AArch64AddressingModes.h 260

Mety tsy bibikely ilay izy ary miasa araka ny tokony ho izy ny kaody. Tena mampiahiahy anefa ity toerana ity ka mila hamarinina.

Aoka hatao hoe ny fari-piainana Size dia mitovy amin'ny 16, ary avy eo ny mpanoratra ny kaody nikasa ny hahazo izany amin'ny fari-piainana NImms zava-dehibe:

1111111111111111111111111111111111111111111111111111111111100000

Na izany aza, raha ny marina, ny vokany dia:

0000000000000000000000000000000011111111111111111111111111100000

Ny zava-misy dia ny kajy rehetra dia mitranga amin'ny alàlan'ny karazana 32-bit unsigned. Ary amin'izay fotoana izay ihany, ity karazana 32-bit tsy misy sonia ity dia hivelatra tanteraka uint64_t. Amin'ity tranga ity, ny bits manan-danja indrindra dia ho aotra.

Azonao atao ny manamboatra ny toe-javatra toy izao:

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

Toe-javatra mitovy amin'izany: V629 [CWE-190] Diniho ny fitenenana 'Immr << 6'. Ny fiovan'ny sanda 32-bit miaraka amin'ny fanitarana manaraka amin'ny karazana 64-bit. AArch64AddressingModes.h 269

Sombiny N19: Tsy misy teny fanalahidy hafa?

void AMDGPUAsmParser::cvtDPP(MCInst &Inst, const OperandVector &Operands) {
  ....
  if (Op.isReg() && Op.Reg.RegNo == AMDGPU::VCC) {
    // VOP2b (v_add_u32, v_sub_u32 ...) dpp use "vcc" token.
    // Skip it.
    continue;
  } if (isRegOrImmWithInputMods(Desc, Inst.getNumOperands())) {    // <=
    Op.addRegWithFPInputModsOperands(Inst, 2);
  } else if (Op.isDPPCtrl()) {
    Op.addImmOperands(Inst, 1);
  } else if (Op.isImm()) {
    // Handle optional arguments
    OptionalIdx[Op.getImmTy()] = I;
  } else {
    llvm_unreachable("Invalid operand type");
  }
  ....
}

PVS-Studio fampitandremana: V646 [CWE-670] Diniho ny fijerena ny lojikan'ny fampiharana. Mety tsy hita ny teny fototra 'hafa'. AMDGPUAsmParser.cpp 5655

Tsy misy hadisoana eto. Hatramin'izay - sakana tamin'ny voalohany if mifarana amin'ny hanohy, dia tsy maninona fa misy teny fanalahidy hafa na tsia. Na izany na tsy izany dia hiasa mitovy ny code. Mbola tsy hita hafa mahatonga ny kaody tsy mazava kokoa sy mampidi-doza. Raha any aoriana hanohy hanjavona, manomboka miasa amin'ny fomba hafa tanteraka ny kaody. Raha ny hevitro dia aleo ampiana hafa.

Sombiny N20: Typos efatra mitovy karazana

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

Fampitandremana PVS-Studio:

  • V655 [CWE-480] Natambatra ny tady fa tsy ampiasaina. Eritrereto ny mijery ny fomba fiteny 'Result + Name.str()'. Symbol.cpp 32
  • V655 [CWE-480] Natambatra ny tady fa tsy ampiasaina. Eritrereto ny mijery ny fanehoana 'Vokatra + "(ObjC Class)" + Name.str()'. Symbol.cpp 35
  • V655 [CWE-480] Natambatra ny tady fa tsy ampiasaina. Eritrereto ny mijery ny fanehoan-kevitra 'Vokatra + "(ObjC Class EH) " + Name.str()'. Symbol.cpp 38
  • V655 [CWE-480] Natambatra ny tady fa tsy ampiasaina. Eritrereto ny mijery ny fanehoan-kevitra 'Vokatra + "(ObjC IVar)" + Name.str()'. Symbol.cpp 41

Tsy nahy, ny + operator no ampiasaina fa tsy ny += operator. Ny vokatr'izany dia endrika tsy misy dikany.

Sombiny N21: Fihetsika tsy voafaritra

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

Miezaha mitady ny kaody mampidi-doza ny tenanao. Ary ity dia sary hanalana ny saina mba tsy hijerena avy hatrany ny valiny:

Mitady bibikely ao amin'ny LLVM 8 amin'ny fampiasana ny mpandinika PVS-Studio

PVS-Studio fampitandremana: V708 [CWE-758] Ampiasaina ny fanorenana mampidi-doza: 'FeaturesMap[Op] = FeaturesMap.size()', izay misy ny 'FeaturesMap' amin'ny kilasy 'sari-tany'. Mety hitarika amin'ny fitondran-tena tsy voafaritra izany. RISCVCompressInstEmitter.cpp 490

tsipika olana:

FeaturesMap[Op] = FeaturesMap.size();

Raha singa Op dia tsy hita, dia misy singa vaovao noforonina ao amin'ny sarintany ary ny isan'ny singa amin'ity sarintany ity dia voasoratra ao. Tsy fantatra raha hiantso ny asa habe alohan'ny na aorian'ny fampidirana singa vaovao.

Sombiny N22-N24: Fanendrena miverimberina

Error MachOObjectFile::checkSymbolTable() const {
  ....
  } else {
    MachO::nlist STE = getSymbolTableEntry(SymDRI);
    NType = STE.n_type;                              // <=
    NType = STE.n_type;                              // <=
    NSect = STE.n_sect;
    NDesc = STE.n_desc;
    NStrx = STE.n_strx;
    NValue = STE.n_value;
  }
  ....
}

PVS-Studio fampitandremana: V519 [CWE-563] Ny fari-piainana 'NType' dia nomena sanda indroa misesy. Mety ho fahadisoana izany. Jereo ny tsipika: 1663, 1664. MachOObjectFile.cpp 1664

Heveriko fa tsy misy lesoka marina eto. Fanendrena miverimberina tsy ilaina fotsiny. Fa mbola blunder.

Toy izany koa:

  • V519 [CWE-563] Ny fari-piainana 'B.NDesc' dia nomena sanda indroa misesy. Mety ho fahadisoana izany. Jereo ny tsipika: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Ny fari-piainana dia nomena sanda indroa misesy. Mety ho fahadisoana izany. Jereo ny tsipika: 59, 61. coff2yaml.cpp 61

Sombiny N25-N27: Famerenana bebe kokoa

Andeha hojerentsika ny dikan-teny hafa kely amin'ny famerenana.

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

Fampitandremana PVS-Studio: V519 [CWE-563] Ny fari-pahaizana 'Alignment' dia nomena sanda indroa misesy. Mety ho fahadisoana izany. Jereo ny tsipika: 1158, 1160. LoadStoreVectorizer.cpp 1160

Kaody hafahafa be ity izay toa misy hadisoana lojika. Amin'ny voalohany, variable fampifanarahana misy sanda omena arakaraka ny fepetra. Ary avy eo dia mitranga indray ny fanendrena, fa izao tsy misy fanamarinana.

Ny toe-javatra mitovy amin'izany dia azo jerena eto:

  • V519 [CWE-563] Ny fari-piainan'ny 'Effects' dia omena sanda indroa misesy. Mety ho fahadisoana izany. Jereo ny tsipika: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Ny fari-piainana 'ExpectNoDerefChunk' dia nomena sanda indroa misesy. Mety ho fahadisoana izany. Jereo ny tsipika: 4970, 4973. SemaType.cpp 4973

Sombiny N28: Toetra marina foana

static int readPrefixes(struct InternalInstruction* insn) {
  ....
  uint8_t byte = 0;
  uint8_t nextByte;
  ....
  if (byte == 0xf3 && (nextByte == 0x88 || nextByte == 0x89 ||
                       nextByte == 0xc6 || nextByte == 0xc7)) {
    insn->xAcquireRelease = true;
    if (nextByte != 0x90) // PAUSE instruction support             // <=
      break;
  }
  ....
}

PVS-Studio fampitandremana: V547 [CWE-571] Marina foana ny teny hoe 'nextByte != 0x90'. X86DisassemblerDecoder.cpp 379

Tsy mitombina ny fisavana. Miovaova nextByte tsy mitovy amin'ny sandany foana 0x90, izay manaraka avy amin'ny fanamarinana teo aloha. Karazana fahadisoana lojika izany.

Sombiny N29 - N...: Fepetra marina/diso foana

Ny analyse dia manome fampitandremana maro fa ny fepetra rehetra (V547) na ampahany aminy (V560) dia marina na diso foana. Matetika ireo dia tsy tena fahadisoana, fa kaody sloppy fotsiny, vokatry ny fanitarana macro, sy ny toy izany. Tena ilaina anefa ny mijery ireo fampitandremana rehetra ireo, satria misy fahadisoana ara-lojika tena misy indraindray. Ohatra, mampiahiahy ity ampahany amin'ny kaody ity:

static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo,
                                   uint64_t Address, const void *Decoder) {
  DecodeStatus S = MCDisassembler::Success;

  if (RegNo > 13)
    return MCDisassembler::Fail;

  if ((RegNo & 1) || RegNo == 0xe)
     S = MCDisassembler::SoftFail;
  ....
}

PVS-Studio fampitandremana: V560 [CWE-570] Diso foana ny ampahany amin'ny fehezanteny misy fepetra: RegNo == 0xe. ARMDisassembler.cpp 939

Ny 0xE tsy miova dia ny sanda 14 amin'ny decimal. fandinihana RegNo == 0xe tsy misy dikany satria raha RegNo > 13, dia hamita ny fanatanterahana azy ny asa.

Nisy fampitandremana maro hafa niaraka tamin'ny ID V547 sy V560, fa toy ny tamin'ny V595, tsy liana tamin’ny fianarana ireo fampitandremana ireo aho. Efa nazava fa ampy ny fitaovana hanoratana lahatsoratra :). Noho izany, tsy fantatra hoe firy ny lesoka amin'ity karazana ity dia azo fantarina ao amin'ny LLVM mampiasa PVS-Studio.

Hanome ohatra anao aho hoe nahoana no mankaleo ny fandalinana ireo trigger ireo. Ny analyse dia marina tanteraka amin'ny famoahana fampitandremana ho an'ity code manaraka ity. Tsy fahadisoana anefa izany.

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

Fampitandremana PVS-Studio: V547 [CWE-570] Diso foana ny teny hoe '!HasError'. UnwrappedLineParser.cpp 1635

Sombiny N30: ​​fiverenana mampiahiahy

static bool
isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) {
  for (MachineRegisterInfo::def_instr_iterator It = MRI.def_instr_begin(Reg),
      E = MRI.def_instr_end(); It != E; ++It) {
    return (*It).isImplicitDef();
  }
  ....
}

PVS-Studio fampitandremana: V612 [CWE-670] 'Fiverenana' tsy misy fepetra ao anaty loop. R600OptimizeVectorRegisters.cpp 63

Ity dia fahadisoana na teknika manokana natao hanazavana zavatra amin'ny mpandrindra mamaky ny code. Ity endrika ity dia tsy manazava na inona na inona amiko ary toa mampiahiahy be. Aleo tsy manoratra toy izany :).

Reraka? Avy eo dia tonga ny fotoana hanaovana dite na kafe.

Mitady bibikely ao amin'ny LLVM 8 amin'ny fampiasana ny mpandinika PVS-Studio

Kilema fantatra amin'ny diagnostika vaovao

Heveriko fa ampy ny fampahavitrihana 30 amin'ny diagnostika taloha. Andeha hojerentsika izay zavatra mahaliana hita amin'ny diagnostika vaovao izay niseho tao amin'ny mpandinika taorian'izay Teo aloha seky. Amin'ny fitambarany, 66 ny diagnostika tanjona ankapobeny dia nampiana tao amin'ny mpandinika C ++ nandritra io fotoana io.

Sombiny N31: Kaody tsy azo tratrarina

Error CtorDtorRunner::run() {
  ....
  if (auto CtorDtorMap =
          ES.lookup(JITDylibSearchList({{&JD, true}}), std::move(Names),
                    NoDependenciesToRegister, true))
  {
    ....
    return Error::success();
  } else
    return CtorDtorMap.takeError();

  CtorDtorsByPriority.clear();

  return Error::success();
}

PVS-Studio fampitandremana: V779 [CWE-561] Kaody tsy azo tratrarina. Mety misy hadisoana. ExecutionUtils.cpp 146

Araka ny hitanao, ny roa sampana ny mpandraharaha if mifarana amin'ny antso amin'ny mpandraharaha hiverina. Araka izany, ny fitoeran-javatra CtorDtorsByPriority tsy ho voafafa mihitsy.

Sombiny N32: Kaody tsy azo tratrarina

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

Fampitandremana PVS-Studio: V779 [CWE-561] Kaody tsy azo tratrarina. Mety misy hadisoana. LLParser.cpp 835

Toe-javatra mahaliana. Andeha hojerentsika aloha ity toerana ity:

return ParseTypeIdEntry(SummaryID);
break;

Raha vao jerena dia toa tsy misy lesoka eto. Toa ny mpandraharaha break misy fanampiny iray eto, ary azonao fafana tsotra izao. Na izany aza, tsy ny rehetra no tsotra.

Mamoaka fampitandremana amin'ny andalana ny mpandinika:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Ary raha ny marina, ity code ity dia tsy azo tratrarina. Ny tranga rehetra ao jiro mifarana amin'ny antso avy amin'ny mpandraharaha hiverina. Ary ankehitriny tsy misy dikany irery break toa tsy mampidi-doza loatra! Angamba ny iray amin'ireo sampana dia tokony hifarana amin'ny break, tsy amin'ny hiverina?

Fragment N33: Famerenana kisendrasendra ny bits avo

unsigned getStubAlignment() override {
  if (Arch == Triple::systemz)
    return 8;
  else
    return 1;
}

Expected<unsigned>
RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
                             const SectionRef &Section,
                             bool IsCode) {
  ....
  uint64_t DataSize = Section.getSize();
  ....
  if (StubBufSize > 0)
    DataSize &= ~(getStubAlignment() - 1);
  ....
}

PVS-Studio fampitandremana: V784 Ny haben'ny saron-tava kely dia kely noho ny haben'ny operand voalohany. Hiteraka fahaverezan'ny bits ambony kokoa izany. RuntimeDyld.cpp 815

Mariho fa ny asa getStubAlignment mamerina karazana tsy sonia. Andao kajy ny sandan'ny fitenenana, raha heverina fa mamerina ny sanda 8 ny asa:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

Jereo izao fa ny variable DataSize manana karazana 64-bit tsy misy sonia. Hita fa rehefa manao ny asa DataSize & 0xFFFFFFF8u dia haverina amin'ny zero daholo ny bits avo roa amby telopolo. Azo inoana fa tsy izany no tadiavin'ny programmer. Miahiahy aho fa te hanao kajy izy: DataSize & 0xFFFFFFFFFFFFFFFF8u.

Mba hamahana ny hadisoana dia tokony hanoratra ity ianao:

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

Na koa:

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

Sombiny N34: tsy nahomby ny karazana cast

template <typename T>
void scaleShuffleMask(int Scale, ArrayRef<T> Mask,
                      SmallVectorImpl<T> &ScaledMask) {
  assert(0 < Scale && "Unexpected scaling factor");
  int NumElts = Mask.size();
  ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
  ....
}

PVS-Studio fampitandremana: V1028 [CWE-190] Mety ho tondraka. Eritrereto ny fandefasana operan'ny operator 'NumElts * Scale' amin'ny karazana 'size_t' fa tsy ny vokatra. X86ISelLowering.h 1577

Ny fanariana karazana mibaribary dia ampiasaina mba hisorohana ny fihoaram-pefy rehefa mampitombo ny fari-piainana int. Na izany aza, ny fanariana karazana mibaribary eto dia tsy miaro amin'ny fihoaram-pefy. Voalohany, ampitomboina ny variables, ary avy eo ny vokatra 32-bit amin'ny fampitomboana dia hitarina amin'ny karazana habe_t.

Sombiny N35: Tsy nahomby ny 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] Sombika kaody roa mitovy amin'izany no hita. Angamba, typo ity ary ny fari-piadidiana 'Op1' no tokony hampiasaina fa tsy 'Op0'. InstCombineCompares.cpp 5507

Ity diagnostika vaovao mahaliana ity dia mamaritra ny toe-javatra misy ny kaody iray nadika ary ny anarana sasany ao anatiny dia nanomboka niova, saingy tamin'ny toerana iray dia tsy nanitsy izany.

Mariho fa tamin'ny andiany faharoa dia niova izy ireo Op0 amin'ny Op1. Saingy tamin'ny toerana iray dia tsy nanamboatra izany izy ireo. Azo inoana fa tokony ho nosoratana toy izao izy io:

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

Sombiny N36: Misafotofoto miovaova

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

PVS-Studio fampitandremana: V1001 [CWE-563] Ny fari-piainana 'Mode' dia nomena fa tsy ampiasaina amin'ny fiafaran'ny asa. SIModeRegister.cpp 48

Tena mampidi-doza ny manome anarana mitovy amin'ny anaran'ny mpianatra ao amin'ny kilasy. Tena mora very hevitra. Misy tranga toy izany eo anoloantsika. Tsy mitombina io fomba fiteny io:

Mode &= Mask;

Miova ny argument function. Izay ihany. Tsy ampiasaina intsony io hevitra io. Azo inoana fa tokony ho nanoratra toy izao ianao:

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

Sombiny N37: Misafotofoto miovaova

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

Fampitandremana PVS-Studio: V1001 [CWE-563] Ny fari-piadidiana 'Habe' dia nomena fa tsy ampiasaina amin'ny fiafaran'ny asa. Object.cpp 424

Mitovy amin’ilay teo aloha ihany ny zava-misy. Tokony ho voasoratra hoe:

this->Size += this->EntrySize;

Sombiny N38-N47: Adinon'izy ireo ny nanamarina ny index

Teo aloha dia nijery ohatra amin'ny triggering diagnostika isika V595. Ny tena zava-dehibe dia ny fanondroana dia nesorina teo am-piandohana, ary avy eo nohamarinina. Diagnostika tanora V1004 dia mifanohitra amin'ny dikany, nefa koa manambara fahadisoana be dia be. Izy io dia manondro toe-javatra izay nanamarina ny fanondro tany am-piandohana ary nanadino ny nanao izany avy eo. Andeha hojerentsika ny tranga toy izany hita ao amin'ny 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());  // <=
  ....
}

Fampitandremana PVS-Studio: V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'Ptr' rehefa voamarina tamin'ny nullptr. Jereo ny tsipika: 729, 738. TargetTransformInfoImpl.h 738

Miovaova Ptr mety mitovy nullptr, araka ny porofon'ny seky:

if (Ptr != nullptr)

Na izany aza, eo ambanin'ity tondro ity dia nesorina tsy misy fanamarinana mialoha:

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

Andeha isika handinika tranga hafa mitovy amin’izany.

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

Fampitandremana PVS-Studio: V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'FD' rehefa voamarina tamin'ny nullptr. Jereo ny tsipika: 3228, 3231. CGDebugInfo.cpp 3231

Tandremo ny famantarana FD. Azoko antoka fa hita mazava tsara ny olana ary tsy mila fanazavana manokana.

Ary ankoatra izany:

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

Fampitandremana PVS-Studio: V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'PtrTy' rehefa nohamarinina tamin'ny nullptr. Jereo ny tsipika: 960, 965. InterleavedLoadCombinePass.cpp 965

Ahoana no hiarovana ny tenanao amin'ny fahadisoana toy izany? Mitandrema bebe kokoa amin'ny Code-Review ary ampiasao ny mpandinika static PVS-Studio hanamarina tsy tapaka ny kaodinao.

Tsy misy dikany ny mitanisa sombin-kaody hafa misy hadisoana toy izany. Ny lisitry ny fampitandremana ihany no hapetrako ao amin'ilay lahatsoratra:

  • V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'Expr' rehefa nohamarinina tamin'ny nullptr. Jereo ny tsipika: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'PI' rehefa voamarina tamin'ny nullptr. Jereo ny tsipika: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'StatepointCall' rehefa nohamarinina tamin'ny nullptr. Jereo ny tsipika: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] Nampiasaina tamin'ny fomba tsy azo antoka ny tondro 'RV' rehefa nohamarinina tamin'ny nullptr. Jereo ny tsipika: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'CalleeFn' rehefa nohamarinina tamin'ny nullptr. Jereo ny tsipika: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Nampiasaina tsy azo antoka ny tondro 'TC' rehefa voamarina tamin'ny nullptr. Jereo ny tsipika: 1819, 1824. Driver.cpp 1824

Sombiny N48-N60: Tsy mitsikera, fa misy kilema (mety ho tafaporitsaka)

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

PVS-Studio fampitandremana: V1023 [CWE-460] Ny tondro tsy misy tompony dia ampiana ao amin'ny kaontenera 'Strategies' amin'ny alàlan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-isel-fuzzer.cpp 58

Mba hanampiana singa iray amin'ny faran'ny fitoeran-javatra toy ny std::vector > tsy afaka manoratra fotsiny ianao xxx.push_back(X vaovao), satria tsy misy fiovam-po an-kolaka avy amin'ny X* в std:: unique_ptr.

Vahaolana iraisana ny manoratra xxx.emplace_back(X vaovao)hatramin'ny nanangonany: fomba emplace_back dia manorina singa mivantana avy amin'ny tohan-kevitra ary noho izany dia afaka mampiasa constructors mazava.

Tsy azo antoka izany. Raha feno ny vector dia averina averina ny fitadidiana. Mety tsy hahomby ny fampandehanana ny famerenana ny fitadidiana, ka miteraka fanavahana std::bad_alloc. Amin'ity tranga ity dia ho very ny tondro ary tsy ho voafafa na oviana na oviana ny zavatra noforonina.

Vahaolana azo antoka dia ny mamorona unique_ptrizay manana ny pointer alohan'ny hanandrana hamerina ny fahatsiarovana ny vector:

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

Hatramin'ny C++ 14, azonao atao ny mampiasa 'std::make_unique':

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

Ity karazana kilema ity dia tsy manakiana ny LLVM. Raha tsy azo omena ny fitadidiana, dia hijanona fotsiny ny mpanangona. Na izany aza, ho an'ny fampiharana amin'ny ela ora fiasana, izay tsy afaka mitsahatra fotsiny raha tsy mahomby ny fizarana fahatsiarovana, mety ho bibikely ratsy tokoa izany.

Noho izany, na dia tsy mampidi-doza ho an'ny LLVM aza ity kaody ity, dia hitako fa ilaina ny miresaka momba ity lamina diso ity ary nianatra ny hamantatra izany ny mpandinika PVS-Studio.

Fampitandremana hafa amin'ity karazana ity:

  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny kaontenera 'Passes' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. PassManager.h 546
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'AA' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. AliasAnalysis.h 324
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Entries' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'AllEdges' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. CFGMST.h 268
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny kaontenera 'VMaps' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Records' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. FDRLogBuilder.h 30
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'PendingSubmodules' amin'ny alàlan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. ModuleMap.cpp 810
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Objects' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. DebugMap.cpp 88
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny kaontenera 'Strategies' amin'ny alàlan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 685
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 686
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 688
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 689
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 690
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 691
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 692
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 693
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Modifiers' amin'ny alalan'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. llvm-stress.cpp 694
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny kaontenera 'Operands' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Stash' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] Tondro tsy misy tompony dia ampiana ao amin'ny fitoeran'entana 'Matchers' amin'ny fomba 'emplace_back'. Hisy famoriam-pahatsiarovana hipoitra raha misy maningana. GlobalISelEmitter.cpp 2702

famaranana

Namoaka fampitandremana 60 aho tamin'ny fitambarany ary nijanona. Misy lesoka hafa ve hitan'ny mpandinika PVS-Studio ao amin'ny LLVM? Eny Manana aho. Na izany aza, rehefa nanoratra sombin-kaody ho an'ny lahatsoratra aho, dia efa hariva ny andro, na ny alina mihitsy aza, ary nanapa-kevitra aho fa tonga ny fotoana hiantsoana azy ho andro iray.

Manantena aho fa nahaliana anao izany ary te hanandrana ny mpanadihady PVS-Studio.

Azonao atao ny misintona ny mpanadihady ary mahazo ny lakilen'ny mpitrandraka harena ankibon'ny tany ao ity pejy ity.

Ny tena zava-dehibe dia ampiasao tsy tapaka ny fanadihadiana static. Fanamarinana indray mandeha, nataonay mba hampalaza ny metodôlôjia amin'ny fanadihadiana static ary ny PVS-Studio dia tsy scenario mahazatra.

Mirary soa amin'ny fanatsarana ny kalitao sy ny fahamendrehan'ny kaodinao!

Mitady bibikely ao amin'ny LLVM 8 amin'ny fampiasana ny mpandinika PVS-Studio

Raha te hizara ity lahatsoratra ity amin'ny mpihaino miteny anglisy ianao dia ampiasao ny rohy fandikan-teny: Andrey Karpov. Mitady Bug ao amin'ny LLVM 8 miaraka amin'ny PVS-Studio.

Source: www.habr.com

Add a comment