Su'eina o mea sese ile LLVM 8 ile fa'aogaina ole PVS-Studio analyzer

Su'eina o mea sese ile LLVM 8 ile fa'aogaina ole PVS-Studio analyzer
E silia ma le lua tausaga ua mavae talu mai le siaki code mulimuli o le poloketi LLVM e faʻaaoga ai le matou suʻega PVS-Studio. Sei o tatou mautinoa o le PVS-Studio analyzer o loʻo avea pea ma meafaigaluega taʻutaʻua mo le iloa o mea sese ma faʻafitauli faʻaletonu. Ina ia faia lenei mea, matou te siakiina ma maua ni mea sese fou i le LLVM 8.0.0 faʻamalolo.

E tatau ona tusia

E fa'amaoni, ou te le'i mana'o e tusia lenei tala. E le manaia le tusi e uiga i se poloketi ua uma ona matou siakiina i le tele o taimi (1, 2, 3). E sili atu le tusi e uiga i se mea fou, ae leai sau filifiliga.

So'o se taimi e tu'u mai ai pe fa'afou se fa'afouga fou o le LLVM Clang Static Analyzer, matou te mauaina fesili o ituaiga nei i la matou meli:

Va'ai, o le lomiga fou o le Clang Static Analyzer ua aʻoaʻoina e suʻe ni mea sese fou! E foliga mai ia te aʻu o le taua o le faʻaaogaina o le PVS-Studio o loʻo faʻaitiitia. Ua maua e Clang nisi mea sese nai lo le taimi muamua ma maua ai le malosi o le PVS-Studio. O le a sou manatu i lenei mea?

I lenei mea ou te manaʻo pea e tali se mea e pei o:

Tatou te le nofonofo foi! Ua matou faʻaleleia atili le gafatia o le PVS-Studio analyzer. Aua la e te popole, o loo faaauau pea ona taʻitaʻia e pei ona iai muamua.

Ae paga lea, o se tali leaga lea. E leai ni faamaoniga i totonu. Ma o le mafuaaga lena ua ou tusia ai lenei tusiga i le taimi nei. O lea la, ua toe siaki le poloketi LLVM ma ua tele mea sese ua maua i totonu. O le a ou faʻaalia nei mea na foliga fiafia ia te aʻu. E le mafai e le Clang Static Analyzer ona maua nei mea sese (pe e matua faigata lava ona fai ma lana fesoasoani). Ae tatou te mafaia. E le gata i lea, na ou mauaina ma tusi i lalo nei mea sese uma i le afiafi e tasi.

Ae o le tusiaina o le tusiga na alu ai ni nai vaiaso. Na le mafai ona ou faʻatagaina aʻu lava e tuʻu uma nei mea i totonu o tusitusiga :).

I le auala, afai e te fiafia i tekinolosi o loʻo faʻaaogaina i le PVS-Studio analyzer e iloa ai mea sese ma faʻafitauli faʻaletonu, ona ou fautua atu lea ia e masani i lenei mea. tusi.

Fa'ailoga fou ma tuai

E pei ona taʻua muamua, pe a ma le lua tausaga talu ai na toe siaki ai le poloketi LLVM, ma faʻasaʻo mea sese na maua. O lenei tusiga o le a tuʻuina atu se vaega fou o mea sese. Aisea na maua ai ni pepe fou? E 3 mafuaaga mo lenei mea:

  1. O loʻo faʻaleleia le poloketi LLVM, suia le tulafono tuai ma faʻaopoopo le code fou. E masani lava, o loʻo i ai ni mea sese fou i le suiga ma le tusiaina o tulafono. O lo'o fa'aalia manino mai ai e tatau ona fa'aoga masani, ae le o nisi taimi. O a matou tusiga o loʻo faʻaalia lelei le gafatia o le PVS-Studio analyzer, ae leai se mea e fai i le faʻaleleia atili o le code code ma faʻaitiitia le tau o le faʻasaʻoina o mea sese. Fa'aaogā se su'esu'ega fa'ailoga fa'amaumau i taimi uma!
  2. O loʻo matou faʻamaeʻaina ma faʻaleleia suʻesuʻega o loʻo iai. O le mea lea, e mafai e le tagata suʻesuʻe ona iloa mea sese na te leʻi matauina i le taimi o suʻesuʻega muamua.
  3. Fa'ailoga fou ua fa'aalia i le PVS-Studio e le'i iai i le 2 tausaga talu ai. Na ou filifili e faʻamaonia i latou i se isi vaega e faʻaalia manino ai le atinaʻeina o le PVS-Studio.

Fa'aletonu na iloa e su'esu'ega sa iai i le 2 tausaga talu ai

