Kupeza nsikidzi mu LLVM 8 pogwiritsa ntchito PVS-Studio analyzer

Kupeza nsikidzi mu LLVM 8 pogwiritsa ntchito PVS-Studio analyzer
Zaka zoposa ziwiri zadutsa kuchokera pamene cheke chomaliza cha polojekiti ya LLVM pogwiritsa ntchito PVS-Studio analyzer. Tiyeni tiwonetsetse kuti PVS-Studio analyzer akadali chida chotsogola chodziwira zolakwika ndi zovuta zomwe zingachitike. Kuti tichite izi, tiwona ndikupeza zolakwika zatsopano pakumasulidwa kwa LLVM 8.0.0.

Nkhani yoti ilembedwe

Kunena zoona, sindinkafuna kulemba nkhaniyi. Ndizosasangalatsa kulemba za polojekiti yomwe tayang'anapo kangapo (1, 2, 3). Ndi bwino kulemba za zatsopano, koma ndilibe chochita.

Nthawi iliyonse mtundu watsopano wa LLVM umatulutsidwa kapena kusinthidwa Clang Static Analyzer, timalandira mafunso amtundu wotsatirawa m'makalata athu:

Onani, mtundu watsopano wa Clang Static Analyzer waphunzira kupeza zolakwika zatsopano! Zikuwoneka kwa ine kuti kufunika kogwiritsa ntchito PVS-Studio kukucheperachepera. Clang amapeza zolakwika zambiri kuposa kale ndipo amagwirizana ndi luso la PVS-Studio. Mukuganiza bwanji pa izi?

Kwa izi nthawi zonse ndikufuna kuyankha monga:

Ifenso sitikhala opanda ntchito! Tasintha kwambiri luso la PVS-Studio analyzer. Choncho musadandaule, tikupitiriza kutsogolera monga kale.

Tsoka ilo, ili ndi yankho loyipa. M’menemo mulibe maumboni. Ndipo ndicho chifukwa chake ndikulemba nkhaniyi tsopano. Chifukwa chake, polojekiti ya LLVM yawunikidwanso ndipo zolakwika zosiyanasiyana zapezeka mmenemo. Tsopano ndikuwonetsa zomwe zidandisangalatsa. Clang Static Analyzer sangapeze zolakwika izi (kapena ndizosautsa kwambiri kutero ndi chithandizo chake). Koma tingathe. Komanso, ndinapeza ndikulemba zolakwika zonsezi usiku umodzi.

Koma kulemba nkhaniyi kunatenga milungu ingapo. Sindinathe kubweretsa zonsezi m'malemba :).

Mwa njira, ngati muli ndi chidwi ndi matekinoloje omwe amagwiritsidwa ntchito mu PVS-Studio analyzer kuti azindikire zolakwika ndi zofooka zomwe zingatheke, ndiye ndikupangira kuti mudziwe bwino izi. Zindikirani.

Zatsopano ndi zakale diagnostics

Monga taonera kale, pafupifupi zaka ziwiri zapitazo polojekiti ya LLVM idawunikidwanso, ndipo zolakwika zomwe zidapezeka zidakonzedwa. Tsopano nkhaniyi ipereka mtanda watsopano wa zolakwika. N'chifukwa chiyani nsikidzi zatsopano zinapezeka? Pali zifukwa zitatu zochitira izi:

  1. Pulojekiti ya LLVM ikusintha, ikusintha ma code akale ndikuwonjezera nambala yatsopano. Mwachibadwa, pali zolakwika zatsopano mu code yosinthidwa ndi yolembedwa. Izi zikuwonetseratu kuti kusanthula static kuyenera kugwiritsidwa ntchito nthawi zonse, osati nthawi zina. Nkhani zathu zikuwonetsa bwino luso la PVS-Studio analyzer, koma izi sizikukhudzana ndi kukonza ma code komanso kuchepetsa mtengo wokonza zolakwika. Gwiritsani ntchito static code analyzer pafupipafupi!
  2. Tikumaliza ndi kukonza matenda omwe alipo. Chifukwa chake, wosanthula amatha kuzindikira zolakwika zomwe sanazindikire pamasinthidwe am'mbuyomu.
  3. Kuzindikira kwatsopano kwawonekera mu PVS-Studio yomwe kulibe zaka 2 zapitazo. Ndinaganiza zowawunikira m'gawo lina kuti ndiwonetsere bwino chitukuko cha PVS-Studio.

Zofooka zodziwika ndi matenda omwe analipo zaka 2 zapitazo

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

Chenjezo la PVS-Studio: V501 [CWE-570] Pali mawu ang'onoang'ono ofanana 'Name.startswith("avx512.mask.permvar.")' kumanzere ndi kumanja kwa '||' woyendetsa. AutoUpgrade.cpp 73