Vaega N1: Kopi-Pape

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 lapataiga: V501 [CWE-570] E iai fa'amatalaga tutusa 'Name.startswith("avx512.mask.permvar.")' i le agavale ma le taumatau o le '||' fa'afoe. AutoUpgrade.cpp 73

E faalua ona siaki e amata le igoa i le substring "avx512.mask.permvar.". I le siaki lona lua, e manino lava sa latou mananao e tusi se isi mea, ae galo e faasaʻo le kopi kopi.

Vaega N2: Fa'ailoga

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

Lapata'iga PVS-Studio: V501 E iai fa'amatalaga tutusa 'CXNameRange_WantQualifier' ile agavale ma le taumatau ole '|' fa'afoe. CIindex.cpp 7245

Ona o se fa'aoga sese, o le mea lava e tasi e ta'ua tumau e fa'aaoga faalua CXNameRange_WantQualifier.

Vaega N3: Fenumia'i ma le fa'amuamua a le tagata fa'afoe

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

PVS-Studio lapataiga: V502 [CWE-783] Masalo o le '?:' e galue i se auala ese nai lo le mea na faamoemoeina. O le '?:' e maualalo le fa'amuamua nai lo le '==' operator. PPCTargetTransformInfo.cpp 404

I lo'u manatu, o se mea sese sili lea ona matagofie. Ioe, ou te iloa e iai oʻu manatu uiga ese e uiga i le matagofie :).

O lenei, e tusa ai ma mea e ave i ai le faamuamua, o le fa'aaliga e iloiloina e pei ona taua i lalo:

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

Mai se vaaiga faʻapitoa, o sea tulaga e le talafeagai, talu ai e mafai ona faʻaititia i:

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

O se mea sese manino lea. E foliga mai, na latou mananaʻo e faʻatusatusa le 0/1 ma se fesuiaiga limatusi. Ina ia faʻapipiʻi le code e te manaʻomia le faʻaopoopoina o puipui i luga o le faʻaogaina o le ternary:

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

I le ala, o le ternary operator e matua mataʻutia ma faʻaosoosoina mea sese. Ia matua faaeteete i ai ma aua le matapeapea i puipui. Sa ou tilotilo atili i lenei autu iinei, i le mataupu “Faaeteete i le ?: Operator ma Faapipii i Tuatusi.”

Vaega 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 lapataiga: V522 [CWE-476] Fa'ate'a le fa'asinomaga ole 'LHS' e ono tupu. TGParser.cpp 2152

Afai o le faasino LHS e null, e tatau ona tuʻuina atu se lapataiga. Ae ui i lea, nai lo lena, o lenei lava null pointer o le a faʻaaogaina: LHS->getAsString().

O se tulaga masani lea pe a natia se mea sese i se tagata e faʻaaogaina mea sese, talu ai e leai se tasi e suʻeina. E su'esu'e e le au su'esu'e static code uma e mafai ona o'o iai, tusa lava pe fa'afia ona fa'aoga. O se fa'ata'ita'iga lelei tele lea o le fa'aogaina o su'esu'ega fa'ata'ita'i ma isi auala e puipuia ai mea sese.

Fa'apena fa'asino sese sese RHS fa'atagaina ile fa'ailoga o lo'o i lalo: V522 [CWE-476] Fa'ate'aina le fa'asinoala 'RHS' e ono tupu. TGParser.cpp 2186

Vaega N6: Fa'aaoga le fa'asino pe a uma ona gaioi

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

Lapataiga a le PVS-Studio: V522 [CWE-476] E ono tupu le fa'ai'uga ole fa'ailoga ole 'ProgClone'. Micompilation.cpp 601

I le amataga o se faʻailoga atamai ProgClone taofia le umiaina o le mea faitino:

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

O le mea moni, i le taimi nei ProgClone o se fa'ailo null. O le mea lea, e tatau ona tupu se fa'ailoga fa'ailo i lalo ifo:

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

Ae, o le mea moni, e le tupu lenei mea! Manatua o le matasele e leʻi faia moni.

I le amataga o le koneteina Miscompiled Functions kilia:

MiscompiledFunctions.clear();

O le isi, o le tele o lenei atigipusa o loʻo faʻaaogaina i le tulaga matasele:

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

E faigofie ona iloa e le o amataina le matasele. Ou te manatu o lenei foi o se pusa ma o le code e tatau ona tusi ese.

E foliga mai ua tatou fetaiaʻi ma lenā vaega taʻutaʻua o mea sesē! E ufiufi e le tasi mea sese le isi :).

Vaega N7: Fa'aaoga le fa'asino pe a uma ona gaioi

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

Lapataiga a le PVS-Studio: V522 [CWE-476] Fa'ate'a le fa'asinomaga ole 'Su'ega' e ono tupu. Micompilation.cpp 709

Toe tutusa le tulaga. I le taimi muamua, o mea o loʻo i totonu o le mea e faʻafefe, ona faʻaaogaina lea e pei e leai se mea na tupu. Ou te vaʻaia lenei tulaga e sili atu ma sili atu i le polokalame code pe a uma le faʻaogaina o semantics i le C ++. O le mea lea ou te fiafia ai i le gagana C++! E tele ma sili atu auala fou e fana ai lou lava vae. O le PVS-Studio analyzer o le a iai pea galuega :).

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

Lapataiga a le PVS-Studio: V522 [CWE-476] Fa'ate'aina le fa'asinoala 'ituaiga' e ono tupu. PrettyFunctionDumper.cpp 233

I le fa'aopoopoina i fa'atonu mea sese, e masani ona le fa'ata'ita'iina galuega fa'apipi'i lolomi. O loo i ai se mataupu faapena i o tatou luma. O loʻo faʻatali le galuega mo le tagata faʻaoga, o ia, nai lo le foia o ona faʻafitauli, o le a faʻamalosia e faʻaleleia.

Tauagavale:

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

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

Lapataiga a le PVS-Studio: V522 [CWE-476] E ono tupu le fa'ai'uga o le fa'ailo 'Ty'. SearchableTableEmitter.cpp 614

Ou te manatu o loʻo manino mea uma ma e le manaʻomia se faʻamatalaga.

Vaega N10: Fa'ailoga

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 lapataiga: V570 O le 'Identifier-> Type' fesuia'i ua tu'uina atu ia te ia lava. FormatTokenLexer.cpp 249

E leai se aoga i le tofiaina o se fesuiaiga ia te ia lava. E foliga mai na latou mananao e tusi:

Identifier->Type = Question->Type;

Vaega N11: Ta'otoga masalomia

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 lapataiga: V622 [CWE-478] Mafaufau e asiasia le 'switch' faʻamatalaga. Atonu o lo'o misi le fa'atonu muamua 'mataupu'. SystemZAsmParser.cpp 652

O loʻo i ai se tagata faʻatautaia masalosalo i le amataga malologa. Na galo ia te oe e tusi se isi mea iinei?

Vaega N12: Siakiina se fa'asinoala pe a mae'a fa'aleaogaina

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 lapataiga: V595 [CWE-476] O le 'Callee' pointer na fa'aaoga a'o le'i fa'amaonia e le nullptr. Siaki laina: 172, 174. AMDGPUInline.cpp 172

Указатель Callee i le amataga e dereference i le taimi e valaau ai le galuega mauaTTI.

Ona aliali mai lea e tatau ona siaki lenei faʻailoga mo le tutusa nullptr:

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

Ae ua tuai tele…

Pepa N13 - N...: Siakiina se fa'ailoga pe a uma ona fa'aleaogaina

O le tulaga na talanoaina i le vaega muamua o le code fragment e le tulaga ese. E aliali mai iinei:

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

Lapataiga a le PVS-Studio: V595 [CWE-476] O le 'CalleeFn' fa'asino na fa'aaoga a'o le'i fa'amaonia e le nullptr. Siaki laina: 1079, 1081. SimplifyLibCalls.cpp 1079

Ma iinei:

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

Lapata'iga PVS-Studio: V595 [CWE-476] O le 'ND' fa'asino na fa'aaoga a'o le'i fa'amaonia mai le nullptr. Siaki laina: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Ma iinei:

  • V595 [CWE-476] O le 'U' fa'asino na fa'aaoga a'o le'i fa'amaonia e le nullptr. Siaki laina: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] O le 'ND' pointer na fa'aaogaina a'o le'i fa'amaonia e le nullptr. Siaki laina: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Ona ou le fiafia ai lea i le suesueina o lapataiga ma le numera V595. O lea ou te le iloa pe sili atu mea sese tutusa e ese mai i mea o loʻo lisiina iinei. E foliga mai e iai.

Vaega N17, N18: Sifi masalomia

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

PVS-Studio lapataiga: V629 [CWE-190] Mafaufau e asiasia le '~(Size - 1) << 1' fa'aaliga. Siitia siisii ​​o le tau 32-bit fa'atasi ai ma se fa'alautelega mulimuli ane i le ituaiga 64-bit. AArch64AddressingModes.h 260

Atonu e le o se pusa ma o le code e galue tonu e pei ona fuafuaina. Ae e manino lava o se nofoaga sili ona masalomia ma e tatau ona siaki.

Se'i tatou fai atu le fesuiaiga fua e tutusa ma le 16, ona fuafua ai lea e le tusitala o le code e maua i se fesuiaiga NImms uiga:

1111111111111111111111111111111111111111111111111111111111100000

Ae ui i lea, o le mea moni o le taunuuga o le a:

0000000000000000000000000000000011111111111111111111111111100000