Imawunikiridwa kawiri kuti dzina limayamba ndi "avx512.mask.permvar". Mu cheke chachiwiri, mwachiwonekere ankafuna kulemba chinachake, koma anaiwala kukonza malemba omwe anakopera.

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

Chenjezo PVS-Studio: V501 Pali mawu ang'onoang'ono ofanana 'CXNameRange_WantQualifier' kumanzere ndi kumanja kwa '|' woyendetsa. CIndex.cpp 7245

Chifukwa cha typo, yemweyo dzina lake nthawi zonse amagwiritsidwa ntchito kawiri CXNameRange_WantQualifier.

Chidutswa N3: Chisokonezo ndi kutsogola kwa ogwiritsa ntchito

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

Chenjezo la PVS-Studio: V502 [CWE-783] Mwina wogwiritsa ntchito '?:' amagwira ntchito mosiyana ndi momwe amayembekezera. Wogwiritsa ntchito '?:' ali ndi zofunikira zochepa kuposa '=='. PCTTargetTransformInfo.cpp 404

Malingaliro anga, ichi ndi cholakwika chokongola kwambiri. Inde, ndikudziwa kuti ndili ndi malingaliro achilendo okhudza kukongola :).

Tsopano, molingana ndi zoyendetsera ntchito, mawuwa amawunikidwa motere:

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

Kuchokera kumalingaliro othandiza, chikhalidwe choterocho sichimveka, chifukwa chikhoza kuchepetsedwa kukhala:

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

Uku ndikulakwitsa koonekeratu. Mwinamwake, iwo ankafuna kufanizitsa 0/1 ndi kusintha Index. Kuti mukonze khodiyi muyenera kuwonjezera mabatani mozungulira wogwiritsa ntchito ternary:

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

Mwa njira, woyendetsa ternary ndi woopsa kwambiri ndipo amayambitsa zolakwika zomveka. Samalani nazo kwambiri ndipo musakhale aumbombo ndi mabatani. Ndinayang'ana mutuwu mwatsatanetsatane apa, m’mutu wakuti β€œChenjerani ndi ?: Woyendetsa ndi Kuikamo M’makolo.”

Chidutswa cha N4, N5: Cholozera chopanda pake

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

Chenjezo la PVS-Studio: V522 [CWE-476] Kuchotsedwa kwa null pointer 'LHS' kungachitike. TGParser.cpp 2152

Ngati pointer LHS palibe, chenjezo liyenera kuperekedwa. Komabe, m'malo mwake, null pointer yomweyi idzasiyanitsidwa: LHS->getAsString().

Izi ndizochitika zodziwika bwino ngati cholakwika chabisika mwa chowongolera zolakwika, popeza palibe amene amayesa. Osanthula osasunthika amayang'ana ma code onse opezeka, ngakhale atagwiritsidwa ntchito kangati. Ichi ndi chitsanzo chabwino kwambiri cha momwe kusanthula kosasunthika kumayenderana ndi kuyesa kwina ndi njira zotetezera zolakwika.

Cholakwika chofanana ndi chowongolera RHS zololedwa mu code ili pansipa: V522 [CWE-476] Kuchotsedwa kwa null pointer 'RHS' kungachitike. TGParser.cpp 2186

Chidutswa N6: Kugwiritsa ntchito cholozera mutasuntha

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

Chenjezo la PVS-Studio: V522 [CWE-476] Kuchotsedwa kwa null pointer 'ProgClone' kungachitike. Miscompilation.cpp 601

Pachiyambi chanzeru cholozera ProgClone akusiya kukhala ndi chinthucho:

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

Ndipotu, tsopano ProgClone ndi point point. Chifukwa chake, kuchotsedwa kwa null pointer kuyenera kuchitika pansipa:

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

Koma, zoona zake, izi sizidzachitika! Chonde dziwani kuti lupu silinakwaniritsidwe.

Kumayambiriro kwa chidebe MiscompiledFunctions kuchotsedwa:

MiscompiledFunctions.clear();

Kenako, kukula kwa chidebe ichi kumagwiritsidwa ntchito ngati lupu:

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

N'zosavuta kuona kuti kuzungulira sikuyambira. Ndikuganiza kuti ichinso ndi cholakwika ndipo code iyenera kulembedwa mosiyana.

Zikuwoneka kuti takumana ndi zolakwika zodziwika bwino! Cholakwika chimodzi chimabisa china :).

Chidutswa N7: Kugwiritsa ntchito cholozera mutasuntha

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