O le mea moni o faʻatusatusaga uma e tupu i le faʻaaogaina o le 32-bit unsigned type. Ma naʻo le taimi lena, o lenei ituaiga 32-bit e leʻi faʻailogaina o le a faʻalauteleina faʻalautele i uint64_t. I lenei tulaga, o le pito sili ona taua o le a leai.

E mafai ona e faaleleia le tulaga e pei o lenei:

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

Tulaga tutusa: V629 [CWE-190] Mafaufau e asiasia le faaupuga 'Immr << 6'. Siitia siisii ​​o le tau 32-bit fa'atasi ai ma se fa'alautelega mulimuli ane i le ituaiga 64-bit. AArch64AddressingModes.h 269

Vaega N19: Ua misi upu autu isi?

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 lapataiga: V646 [CWE-670] Mafaufau e su'esu'e le fa'atatau ole talosaga. Atonu o lo'o misi le upu 'isi'. AMDGPUAsmParser.cpp 5655

E leai se mea sese iinei. Talu mai lena taimi-poloka o le muamua if faaiuina i faaauau pea, ona le afaina lea, o loʻo i ai se upu autu isi pe leai. Po o le a lava le auala e galue tutusa le code. Ua misia lava isi faia le code sili atu ona le malamalama ma matautia. Afai i le lumanai faaauau pea mou atu, o le a amata ona galue le code e matua ese lava. I lo'u manatu e sili ona faaopoopo isi.

Vaega N20: Fa fa'ailoga o le ituaiga tutusa

LLVM_DUMP_METHOD void Symbol::dump(raw_ostream &OS) const {
  std::string Result;
  if (isUndefined())
    Result += "(undef) ";
  if (isWeakDefined())
    Result += "(weak-def) ";
  if (isWeakReferenced())
    Result += "(weak-ref) ";
  if (isThreadLocalValue())
    Result += "(tlv) ";
  switch (Kind) {
  case SymbolKind::GlobalSymbol:
    Result + Name.str();                        // <=
    break;
  case SymbolKind::ObjectiveCClass:
    Result + "(ObjC Class) " + Name.str();      // <=
    break;
  case SymbolKind::ObjectiveCClassEHType:
    Result + "(ObjC Class EH) " + Name.str();   // <=
    break;
  case SymbolKind::ObjectiveCInstanceVariable:
    Result + "(ObjC IVar) " + Name.str();       // <=
    break;
  }
  OS << Result;
}

PVS-Studio lapataiga:

  • V655 [CWE-480] O manoa na tu'ufa'atasia ae le'o fa'aaogaina. Mafaufau e asiasia le 'Result + Name.str()' fa'aaliga. Faailoga.cpp 32
  • V655 [CWE-480] O manoa na tu'ufa'atasia ae le'o fa'aaogaina. Mafaufau e asiasia le 'I'uga + "(ObjC Vasega)" + Name.str()' fa'aaliga. Faailoga.cpp 35
  • V655 [CWE-480] O manoa na tu'ufa'atasia ae le'o fa'aaogaina. Mafaufau e asiasia le 'Result + "(ObjC Class EH) " + Name.str()' fa'aaliga. Faailoga.cpp 38
  • V655 [CWE-480] O manoa na tu'ufa'atasia ae le'o fa'aaogaina. Mafaufau e asiasia le 'Result + "(ObjC IVar)" + Name.str()' fa'aaliga. Faailoga.cpp 41

I se faʻalavelave, o le + operator e faʻaaogaina nai lo le += operator. O le taunuuga o mamanu e leai se uiga.

Vaega N21: Amioga le fa'amalamalamaina

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

Taumafai e su'e oe lava le code matautia. Ma o se ata lenei e faʻalavelave ai le mafaufau ina ia le vave tilotilo i le tali:

Su'eina o mea sese ile LLVM 8 ile fa'aogaina ole PVS-Studio analyzer

PVS-Studio lapataiga: V708 [CWE-758] Faiga mata'utia e fa'aogaina: 'FeaturesMap[Op] = FeaturesMap.size()', lea 'FeaturesMap' o le vasega 'map'. E ono o'o atu ai i amioga e le'i fa'amalamalamaina. RISCVCompressInstEmitter.cpp 490

Laina fa'afitauli:

FeaturesMap[Op] = FeaturesMap.size();

Afai elemene Op e le maua, ona faia lea o se elemene fou i le faafanua ma tusia ai iina le numera o elemene i lenei faafanua. E le o iloa pe o le a valaʻau le galuega fua i luma po'o le mae'a ona fa'aopoopoina se elemene fou.

Vaega N22-N24: Tofiga fai fai

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 lapataiga: V519 [CWE-563] O le fesuiaiga o le 'NType' e tu'u fa'alua fa'alua fa'asologa. Atonu o se mea sese lea. Siaki laina: 1663, 1664. MachOObjectFile.cpp 1664

Ou te manatu e leai se mea sese moni iinei. Na'o se tofiga faifaipea e le mana'omia. Ae ose mea sese.

E faapena foi:

  • V519 [CWE-563] O le fesuiaiga o le 'B.NDesc' e fa'alua fa'alua ona tu'u fa'asologa. Atonu o se mea sese lea. Siaki laina: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] O le fesuiaiga e tuʻuina atu faʻalua faʻalua faʻasolosolo. Atonu o se mea sese lea. Siaki laina: 59, 61. coff2yaml.cpp 61

Vaega N25-N27: Toe fa'aopoopoina

Se'i o tatou va'ava'ai i se fa'aliliuga la'ititi la'ititi o le toe tofiaina.

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

Lapataiga a le PVS-Studio: V519 [CWE-563] O le fesuiaiga o le 'Alignment' o lo'o tu'uina atu fa'alua fa'asolosolo. Atonu o se mea sese lea. Siaki laina: 1158, 1160. LoadStoreVectorizer.cpp 1160

Ose code uiga ese lea e foliga mai o loʻo i ai se mea sese. I le amataga, fesuiaiga gatasi o se tau e tofia e fuafua i le tulaga. Ona toe tupu lea o le tofiga, ae o le taimi nei e aunoa ma se siaki.

E mafai ona va'aia tulaga fa'apenei:

  • V519 [CWE-563] O le 'Aafiaga' fesuia'i e tu'u fa'alua fa'alua fa'asologa. Atonu o se mea sese lea. Siaki laina: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] O le fesuiaiga o le 'ExpectNoDerefChunk' e fa'alua ona tu'u fa'alua fa'asologa. Atonu o se mea sese lea. Siaki laina: 4970, 4973. SemaType.cpp 4973

Vaega N28: Tulaga moni i taimi uma

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 lapataiga: V547 [CWE-571] Fa'aaliga 'nextByte != 0x90' e moni i taimi uma. X86DisassemblerDecoder.cpp 379

E le talafeagai le siaki. Fesuia'i NextByte e le tutusa i taimi uma ma le tau 0x90, lea e mulimuli mai i le siaki muamua. O se ituaiga o mea sese.

Vaega N29 - N...: Tulaga moni/sese i taimi uma

O loʻo tuʻuina atu e le tagata suʻesuʻe le tele o lapataiga o le tulaga atoa (V547) po'o se vaega (V560) e moni pe sese i taimi uma. E masani lava e le o ni mea sese moni, ae naʻo le faʻailoga faʻailoga, o le taunuuga o le faʻalauteleina o macro, ma isi. Peitaʻi, e talafeagai le vaai atu i nei lapataʻiga uma, ona o mea sesē saʻo moni e tupu mai lea taimi i lea taimi. Mo se faʻataʻitaʻiga, o lenei vaega o le code e masalomia:

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 lapataiga: V560 [CWE-570] O se vaega o fa'amatalaga tu'utu'uga e sese i taimi uma: RegNo == 0xe. ARMDisassembler.cpp 939

Ole 0xE faifaipea ole tau ole 14 ile tesimale. Su'ega RegNo == 0xe e le talafeagai aua afai Numera Numera > 13, ona fa'auma lea o le fa'atinoga.

E tele isi lapataiga ma ID V547 ma V560, ae pei o V595, sa ou le fiafia e suesue i nei lapataiga. Ua uma ona manino ua lava au mea e tusi ai se tusiga :). O le mea lea, e le o iloa pe fia le tele o mea sese o lenei ituaiga e mafai ona iloa i le LLVM e faʻaaoga ai le PVS-Studio.

O le a ou tuʻuina atu ia te oe se faʻataʻitaʻiga pe aisea e le manaia ai le suʻesuʻeina o nei faʻaoso. E matua sa'o lava le tagata su'esu'e i le tu'uina atu o se lapataiga mo le code lea. Ae e le o se mea sese lea.

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

PVS-Studio Lapataiga: V547 [CWE-570] Fa'amatalaga '!HasError' e sese i taimi uma. UnwrappedLineParser.cpp 1635

Vaega N30: ​​Toe foʻi masalomia

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 lapataiga: V612 [CWE-670] O se 'toe fo'i' e aunoa ma se fa'atuatuvale i totonu o se matasele. R600OptimizeVectorRegisters.cpp 63

O se mea sese poʻo se metotia faʻapitoa e faʻamoemoe e faʻamatalaina se mea i tagata fai polokalame o loʻo faitauina le code. O lenei mamanu e le faʻamatalaina se mea ia te aʻu ma foliga masalosalo tele. E sili le aua le tusia fa'apea :).

Lelava? Ona o'o lea i le taimi e fai ai le lauti po'o le kofe.

Su'eina o mea sese ile LLVM 8 ile fa'aogaina ole PVS-Studio analyzer