Chenjezo la PVS-Studio: V522 [CWE-476] Kuwongolera kwa null pointer 'Mayeso' kungachitike. Miscompilation.cpp 709

Mkhalidwe womwewo kachiwiri. Poyamba, zomwe zili mu chinthucho zimasunthidwa, ndiyeno zimagwiritsidwa ntchito ngati kuti palibe chomwe chachitika. Ndikuwona izi mochulukirachulukira pamapulogalamu apulogalamu pambuyo poti semantics yoyenda idawonekera mu C ++. Ichi ndichifukwa chake ndimakonda chilankhulo cha C ++! Pali njira zambiri zatsopano zowombera mwendo wanu. PVS-Studio analyzer idzakhala ndi ntchito nthawi zonse :).

Chidutswa cha N8: Cholozera chopanda pake

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

Chenjezo la PVS-Studio: V522 [CWE-476] Kuchepetsa kwa null pointer 'Type' kungachitike. PrettyFunctionDumper.cpp 233

Kuphatikiza pa zowongolera zolakwika, ntchito zosindikizira zolakwika nthawi zambiri siziyesedwa. Ife tiri ndi mlandu woterowo pamaso pathu. Ntchitoyi ikuyembekezera wogwiritsa ntchito, yemwe, m'malo mothetsa mavuto ake, adzakakamizika kukonza.

Molondola:

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

Chidutswa cha N9: Cholozera chopanda pake

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

Chenjezo la PVS-Studio: V522 [CWE-476] Kuchepetsa kwa null pointer 'Ty' kungachitike. SearchableTableEmitter.cpp 614

Ndikuganiza kuti zonse ndi zomveka ndipo sizifuna kufotokoza.

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

Chenjezo la PVS-Studio: V570 Kusintha kwa 'Identifier->Type' kumaperekedwa kwa wokha. FormatTokenLexer.cpp 249

Palibe chifukwa chodzipangira chosinthika chokha. Mwinamwake iwo ankafuna kulemba:

Identifier->Type = Question->Type;

Chidutswa cha N11: Kusweka kokayikitsa

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

Chenjezo la PVS-Studio: V622 [CWE-478] Ganizirani kuyang'ana mawu a 'switch'. Ndizotheka kuti woyendetsa 'case' woyamba akusowa. SystemZAsmParser.cpp 652

Pali munthu wokayikira kwambiri poyambira yopuma. Kodi mwaiwala kulemba zina apa?

Chidutswa cha N12: Kuyang'ana cholozera pambuyo pochotsa

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

Chenjezo la PVS-Studio: V595 [CWE-476] Cholozera cha 'Callee' chidagwiritsidwa ntchito chisanatsimikizidwe motsutsana ndi nullptr. Onani mizere: 172, 174. AMDGPUInline.cpp 172

Cholozera Calee pa chiyambi ndi dereferenced pa nthawi ntchito amatchedwa getTTI.

Ndipo zikuwoneka kuti cholozera ichi chiyenera kufufuzidwa kuti chikhale chofanana nullptr:

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

Koma nthawi yatha…

Chidutswa N13 - N...: Kuyang'ana cholozera pambuyo posiyanitsidwa

Zomwe zidakambidwa m'chidutswa cham'mbuyomu sizosiyana. Zikuwonekera apa:

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

Chenjezo la PVS-Studio: V595 [CWE-476] Cholozera cha 'CalleeFn' chidagwiritsidwa ntchito chisanatsimikizidwe motsutsana ndi nullptr. Yang'anani mizere: 1079, 1081. SimplifyLibCalls.cpp 1079

Ndipo apa:

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

Chenjezo la PVS-Studio: V595 [CWE-476] Cholozera cha 'ND' chinagwiritsidwa ntchito chisanatsimikizidwe motsutsana ndi nullptr. Yang'anani mizere: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Ndipo apa:

  • V595 [CWE-476] Cholozera cha 'U' chinagwiritsidwa ntchito chisanatsimikizidwe motsutsana ndi nullptr. Onani mizere: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Cholozera cha 'ND' chinagwiritsidwa ntchito chisanatsimikizidwe motsutsana ndi nullptr. Onani mizere: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Kenako ndinayamba kusafuna kuphunzira machenjezo a nambala V595. Chifukwa chake sindikudziwa ngati pali zolakwika zinanso zofananira kupatula zomwe zalembedwa apa. Mothekera kulipo.

Chidutswa cha N17, N18: Kusintha kokayikitsa

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

Chenjezo la PVS-Studio: V629 [CWE-190] Ganizirani kuyang'ana '~(Kukula - 1) <<1'. Kusintha pang'ono kwa mtengo wa 32-bit ndikukulitsa kotsatira ku mtundu wa 64-bit. AArch64AddressingModes.h 260

Sichingakhale cholakwika ndipo code imagwira ntchito monga momwe idafunira. Koma awa ndi malo okayikitsa kwambiri ndipo akuyenera kufufuzidwa.

Tinene kusinthasintha kukula ndi wofanana ndi 16, ndiyeno wolemba code anakonza kuti apeze izo mu variable NDIMI tanthauzo:

1111111111111111111111111111111111111111111111111111111111100000

Komabe, kwenikweni zotsatira zake zidzakhala:

0000000000000000000000000000000011111111111111111111111111100000

Chowonadi ndi chakuti kuwerengera konse kumachitika pogwiritsa ntchito mtundu wa 32-bit wosasainidwa. Ndipo pokhapokha, mtundu wosasainidwa wa 32-bit udzakulitsidwa mpaka alireza. Pankhaniyi, zigawo zofunika kwambiri zidzakhala zero.

Mutha kukonza vutoli motere:

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

Momwemonso: V629 [CWE-190] Lingalirani kuyang'ana mawu a 'Immr << 6'. Kusintha pang'ono kwa mtengo wa 32-bit ndikukulitsa kotsatira ku mtundu wa 64-bit. AArch64AddressingModes.h 269

Chidutswa N19: Mawu osakira china?

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

Chenjezo la PVS-Studio: V646 [CWE-670] Ganizirani zoyendera malingaliro akugwiritsa ntchito. Ndizotheka kuti mawu akuti 'ena' akusowa. AMDGPUAsmParser.cpp 5655

Palibe cholakwika apa. Kuyambira pamenepo, chipika choyamba if kumaliza ndi kupitiriza, ndiye zilibe kanthu, pali mawu osakira china kapena osati. Mwanjira iliyonse code idzagwira ntchito mofanana. Anaphonyabe china zimapangitsa kuti code ikhale yosadziwika bwino komanso yowopsa. Ngati m'tsogolo kupitiriza ikasowa, code idzayamba kugwira ntchito mosiyana. Malingaliro anga ndi bwino kuwonjezera china.

Chidutswa N20: Mitundu inayi yamtundu womwewo

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

Machenjezo a PVS-Studio:

  • V655 [CWE-480] Zingwezo zidalumikizidwa koma sizinagwiritsidwe ntchito. Lingalirani kuyang'ana mawu a 'Result + Name.str()'. Chizindikiro.cpp 32
  • V655 [CWE-480] Zingwezo zidalumikizidwa koma sizinagwiritsidwe ntchito. Lingalirani kuyendera mawu a 'Result + "(ObjC Class)" + Name.str()'. Chizindikiro.cpp 35
  • V655 [CWE-480] Zingwezo zidalumikizidwa koma sizinagwiritsidwe ntchito. Lingalirani kuyendera mawu a 'Result + "(ObjC Class EH)" + Name.str()'. Chizindikiro.cpp 38
  • V655 [CWE-480] Zingwezo zidalumikizidwa koma sizinagwiritsidwe ntchito. Lingalirani kuyendera mawu a 'Result + "(ObjC IVar)" + Name.str()'. Chizindikiro.cpp 41

Mwangozi, + wogwiritsa ntchito amagwiritsidwa ntchito m'malo mwa += woyendetsa. Zotsatira zake zimakhala zopanga zopanda tanthauzo.

Chidutswa N21: Khalidwe losadziwika

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

Yesani kupeza nokha code yowopsa. Ndipo ichi ndi chithunzi chosokoneza chidwi kuti musayang'ane yankho mwachangu:

Kupeza nsikidzi mu LLVM 8 pogwiritsa ntchito PVS-Studio analyzer

Chenjezo la PVS-Studio: V708 [CWE-758] Kumanga koopsa kumagwiritsidwa ntchito: 'FeaturesMap[Op] = FeaturesMap.size()', pomwe 'FeaturesMap' ndi ya 'mapu' kalasi. Izi zingayambitse khalidwe losadziwika bwino. RISCVCompressInstEmitter.cpp 490

Mzere wavuto:

FeaturesMap[Op] = FeaturesMap.size();

Ngati element Op sichipezeka, ndiye kuti chinthu chatsopano chimapangidwa pamapu ndipo kuchuluka kwa zinthu pamapuwa kumalembedwa pamenepo. Sizikudziwika ngati ntchitoyi idzayitanidwa kukula musanayambe kapena mutatha kuwonjezera chinthu chatsopano.

Chidutswa N22-N24: Ntchito zobwerezedwa

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