Fa'aletonu ua iloa e su'esu'ega fou

Ou te manatu ua lava le 30 faʻagaioiga o suʻesuʻega tuai. Se'i o tatou va'ai nei po'o a ni mea manaia e mafai ona maua i fa'ama'i fou na fa'aalia i le su'esu'ega mulimuli ane talu ai siaki. I le aofaʻi, 66 faʻataʻitaʻiga faʻapitoa faʻapitoa na faʻaopoopoina i le suʻega C++ i lea taimi.

Vaega N31: Fa'ailoga e le mafai ona aapa atu

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 lapataiga: V779 [CWE-561] Fa'ailoga e le mafai ona maua. E ono iai se mea sese. ExecutionUtils.cpp 146

E pei ona e vaʻaia, o lala uma e lua o le tagata faʻatautaia if fa'ai'u ile telefoni ile fa'afoe foʻi. E tusa ai, o le koneteina CtorDtorsByPriority o le a le mafai lava ona kilia.

Vaega N32: Fa'ailoga e le mafai ona aapa atu

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

Lapataiga PVS-Studio: V779 [CWE-561] Fa'ailoga e le mafai ona maua. E ono iai se mea sese. LLParser.cpp 835

Tulaga manaia. Se'i o tatou va'ai muamua i le nofoaga lea:

return ParseTypeIdEntry(SummaryID);
break;

I le tepa muamua, e foliga mai e leai se mea sese iinei. E foliga mai o le tagata faafoe malologa o lo'o i ai se isi fa'aopoopo iinei, ma e mafai lava ona e tapeina. Ae ui i lea, e le o mea uma e faigofie.

E tuʻuina atu e le suʻega se lapataiga i luga o laina:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Ma e moni lava, o lenei code e le mafai ona maua. O mataupu uma i totonu suiga fa'ai'u ile telefoni mai le fa'afoe foʻi. Ma o lea ua leai se mafaufau na o oe malologa e foliga mai e le afaina tele! Masalo o se tasi o lala e tatau ona muta i malologa, e le o luga foʻi?

Vaega N33: Toe seti fa'afuase'i o pito maualuluga

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 lapataiga: V784 O le lapo'a o le pusi ufimata e la'ititi nai lo le lapo'a muamua. O lenei mea o le a mafua ai le leiloa o pito maualuga. RuntimeDyld.cpp 815

Faamolemole ia matau o le galuega getStubAlignment toe faafoi ituaiga lē saini. Sei o tatou fuafua le tau o le faʻamatalaga, ma le manatu o le galuega e toe faʻafoʻi le tau 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

Ia matau o le fesuiaiga Tele Fa'amaumauga ei ai se ituaiga 64-bit e le'i sainia. E aliali mai pe a fa'atino le Fa'atonuga & 0xFFFFFFF8u fa'agaioiga, o le a toe fa'afo'i uma le tolusefulu-lua pa'u maualuga i le zero. E foliga mai, e le o le mea lea na manaʻo ai le fai polokalame. Ou te masalo na ia manaʻo e faʻatatau: DataSize & 0xFFFFFFFFFFFFFFF8u.

Ina ia foia le mea sese, e tatau ona e tusia lenei:

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

A faʻapea:

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

Vaega N34: Fa'alilolilo ituaiga lafo

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 lapataiga: V1028 [CWE-190] E ono tafe mai. Manatu e lafo operand o le 'NumElts * Scale' i le ituaiga 'size_t', ae le o le taunuuga. X86ISelLowering.h 1577

E fa'aogaina le tu'i fa'ama'oti e 'alofia ai le so'amu pe a fa'atele ituaiga fesuiaiga int. Ae ui i lea, o le tu'i fa'ailoga manino iinei e le puipuia mai le lolovaia. Muamua, o le a faʻateleina fesuiaiga, ma naʻo le 32-bit iʻuga o le faʻateleina o le a faʻalauteleina i le ituaiga tele_t.

Vaega N35: Ua le mafai ona kopi ma faapipii

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] E lua vaega fa'ailoga tutusa na maua. Masalo, o se typo lea ma 'Op1' fesuiaiga e tatau ona faʻaoga nai lo le 'Op0'. InstCombineCompares.cpp 5507

O lenei su'esu'ega manaia fou e iloa ai tulaga na kopiina ai se fasi code ma ua amata ona suia nisi o igoa i totonu, ae i se tasi nofoaga latou te le'i faasa'oina.

Faamolemole ia matau o le poloka lona lua na latou suia Op0 i Op1. Ae i se tasi nofoaga latou te lei faaleleia. E foliga mai e tatau ona tusia e pei o lenei:

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

Vaega N36: Fenumia'i Fesuia'i

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