Chenjezo la PVS-Studio: V519 [CWE-563] Kusintha kwa 'NType' kumaperekedwa kawiri motsatizana. Mwina uku ndikulakwitsa. Onani mizere: 1663, 1664. MachOObjectFile.cpp 1664

Ine sindikuganiza kuti pali kulakwitsa kwenikweni apa. Ntchito yobwerezabwereza yosafunikira. Koma apabe cholakwa.

Momwemonso:

  • V519 [CWE-563] Zosintha za 'B.NDesc' zimapatsidwa mikhalidwe kawiri motsatizana. Mwina uku ndikulakwitsa. Onani mizere: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Zosintha zimaperekedwa kawiri motsatizana. Mwina uku ndikulakwitsa. Chongani mizere: 59, 61. coff2yaml.cpp 61

Chidutswa cha N25-N27: Ntchito zinanso

Tsopano tiyeni tiwone mtundu wosiyana pang'ono wa reassignment.

bool Vectorizer::vectorizeLoadChain(
    ArrayRef<Instruction *> Chain,
    SmallPtrSet<Instruction *, 16> *InstructionsProcessed) {
  ....
  unsigned Alignment = getAlignment(L0);
  ....
  unsigned NewAlign = getOrEnforceKnownAlignment(L0->getPointerOperand(),
                                                 StackAdjustedAlignment,
                                                 DL, L0, nullptr, &DT);
  if (NewAlign != 0)
    Alignment = NewAlign;
  Alignment = NewAlign;
  ....
}

Chenjezo la PVS-Studio: V519 [CWE-563] Zosintha za 'Alignment' zimaperekedwa kawiri motsatizana. Mwina uku ndikulakwitsa. Yang'anani mizere: 1158, 1160. LoadStoreVectorizer.cpp 1160

Iyi ndi code yodabwitsa kwambiri yomwe ikuwoneka kuti ili ndi zolakwika zomveka. Poyamba, kusintha mayikidwe mtengo umaperekedwa malinga ndi chikhalidwe. Kenako ntchitoyo imachitikanso, koma tsopano popanda cheke.

Zofananazi zitha kuwoneka apa:

  • V519 [CWE-563] Zosintha za 'Effects' zimaperekedwa mikhalidwe kawiri motsatizana. Mwina uku ndikulakwitsa. Onani mizere: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Kusintha kwa 'ExpectNoDerefChunk' kumapatsidwa mikhalidwe kawiri motsatizana. Mwina uku ndikulakwitsa. Onani mizere: 4970, 4973. SemaType.cpp 4973

Chidutswa N28: Mkhalidwe weniweni nthawi zonse

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

Chenjezo la PVS-Studio: V547 [CWE-571] Mawu akuti 'nextByte != 0x90' amakhala oona nthawi zonse. X86DisassemblerDecoder.cpp 379

Kuyang'ana sikumveka. Zosintha NextByte nthawi zonse sizilingana ndi mtengo 0x90, yomwe ikutsatira cheke yapitayi. Uwu ndi mtundu wina wa zolakwika zomveka.

Chidutswa N29 - N...: Nthawi zonse zowona/zabodza

Analyzer amapereka machenjezo ambiri kuti chikhalidwe chonsecho (V547) kapena gawo lake (V560) nthawi zonse ndi zoona kapena zabodza. Nthawi zambiri izi sizikhala zolakwika zenizeni, koma ma code osasamala, zotsatira za kukula kwakukulu, ndi zina zotero. Komabe, n’kwanzeru kuyang’ana machenjezo onsewa, popeza kuti zolakwa zenizeni zenizeni zimachitika nthaΕ΅i ndi nthaΕ΅i. Mwachitsanzo, gawo ili la code likukayikitsa:

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

Chenjezo la PVS-Studio: V560 [CWE-570] Chigawo cha mawu okhazikika nthawi zonse chimakhala chabodza: ​​RegNo == 0xe. ARMDisassembler.cpp 939

0xE nthawi zonse ndi mtengo wa 14 mu decimal. Kufufuza RegNo == 0xe sizikumveka chifukwa ngati RegNo> 13, ndiye ntchitoyo idzamaliza ntchito yake.

Panali machenjezo ena ambiri okhala ndi ma ID V547 ndi V560, koma monga ndi V595, sindinkafuna kuphunzira machenjezo amenewa. Zinali zoonekeratu kuti ndinali ndi zinthu zokwanira kuti ndilembe nkhani :). Chifukwa chake, sizikudziwika kuti ndi zolakwika zingati zamtunduwu zomwe zitha kudziwika mu LLVM pogwiritsa ntchito PVS-Studio.

Ndikupatsani chitsanzo cha chifukwa chake kuphunzira zoyambitsa izi ndizotopetsa. Wosanthula ndi wolondola kwambiri popereka chenjezo la code yotsatirayi. Koma uku sikulakwa.

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