PVS-Studio lapataiga: V1001 [CWE-563] O le 'Mode' fesuia'i ua tu'uina ae e le fa'aaogaina i le fa'ai'uga o le galuega. SIModeRegister.cpp 48

E matua matautia lava le tuuina atu o finauga tau galuega i igoa tutusa ma tagata o le vasega. E matua faigofie lava ona fenumiai. O loo i ai se mataupu faapena i o tatou luma. E le talafeagai lenei faaupuga:

Mode &= Mask;

E sui le finauga o galuega. Pau lava lena. O lenei finauga ua le toe faaaogaina. Atonu na tatau ona e tusia e pei o lenei:

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

Vaega N37: Fenumia'i Fesuia'i

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

Lapataiga PVS-Studio: V1001 [CWE-563] O le 'Lapo'a' ​​fesuia'i ua tofia ae e le'o fa'aaogaina i le faaiuga o le galuega. Object.cpp 424

E talitutusa le tulaga ma le tulaga muamua. E tatau ona tusia:

this->Size += this->EntrySize;

Vaega N38-N47: Ua galo ia i latou le siakiina o le faasino igoa

I le taimi muamua, na matou vaʻavaʻai i faʻataʻitaʻiga o faʻamaʻi faʻamaʻi V595. O lona uiga o le fa'ailo ua fa'ate'aina i le amataga, ona fa'atoa siaki ai lea. Su'esu'ega talavou V1004 o le faafeagai i lona uiga, ae faaalia ai foi le tele o mea sese. E iloa ai tulaga na siaki ai le fa'asino ile amataga ona galo ai lea ona fai. Se'i o tatou va'ava'ai i ia tulaga o lo'o maua ile 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());  // <=
  ....
}

Lapata'iga PVS-Studio: V1004 [CWE-476] O le 'Ptr' fa'ailoga sa fa'aoga le saogalemu ina ua uma ona fa'amaonia e le nullptr. Siaki laina: 729, 738. TargetTransformInfoImpl.h 738

Fesuiaiga Ptr atonu e tutusa nullptr, e pei ona molimauina e le siaki:

if (Ptr != nullptr)

Ae ui i lea, i lalo ifo o lenei faʻailoga e faʻaaogaina e aunoa ma se siaki muamua:

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

Seʻi o tatou iloiloina se isi tulaga faapena.

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

Lapataiga a le PVS-Studio: V1004 [CWE-476] O le 'FD' fa'ailoga sa fa'aoga le saogalemu ina ua mae'a fa'amaonia i le nullptr. Siaki laina: 3228, 3231. CGDebugInfo.cpp 3231

Fa'alogo lelei i le fa'ailoga FD. Ou te mautinoa o loʻo manino le faʻafitauli ma e leai se faʻamatalaga faʻapitoa e manaʻomia.

Ma le isi:

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

Lapataiga a le PVS-Studio: V1004 [CWE-476] O le 'PtrTy' fa'ailoga sa fa'aoga le saogalemu ina ua mae'a fa'amaonia i le nullptr. Siaki laina: 960, 965. InterleavedLoadCombinePass.cpp 965

E faapefea ona puipuia oe mai ia mea sese? Faʻalogo atili ile Code-Review ma faʻaoga le PVS-Studio static analyzer e siaki ai lau code.

E leai se aoga i le taʻua o isi vaega faʻailoga ma mea sese o lenei ituaiga. O le a ou tuua na o se lisi o lapataiga i le tusiga:

  • V1004 [CWE-476] O le 'Expr' fa'asino na fa'aoga le saogalemu ina ua uma ona fa'amaonia e le nullptr. Siaki laina: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] O le 'PI' fa'asino na fa'aoga le saogalemu ina ua uma ona fa'amaonia e le nullptr. Siaki laina: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] O le 'StatepointCall' fa'ailoga sa fa'aogaina le saogalemu ina ua uma ona fa'amaonia i le nullptr. Siaki laina: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] O le 'RV' fa'ailoga sa fa'aogaina le saogalemu ina ua uma ona fa'amaonia e le nullptr. Siaki laina: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] O le 'CalleeFn' na fa'aoga le saogalemu ina ua mae'a fa'amaonia i le nullptr. Siaki laina: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] O le 'TC' fa'ailoga sa fa'aogaina le saogalemu ina ua uma ona fa'amaonia e le nullptr. Siaki laina: 1819, 1824. Driver.cpp 1824

Vaega N48-N60: E le taua, ae o se fa'aletonu (atonu e le mafai ona manatua)

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

PVS-Studio lapataiga: V1023 [CWE-460] E fa'aopoopoina le fa'asino e aunoa ma le pule ile koneteina 'Strategies' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-isel-fuzzer.cpp 58

E faaopoopo se elemene i le pito o se atigipusa pei std::vector > e le mafai ona e tusitusi xxx.push_back(X fou), talu ai e leai se liua manino mai X* в std::tulaga_ptr.