PVS-Studio Chenjezo: V547 [CWE-570] Mawu akuti '!HasError' amakhala abodza nthawi zonse. UnwrappedLineParser.cpp 1635

Chidutswa N30: ​​Kubwerera kokayikitsa

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

Chenjezo la PVS-Studio: V612 [CWE-670] 'Kubwerera' kopanda malire mkati mwa kuzungulira. R600OptimizeVectorRegisters.cpp 63

Izi mwina ndi zolakwika kapena njira inayake yomwe cholinga chake ndi kufotokozera china chake kwa opanga mapulogalamu omwe amawerenga ma code. Mapangidwe awa samandifotokozera chilichonse ndipo amawoneka okayikitsa kwambiri. Ndibwino kuti musalembe monga choncho :).

Wotopa? Ndiye ndi nthawi yopangira tiyi kapena khofi.

Kupeza nsikidzi mu LLVM 8 pogwiritsa ntchito PVS-Studio analyzer

Zowonongeka zodziwika ndi matenda atsopano

Ndikuganiza kuti ma activation 30 a matenda akale ndiwokwanira. Tiyeni tsopano tiwone zinthu zosangalatsa zomwe zingapezeke ndi matenda atsopano omwe adawonekera mu analyzer pambuyo pake m'mbuyomu cheke. Panthawiyi, zowunikira zonse za 66 zidawonjezeredwa ku C ++ analyzer.

Chidutswa N31: Khodi yosafikirika

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

Chenjezo la PVS-Studio: V779 [CWE-561] Khodi yosafikirika yapezeka. Ndizotheka kuti cholakwika chilipo. ExecutionUtils.cpp 146

Monga mukuonera, nthambi zonse za woyendetsa if imathera ndi kuyimbira kwa woyendetsa obwereza. Choncho, chidebe CtorDtorsByPriority sichidzayeretsedwa konse.

Chidutswa N32: Khodi yosafikirika

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

Chenjezo la PVS-Studio: V779 [CWE-561] Khodi yosafikirika yapezeka. Ndizotheka kuti cholakwika chilipo. LLParser.cpp 835

Chidwi mkhalidwe. Tiyeni tione malowa kaye:

return ParseTypeIdEntry(SummaryID);
break;

Poyamba, zikuwoneka kuti palibe cholakwika apa. Zikuwoneka ngati woyendetsa yopuma pali chowonjezera apa, ndipo mutha kungochichotsa. Komabe, si zonse zosavuta.

The analyzer amapereka chenjezo pa mizere:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Ndipo ndithudi, code iyi ndi yosafikirika. Milandu yonse mu magetsi kumaliza ndi kuyimba kuchokera kwa wogwiritsa ntchito obwereza. Ndipo tsopano wopanda nzeru yekha yopuma sizikuwoneka zopanda vuto! Mwina imodzi mwa nthambi iyenera kutha ndi yopuma, osati kuyatsa obwereza?

Chidutswa N33: Kukonzanso mwachisawawa kwa ma bits apamwamba

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

Chenjezo la PVS-Studio: V784 Kukula kwa chigoba chaching'ono ndi chocheperako kuposa kukula kwa operand yoyamba. Izi zipangitsa kutayika kwa ma bits apamwamba. RuntimeDyld.cpp 815

Chonde dziwani kuti ntchito getStubAlignment mtundu wobwerera osasankhidwa. Tiyeni tiwerengere mtengo wa mawuwo, poganiza kuti ntchitoyi imabweza mtengo 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFF8u

Tsopano zindikirani kuti variable DataSize ili ndi mtundu wosasainidwa wa 64-bit. Zikuwonekeratu kuti pochita opareshoni ya DataSize & 0xFFFFFFF8u, ma bits onse makumi atatu ndi awiri apamwamba adzasinthidwa kukhala zero. Mwachidziwikire, izi sizomwe wopanga mapulogalamu amafuna. Ndikukayikira kuti amafuna kuwerengera: DataSize & 0xFFFFFFFFFFFFFFF8u.

Kuti mukonze cholakwikacho, muyenera kulemba izi:

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

Kapena kotero:

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

Chidutswa cha N34: Cholephereka cha mtundu waposachedwa

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

Chenjezo la PVS-Studio: V1028 [CWE-190] zotheka kusefukira. Ganizirani zotulutsa opareshoni ya 'NumElts * Scale' ku mtundu wa 'size_t', osati zotsatira. X86ISelLowering.h 1577