O se fofo masani o le tusitusi xxx.emplace_back(X fou)talu ona tuufaatasia: metotia emplace_back fausia sa'o se elemene mai ana finauga ma mafai ai ona fa'aoga fau fau.

E le saogalemu. Afai ua tumu le vector, ona toe fa'asoaina lea o le manatua. Atonu e le manuia le fa'agaioiga o le toe fa'avasegaina o manatua, ma mafua ai ona lafo se fa'alavelave std::bad_alloc. I lenei tulaga, o le a leiloa le faʻailoga ma o le mea na faia e le mafai lava ona tapeina.

O se fofo saogalemu o le fatuina unique_ptrlea o le a umia le faʻailoga aʻo leʻi taumafai le vector e toe faʻavasega manatua:

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

Talu mai le C++ 14, e mafai ona e faʻaogaina 'std::make_unique':

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

O lenei ituaiga o faaletonu e le taua mo le LLVM. Afai e le mafai ona tuʻuina atu le manatua, o le a tuʻu lava le tuʻufaʻatasia. Ae ui i lea, mo talosaga e umi uptime, lea e le mafai ona fa'amutaina pe a le manuia le faasoasoaina o manatua, e mafai ona avea ma se mea leaga moni.

O lea la, e ui lava o lenei tulafono e le o se faʻamataʻu aoga i le LLVM, na ou iloa e aoga le talanoa e uiga i lenei mamanu sese ma o le PVS-Studio analyzer ua aʻoaʻoina e iloa ai.

O isi lapataiga o lenei ituaiga:

  • V1023 [CWE-460] E fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Passes' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. PassManager.h 546
  • V1023 [CWE-460] E fa'aopoopoina le fa'asino e aunoa ma le pule ile koneteina 'AA' ile 'emplace_back' auala. O le a tupu se lepa manatua pe a iai se tuusaunoaga. AliasAnalysis.h 324
  • V1023 [CWE-460] E fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Entries' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] E fa'aopoopoina le fa'asino e aunoa ma le pule ile koneteina 'AllEdges' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. CFGMST.h 268
  • V1023 [CWE-460] E fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'VMaps' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'asino e aunoa ma le pule ile koneteina 'Fa'amaumauga' ile 'emplace_back' auala. O le a tupu se lepa manatua pe a iai se tuusaunoaga. FDRLogBuilder.h 30
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'PendingSubmodules' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. ModuleMap.cpp 810
  • V1023 [CWE-460] E fa'aopoopoina le fa'asino e aunoa ma le pule ile koneteina 'mea' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. DebugMap.cpp 88
  • V1023 [CWE-460] E fa'aopoopoina le fa'asino e aunoa ma le pule ile koneteina 'Ta'iala' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 685
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 686
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 688
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 689
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 690
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 691
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 692
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 693
  • V1023 [CWE-460] Ua fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Modifiers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. llvm-stress.cpp 694
  • V1023 [CWE-460] E fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Operands' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] E fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Stash' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] E fa'aopoopoina le fa'ailoga e aunoa ma le pule ile koneteina 'Matchers' ile auala 'emplace_back'. O le a tupu se lepa manatua pe a iai se tuusaunoaga. GlobalISelEmitter.cpp 2702

iʻuga

Na ou tuuina atu le 60 lapataiga i le aofaiga atoa ona taofi lea. E i ai isi fa'aletonu e iloa e le PVS-Studio analyzer i le LLVM? Ioe, ua ou maua. Ae ui i lea, ina ua ou tusia ni vaega o le code mo le tusiga, ua leva le afiafi, pe sili atu foi i le po, ma na ou filifili ai ua oo i le taimi e taʻua ai o se aso.

Ou te faʻamoemoe na e mauaina le manaia ma e te manaʻo e faʻataʻitaʻi le PVS-Studio analyzer.

E mafai ona e sii maia le su'esu'e ma maua le ki maina i lenei itulau.

O le mea pito sili ona taua, fa'aaoga fa'ata'ita'iga masani. E tasi le taimi siaki, faʻatinoina e matou ina ia faʻasalalau le metotia o suʻesuʻega faʻapitoa ma PVS-Studio e le o se faʻaaliga masani.

Manuia le fa'aleleia o le lelei ma le fa'amaoni o lau code!

Su'eina o mea sese ile LLVM 8 ile fa'aogaina ole PVS-Studio analyzer

Afai e te manaʻo e faʻasoa lenei tusiga i se faʻalogo Igilisi, faʻamolemole faʻaoga le fesoʻotaʻiga faʻaliliu: Andrey Karpov. Su'eina o Bugs i le LLVM 8 ma le PVS-Studio.

puna: www.habr.com

Faaopoopo i ai se faamatalaga