Kutulutsa kwamtundu wowonekera kumagwiritsidwa ntchito kupewa kusefukira pakuchulukitsa mitundu Int. Komabe, kuponyedwa kowonekera apa sikuteteza ku kusefukira. Choyamba, zosinthika zidzachulukitsidwa, ndipo pokhapokha zotsatira za 32-bit za kuchulukitsa zidzakulitsidwa kukhala mtundu. kukula_t.

Chidutswa cha N35: Cholephereka 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] Zidutswa ziwiri zofananira zamtunduwu zidapezeka. Mwina, uku ndi kutayira ndipo kusintha kwa 'Op1' kuyenera kugwiritsidwa ntchito m'malo mwa 'Op0'. InstCombineCompares.cpp 5507

Kuzindikira kwatsopano kosangalatsa kumeneku kumazindikiritsa nthawi yomwe chidutswa cha code chidakopedwa ndipo mayina ena momwemo ayamba kusinthidwa, koma pamalo amodzi sanakonze.

Chonde dziwani kuti mu chipika chachiwiri adasintha Op0 pa Op1. Koma pamalo amodzi sanakonze. Mothekera kwambiri zikanayenera kulembedwa motere:

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

Chidutswa cha N36: Chisokonezo Chosinthika

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

Chenjezo la PVS-Studio: V1001 [CWE-563] Kusintha kwa 'Mode' kumaperekedwa koma sikumagwiritsidwa ntchito kumapeto kwa ntchitoyi. SIModeRegister.cpp 48

Ndizowopsa kupereka mikangano yantchito mayina omwewo monga mamembala amkalasi. Ndikosavuta kusokonezeka. Ife tiri ndi mlandu woterowo pamaso pathu. Mawu awa alibe tanthauzo:

Mode &= Mask;

Mkangano wa ntchito umasintha. Ndizomwezo. Mtsutsowu sugwiritsidwanso ntchito. Mwinamwake mukanalemba motere:

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

Chidutswa cha N37: Chisokonezo Chosinthika

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

Chenjezo la PVS-Studio: V1001 [CWE-563] Kusintha kwa 'Kukula' kumaperekedwa koma sikumagwiritsidwa ntchito kumapeto kwa ntchitoyi. Object.cpp 424

Mkhalidwewo ndi wofanana ndi wam’mbuyomo. Ayenera kulembedwa kuti:

this->Size += this->EntrySize;

Chidutswa N38-N47: Anayiwala kuyang'ana ndondomekoyi

M'mbuyomu, tidawona zitsanzo zoyambitsa matenda V595. Chofunikira chake ndikuti cholozeracho chimachotsedwa koyambirira, kenako ndikufufuzidwa. Young diagnostics V1004 ndi zosiyana ndi tanthauzo, komanso zimawulula zolakwika zambiri. Imazindikiritsa zochitika zomwe cholozeracho chidayang'aniridwa koyambirira ndikuyiwala kutero. Tiyeni tiwone milandu yotereyi yomwe imapezeka mkati mwa 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());  // <=
  ....
}

Chenjezo la PVS-Studio: V1004 [CWE-476] Cholozera cha 'Ptr' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Yang'anani mizere: 729, 738. TargetTransformInfoImpl.h 738

Zosiyanasiyana Ptr akhoza kukhala ofanana nullptr, monga umboni ndi cheke:

if (Ptr != nullptr)

Komabe, pansipa pointer iyi imachotsedwa popanda kuwunika koyambirira:

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

Tiyeni tikambirane nkhani ina yofanana ndi imeneyi.

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

Chenjezo la PVS-Studio: V1004 [CWE-476] Cholozera cha 'FD' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Onani mizere: 3228, 3231. CGDebugInfo.cpp 3231

Samalani chizindikirocho FD. Ndikukhulupirira kuti vutoli likuwoneka bwino ndipo palibe kufotokozera kwapadera komwe kumafunikira.

Komanso:

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

Chenjezo la PVS-Studio: V1004 [CWE-476] Cholozera cha 'PtrTy' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Yang'anani mizere: 960, 965. InterleavedLoadCombinePass.cpp 965

Kodi mungadziteteze bwanji ku zolakwika zoterezi? Khalani tcheru kwambiri pa Code-Review ndikugwiritsa ntchito PVS-Studio static analyzer kuti muwone khodi yanu pafupipafupi.

Palibe chifukwa chotchulira zidutswa zina zamakhodi ndi zolakwika zamtunduwu. Ndingosiya mndandanda wa machenjezo m'nkhaniyi:

  • V1004 [CWE-476] Cholozera cha 'Expr' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Yang'anani mizere: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] Cholozera cha 'PI' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Onani mizere: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Cholozera cha 'StatepointCall' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Onani mizere: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] Cholozera cha 'RV' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Onani mizere: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Cholozera cha 'CalleeFn' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Yang'anani mizere: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Cholozera cha 'TC' chinagwiritsidwa ntchito mosatetezeka chikatsimikiziridwa motsutsana ndi nullptr. Onani mizere: 1819, 1824. Driver.cpp 1824

Fragment N48-N60: Osati yovuta, koma cholakwika (kutheka kukumbukira kutayikira)

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

Chenjezo la PVS-Studio: V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Strategies' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-isel-fuzzer.cpp 58

Kuonjezera chinthu kumapeto kwa chidebe ngati std::vector > simungangolemba xxx.push_back(X yatsopano), popeza palibe kutembenuka kwathunthu kuchokera X* Π² std::wapadera_ptr.

Njira yodziwika bwino ndiyo kulemba xxx.emplace_back(X yatsopano)popeza imaphatikiza: njira malo_kubwerera amamanga chinthu molunjika kuchokera ku mfundo zake motero amatha kugwiritsa ntchito omanga momveka bwino.

Sizotetezeka. Ngati vekitala yadzaza, ndiye kuti kukumbukira kumaperekedwanso. Ntchito yobwezeretsanso kukumbukira ikhoza kulephera, kupangitsa kuti chosiyana chitayike std::bad_alloc. Pankhaniyi, cholozera chidzatayika ndipo chinthu chopangidwa sichidzachotsedwa.

Yankho lotetezeka ndikulenga wapadera_ptryomwe idzakhala nayo cholozera vekitala isanayese kuyikanso kukumbukira:

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

Kuyambira C++14, mutha kugwiritsa ntchito 'std::make_unique':

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

Chilema chamtunduwu sichofunikira kwa LLVM. Ngati kukumbukira sikungagawidwe, wopangayo amangoyimitsa. Komabe, kwa ntchito ndi yaitali nthawi, zomwe sizingathetse ngati kugawa kukumbukira sikulephera, ichi chikhoza kukhala cholakwika chenicheni.

Chifukwa chake, ngakhale kachidindo kameneka sikakuwopseza LLVM, ndapeza kuti ndizothandiza kuyankhula za cholakwika ichi komanso kuti PVS-Studio analyzer adaphunzira kuzindikira.

Machenjezo ena amtunduwu:

  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Passes' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. PassManager.h 546
  • V1023 [CWE-460] Cholozera chopanda mwini chimawonjezedwa ku chidebe cha 'AAs' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. AliasAnalysis.h 324
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Entries' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'AllEdges' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. CFGMST.h 268
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'VMaps' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Records' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. FDRLogBuilder.h 30
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'PendingSubmodules' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. ModuleMap.cpp 810
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Objects' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. DebugMap.cpp 88
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Strategies' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 685
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 686
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 688
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 689
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 690
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 691
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 692
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 693
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Modifiers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. llvm-stress.cpp 694
  • V1023 [CWE-460] Cholozera chopanda mwini chimawonjezedwa ku chidebe cha 'Operands' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Stash' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] Cholozera chopanda mwiniwake chimawonjezedwa ku chidebe cha 'Matchers' ndi njira ya 'emplace_back'. Kuwonongeka kwa kukumbukira kudzachitika pokhapokha. GlobalISelEmitter.cpp 2702

Pomaliza

Ndinapereka machenjezo 60 onse ndipo ndinasiya. Kodi pali zolakwika zina zomwe PVS-Studio analyzer imazindikira mu LLVM? Inde, ndatero. Komabe, pamene ndinali kulemba zidutswa za kachidindo ka nkhaniyo, kunali madzulo, kapena kuti usiku, ndipo ndinaganiza kuti inali nthawi yoti nditchule tsiku.

Ndikukhulupirira kuti mwapeza zosangalatsa ndipo mukufuna kuyesa PVS-Studio analyzer.

Mutha kutsitsa analyzer ndikupeza kiyi ya minesweeper pa tsamba ili.

Chofunika kwambiri, gwiritsani ntchito static analysis nthawi zonse. Macheke kamodzi, zomwe timachita kuti tidziwitse njira yowunikira komanso PVS-Studio sizochitika zachilendo.

Zabwino zonse pakuwongolera mtundu komanso kudalirika kwa khodi yanu!

Kupeza nsikidzi mu LLVM 8 pogwiritsa ntchito PVS-Studio analyzer

Ngati mukufuna kugawana nkhaniyi ndi omvera olankhula Chingerezi, chonde gwiritsani ntchito ulalo womasulira: Andrey Karpov. Kupeza Bugs mu LLVM 8 yokhala ndi PVS-Studio.

Source: www.habr.com

Kuwonjezera ndemanga