Nrhiav cov kab hauv LLVM 8 siv PVS-Studio analyzer

Nrhiav cov kab hauv LLVM 8 siv PVS-Studio analyzer
Ntau tshaj li ob xyoos tau dhau los txij li qhov kawg ntawm kev kuaj xyuas ntawm LLVM qhov project siv peb PVS-Studio analyzer. Cia peb ua kom paub tseeb tias PVS-Studio analyzer tseem yog cov cuab yeej tseem ceeb rau kev txheeb xyuas qhov tsis raug thiab qhov muaj peev xwm tsis zoo. Txhawm rau ua qhov no, peb yuav tshawb xyuas thiab pom qhov yuam kev tshiab hauv LLVM 8.0.0 tso tawm.

Kab lus yuav tsum tau sau

Ua ncaj ncees, kuv tsis xav sau tsab xov xwm no. Nws tsis txaus siab los sau txog ib qhov project uas peb twb tau kuaj ob peb zaug (1, 2, 3). Nws zoo dua los sau txog qee yam tshiab, tab sis kuv tsis muaj kev xaiv.

Txhua zaus ib qho tshiab ntawm LLVM raug tso tawm lossis hloov kho tshiab Clang Static Analyzer, peb tau txais cov lus nug ntawm hom hauv qab no hauv peb cov ntawv xa tuaj:

Saib, tus tshiab version ntawm Clang Static Analyzer tau kawm kom pom qhov yuam kev tshiab! Nws zoo nkaus li kuv tias qhov cuam tshuam ntawm kev siv PVS-Studio txo ​​qis. Clang pom ntau qhov yuam kev dua li ua ntej thiab ntes nrog lub peev xwm ntawm PVS-Studio. Koj xav li cas txog qhov no?

Txog qhov no kuv ib txwm xav teb qee yam xws li:

Peb tsis zaum ib leeg! Peb tau txhim kho lub peev xwm ntawm PVS-Studio analyzer tau zoo. Yog li tsis txhob txhawj, peb txuas ntxiv ua tus thawj coj zoo li yav dhau los.

Hmoov tsis zoo, qhov no yog lus teb tsis zoo. Tsis muaj pov thawj hauv nws. Thiab yog vim li cas kuv thiaj sau tsab xov xwm no tam sim no. Yog li, qhov project LLVM tau rov kuaj dua thiab ntau yam yuam kev tau pom nyob hauv nws. Tam sim no kuv yuav ua kom pom cov uas zoo li ntxim nyiam rau kuv. Clang Static Analyzer tsis tuaj yeem pom cov yuam kev no (lossis nws tsis yooj yim ua li ntawd nrog nws cov kev pab). Tab sis peb ua tau. Ntxiv mus, kuv pom thiab sau tag nrho cov kev ua yuam kev no nyob rau yav tsaus ntuj.

Tab sis sau tsab xov xwm siv ob peb lub lis piam. Kuv tsuas yog tsis tuaj yeem coj kuv tus kheej los tso tag nrho cov ntawv no rau hauv ntawv :).

Los ntawm txoj kev, yog tias koj xav paub dab tsi cov thev naus laus zis siv hauv PVS-Studio analyzer txhawm rau txheeb xyuas qhov tsis raug thiab qhov muaj peev xwm tsis zoo, ces kuv xav kom paub txog qhov no. ceeb toom.

Kev kuaj mob tshiab thiab qub

Raws li twb tau sau tseg lawm, kwv yees li ob xyoos dhau los qhov project LLVM tau rov kuaj dua, thiab qhov yuam kev pom tau raug kho. Tam sim no tsab xov xwm no yuav nthuav qhia ib pawg tshiab ntawm qhov tsis raug. Vim li cas thiaj nrhiav tau kab tshiab? Muaj 3 qhov laj thawj rau qhov no:

  1. Txoj haujlwm LLVM tab tom hloov zuj zus, hloov cov lej qub thiab ntxiv cov lej tshiab. Lawm, muaj qhov yuam kev tshiab hauv qhov hloov kho thiab sau cov cai. Qhov no qhia meej meej tias kev txheeb xyuas zoo li qub yuav tsum tau siv tsis tu ncua, thiab tsis yog qee zaus. Peb cov ntawv qhia tau zoo txog lub peev xwm ntawm PVS-Studio analyzer, tab sis qhov no tsis muaj dab tsi cuam tshuam nrog kev txhim kho code zoo thiab txo tus nqi ntawm kev kho qhov yuam kev. Siv tus lej ntsuas tus lej zoo li qub tsis tu ncua!
  2. Peb tab tom ua tiav thiab txhim kho cov kev kuaj mob uas twb muaj lawm. Yog li ntawd, tus kws tshuaj ntsuam xyuas tuaj yeem txheeb xyuas qhov yuam kev uas nws tsis tau pom thaum lub sijhawm kuaj yav dhau los.
  3. Kev kuaj mob tshiab tau tshwm sim hauv PVS-Studio uas tsis muaj nyob 2 xyoo dhau los. Kuv txiav txim siab los qhia lawv hauv ib ntu kom pom meej txog kev txhim kho ntawm PVS-Studio.

Cov teeb meem raug txheeb xyuas los ntawm kev kuaj mob uas muaj 2 xyoos dhau los

Fragment N1: Luam-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 ceeb toom: V501 [CWE-570] Muaj cov ntsiab lus zoo sib xws 'Name.startswith("avx512.mask.permvar.")' rau sab laug thiab sab xis ntawm '||' tus neeg ua haujlwm. AutoUpgrade.cpp 73

Nws yog ob zaug tshuaj xyuas tias lub npe pib nrog lub substring "avx512.mask.permvar.". Hauv daim tshev thib ob, lawv pom tseeb tias xav sau lwm yam, tab sis tsis nco qab kho cov ntawv theej.

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

Ceeb Toom PVS-Studio: V501 Muaj cov lus qhia zoo sib xws 'CXNameRange_WantQualifier' rau sab laug thiab sab xis ntawm '|' tus neeg ua haujlwm. ib 7245

Vim yog lub typo, tib lub npe tsis tu ncua yog siv ob zaug CXNameRange_WantQualifier.

Fragment N3: Tsis meej pem nrog tus neeg teb xov tooj ua ntej

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

PVS-Studio ceeb toom: V502 [CWE-783] Tej zaum tus '?:' tus neeg teb xov tooj ua haujlwm txawv dua li qhov nws xav tau. Tus '?:' tus neeg teb xov tooj muaj qhov tseem ceeb tshaj qhov '==' tus neeg teb xov tooj. PPCTargetTransformInfo.cpp 404

Hauv kuv lub tswv yim, qhov no yog qhov yuam kev zoo nkauj heev. Yog, kuv paub tias kuv muaj tswv yim coj txawv txawv txog kev zoo nkauj :).

Tam sim no, raws li tus neeg ua haujlwm tseem ceeb, cov lus qhia yog ntsuas raws li hauv qab no:

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

Los ntawm cov tswv yim pom zoo, xws li cov xwm txheej tsis ua rau muaj kev nkag siab, vim nws tuaj yeem txo mus rau:

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

Qhov no yog qhov tseeb yuam kev. Feem ntau, lawv xav sib piv 0/1 nrog qhov sib txawv Index. Txhawm rau txhim kho cov cai koj yuav tsum tau ntxiv cov kab lus nyob ib puag ncig tus neeg teb xov tooj ternary:

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

Los ntawm txoj kev, tus neeg teb xov tooj ternary yog qhov txaus ntshai heev thiab provokes cov laj thawj tsis raug. Ua tib zoo nrog nws thiab tsis txhob greedy nrog cov kab lus. Kuv saib lub ncauj lus no kom ntxaws ntxiv no, nyob rau hauv tshooj "Ua siab zoo ntawm ?: Tus neeg teb xov tooj thiab kaw nws hauv kab lus."

Fragment 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 ceeb toom: V522 [CWE-476] Dereferencing ntawm tus pointer null 'LHS' tej zaum yuav muaj. TIAB SA 2152

Yog tus pointer LHS yog null, yuav tsum tau ceeb toom. Txawm li cas los xij, hloov pauv, tus pointer no tsis zoo ib yam yuav raug muab coj los siv: LHS->getAsString().

Qhov no yog ib qho teeb meem tshwm sim thaum qhov yuam kev tau muab zais rau hauv tus neeg ua haujlwm yuam kev, vim tsis muaj leej twg sim lawv. Static analyzers xyuas txhua tus lej tuaj yeem tau txais, txawm tias nws siv ntau npaum li cas. Qhov no yog ib qho piv txwv zoo heev ntawm yuav ua li cas kev soj ntsuam zoo li qub ntxiv rau lwm yam kev sim thiab kev tiv thaiv kev ua yuam kev.

Zoo sib xws pointer tuav yuam kev HRH tso cai nyob rau hauv cov cai hauv qab no: V522 [CWE-476] Dereferencing ntawm tus pointer null 'RHS' tej zaum yuav tshwm sim. TIAB SA 2186

Fragment N6: Siv tus taw tes tom qab tsiv mus

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

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

PVS-Studio Ceeb Toom: V522 [CWE-476] Kev xa tawm ntawm tus pointer null 'ProgClone' yuav tshwm sim. ib.cpp 601

Thaum pib tus taw tes ntse ProgClone ceases tus kheej cov khoom:

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

Qhov tseeb, tam sim no ProgClone yog tus pointer null. Yog li ntawd, ib tug null pointer dereference yuav tsum tshwm sim hauv qab no:

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

Tab sis, qhov tseeb, qhov no yuav tsis tshwm sim! Nco ntsoov tias lub voj tsis tau ua tiav.

Thaum pib ntawm lub thawv MiscompiledFunctions cleared:

MiscompiledFunctions.clear();

Tom ntej no, qhov loj ntawm lub thawv no yog siv nyob rau hauv lub voj voog:

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

Nws yooj yim pom tias lub voj tsis pib. Kuv xav tias qhov no kuj yog kab laum thiab cov cai yuav tsum tau sau txawv.

Nws zoo nkaus li tias peb tau ntsib qhov kev sib luag nto moo ntawm qhov tsis raug! Ib qho yuam kev npog lwm qhov :).

Fragment N7: Siv tus taw tes tom qab tsiv mus

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

PVS-Studio ceeb toom: V522 [CWE-476] Dereferencing ntawm null pointer 'Test' tej zaum yuav tshwm sim. ib 709

Qhov xwm txheej qub dua. Thaum xub thawj, cov ntsiab lus ntawm cov khoom raug txav mus los, thiab tom qab ntawd nws siv zoo li tsis muaj dab tsi tshwm sim. Kuv pom qhov xwm txheej no ntau thiab ntau zaus hauv qhov program code tom qab txav semantics tshwm sim hauv C ++. Qhov no yog vim li cas kuv nyiam hom lus C ++! Muaj ntau txoj hauv kev tshiab los tua koj tus kheej ceg tawm. PVS-Studio analyzer yeej ib txwm muaj haujlwm :).

Fragment N8: Null pointer

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

PVS-Studio ceeb toom: V522 [CWE-476] Dereferencing ntawm null pointer 'Hom' tej zaum yuav tshwm sim. PrettyFunctionDumper.cpp 233

Ntxiv nrog rau qhov yuam kev handlers, debugging printout functions feem ntau tsis kuaj. Peb tsuas muaj rooj plaub no ua ntej peb. Lub luag haujlwm yog tos rau tus neeg siv, uas, es tsis txhob daws nws cov teeb meem, yuav raug yuam kom kho nws.

Yog lawm:

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

Fragment N9: Null pointer

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

PVS-Studio ceeb toom: V522 [CWE-476] Dereferencing ntawm null pointer 'Ty' tej zaum yuav tshwm sim. SearchableTableEmitter.cpp 614

Kuv xav tias txhua yam yog qhov tseeb thiab tsis xav tau kev piav qhia.

Fragment 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 ceeb toom: V570 Qhov 'Identifier->Type' hloov pauv tau muab rau nws tus kheej. FormatTokenLexer.cpp 249

Tsis muaj qhov taw tes rau kev muab qhov hloov pauv rau nws tus kheej. Feem ntau lawv xav sau:

Identifier->Type = Question->Type;

Fragment N11: Kev tsis txaus ntseeg tawg

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 ceeb toom: V622 [CWE-478] Xav txog kev tshuaj xyuas 'hloov' nqe lus. Nws yog qhov ua tau tias thawj 'cov ntaub ntawv' tus neeg teb xov tooj ploj lawm. SystemZAsmParser.cpp 652

Muaj ib tug neeg ua haujlwm txawv heev thaum pib so. Koj puas tsis nco qab sau lwm yam ntawm no?

Fragment N12: Txheeb xyuas tus taw tes tom qab hais tawm

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 ceeb toom: V595 [CWE-476] Tus taw tes 'Callee' tau siv ua ntej nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 172, 174. AMDGPUInline.cpp 172

Pointer Callee thaum pib yog dereferenced thaum lub sij hawm muaj nuj nqi hu ua getTTI.

Thiab tom qab ntawd nws hloov tawm tias tus taw tes no yuav tsum tau kuaj xyuas qhov sib npaug nullptr:

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

Tab sis nws lig dhau lawm…

Fragment N13 - N...: Kuaj lub pointer tom qab deferencing

Qhov xwm txheej tau tham hauv cov kab lus dhau los tsis yog qhov tshwj xeeb. Nws tshwm ntawm no:

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 ceeb toom: V595 [CWE-476] Tus taw tes 'CalleeFn' tau siv ua ntej nws tau raug txheeb xyuas tawm tsam nullptr. Kos kab: 1079, 1081. SimplifyLibCalls.cpp 1079

Thiab ntawm no:

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 ceeb toom: V595 [CWE-476] Tus 'ND' pointer tau siv ua ntej nws tau raug txheeb xyuas tawm tsam nullptr. Kos kab: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Thiab ntawm no:

  • V595 [CWE-476] Tus taw tes 'U' tau siv ua ntej nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Tus taw tes 'ND' tau siv ua ntej nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Thiab tom qab ntawd kuv tau tsis txaus siab los kawm cov lus ceeb toom nrog tus lej V595. Yog li kuv tsis paub yog tias muaj qhov yuam kev zoo sib xws dua li cov uas tau teev tseg ntawm no. Feem ntau yuav muaj.

Fragment N17, N18: Kev hloov pauv tsis txaus ntseeg

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

PVS-Studio ceeb toom: V629 [CWE-190] Xav tshuaj xyuas qhov '~(Size - 1) << 1' qhia. Kev hloov me ntsis ntawm tus nqi 32-ntsis nrog kev nthuav dav ntxiv mus rau hom 64-ntsis. AArch64AddressingModes.h 260

Tej zaum nws yuav tsis yog kab laum thiab cov cai ua haujlwm raws nraim li qhov xav tau. Tab sis qhov no yog qhov tseeb tias qhov chaw tsis txaus ntseeg thiab yuav tsum tau kuaj xyuas.

Cia peb hais qhov sib txawv loj yog sib npaug rau 16, thiab tom qab ntawd tus sau tus lej tau npaj kom tau txais nws hauv qhov sib txawv NIM lub ntsiab lus:

1111111111111111111111111111111111111111111111111111111111100000

Txawm li cas los xij, qhov tseeb, qhov tshwm sim yuav yog:

0000000000000000000000000000000011111111111111111111111111100000

Qhov tseeb yog tias txhua qhov kev suav tau tshwm sim siv 32-ntsis yam tsis tau kos npe. Thiab tsuas yog tom qab ntawd, hom 32-ntsis tsis tau kos npe no yuav raug nthuav dav rau ua 64_t. Hauv qhov no, cov khoom tseem ceeb tshaj plaws yuav yog xoom.

Koj tuaj yeem kho qhov xwm txheej zoo li no:

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

Qhov xwm txheej zoo sib xws: V629 [CWE-190] Xav txog kev tshuaj xyuas 'Immr << 6' qhia. Kev hloov me ntsis ntawm tus nqi 32-ntsis nrog kev nthuav dav ntxiv mus rau hom 64-ntsis. AArch64AddressingModes.h 269

Fragment N19: Lo lus tseem ceeb ploj lawm lwm tus?

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 ceeb toom: V646 [CWE-670] Xav txog kev tshuaj xyuas daim ntawv thov lub logic. Nws yog qhov ua tau tias 'lwm' lo lus tseem ceeb ploj lawm. AMDGPUAsmParser.cpp 5655

Tsis muaj qhov yuam kev ntawm no. Txij thaum ntawd los-block ntawm thawj if xaus nrog ntxiv, ces nws tsis muaj teeb meem, muaj lo lus tseem ceeb lwm tus los tsis. Txawm li cas los xij tus lej yuav ua haujlwm zoo ib yam. Tseem nco lwm tus ua rau txoj cai tsis meej thiab txaus ntshai. Yog yav tom ntej ntxiv ploj lawm, cov cai yuav pib ua hauj lwm txawv kiag li. Hauv kuv lub tswv yim nws yog qhov zoo dua ntxiv lwm tus.

Fragment N20: Plaub typos ntawm tib hom

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 ceeb toom:

  • V655 [CWE-480] Cov hlua tau sib txuas tab sis tsis siv. Xav txog kev tshuaj xyuas qhov 'Result + Name.str()' qhia. Symbol.cpp 32
  • V655 [CWE-480] Cov hlua tau sib txuas tab sis tsis siv. Xav txog kev tshuaj xyuas qhov 'Tsim + "(ObjC Class)" + Name.str()' qhia. Symbol.cpp 35
  • V655 [CWE-480] Cov hlua tau sib txuas tab sis tsis siv. Xav txog kev tshuaj xyuas qhov 'Result + "(ObjC Class EH)" + Name.str()' qhia. Symbol.cpp 38
  • V655 [CWE-480] Cov hlua tau sib txuas tab sis tsis siv. Xav txog kev tshuaj xyuas qhov 'Result + "(ObjC IVar)" + Name.str()' qhia. Symbol.cpp 41

Los ntawm kev huam yuaj, tus + tus neeg teb xov tooj yog siv los ntawm += tus neeg teb xov tooj. Qhov tshwm sim yog cov qauv tsim uas tsis muaj lub ntsiab lus.

Fragment N21: Tus cwj pwm tsis tau txhais

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

Sim nrhiav tus lej txaus ntshai koj tus kheej. Thiab qhov no yog ib daim duab kom cuam tshuam cov xim kom tsis txhob saib tam sim ntawd cov lus teb:

Nrhiav cov kab hauv LLVM 8 siv PVS-Studio analyzer

PVS-Studio ceeb toom: V708 [CWE-758] Kev tsim kho phom sij yog siv: 'FeaturesMap[Op] = FeaturesMap.size()', qhov twg 'FeaturesMap' yog ntawm 'daim ntawv qhia' chav kawm. Qhov no tuaj yeem ua rau tus cwj pwm tsis meej. RISCVCompressInstEmitter.cpp 490

Teeb meem kab:

FeaturesMap[Op] = FeaturesMap.size();

Yog hais tias element Op tsis pom, ces lub caij tshiab yog tsim nyob rau hauv daim ntawv qhia thiab tus naj npawb ntawm cov ntsiab lus nyob rau hauv daim ntawv qhia no yog sau nyob rau ntawd. Nws tsuas yog tsis paub tias lub luag haujlwm yuav raug hu loj ua ntej lossis tom qab ntxiv cov khoom tshiab.

Fragment N22-N24: Rov ua haujlwm dua

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 ceeb toom: V519 [CWE-563] Qhov sib txawv 'NType' yog muab cov txiaj ntsig ob zaug ua tiav. Tej zaum qhov no yog qhov yuam kev. Kos kab: 1663, 1664. MachOObjectFile.cpp 1664

Kuv tsis xav tias muaj qhov yuam kev tiag tiag ntawm no. Tsuas yog ib qho uas tsis tsim nyog rov ua haujlwm. Tab sis tseem yog blunder.

Ib yam li ntawd:

  • V519 [CWE-563] Qhov sib txawv 'B.NDesc' yog muab cov txiaj ntsig ob zaug ua tiav. Tej zaum qhov no yog qhov yuam kev. Kos kab: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Qhov sib txawv yog muab cov txiaj ntsig ob zaug ua tiav. Tej zaum qhov no yog qhov yuam kev. Kos kab: 59, 61. coff2yaml.cpp 61

Fragment N25-N27: Ntau dua reassignments

Tam sim no cia peb saib ntawm qhov sib txawv me ntsis ntawm kev hloov kho dua tshiab.

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

PVS-Studio ceeb toom: V519 [CWE-563] Qhov sib txawv 'Alignment' yog muab cov txiaj ntsig ob zaug ua tiav. Tej zaum qhov no yog qhov yuam kev. Kos kab: 1158, 1160. LoadStoreVectorizer.cpp 1160

Qhov no yog txoj cai coj txawv txawv heev uas pom tau tias muaj qhov yuam kev. Thaum pib, hloov pauv Tuab si lug tus nqi raug muab nyob ntawm qhov xwm txheej. Thiab tom qab ntawd txoj hauj lwm tshwm sim dua, tab sis tam sim no tsis muaj kev txheeb xyuas.

Cov xwm txheej zoo sib xws tuaj yeem pom ntawm no:

  • V519 [CWE-563] Qhov 'Effects' sib txawv yog muab cov txiaj ntsig ob zaug ua tiav. Tej zaum qhov no yog qhov yuam kev. Kos kab: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Qhov sib txawv 'ExpectNoDerefChunk' yog muab cov txiaj ntsig ob zaug ua tiav. Tej zaum qhov no yog qhov yuam kev. Kos kab: 4970, 4973. SemaType.cpp 4973

Fragment N28: Ib txwm muaj tseeb

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 ceeb toom: V547 [CWE-571] Expression 'nextByte != 0x90' yeej ib txwm muaj tseeb. X86DisassemblerDecoder.cpp 379

Kev tshuaj xyuas tsis muaj txiaj ntsig. Hloov pauv NextByte ib txwm tsis sib npaug ntawm tus nqi 0x90, uas ua raws los ntawm kev txheeb xyuas yav dhau los. Nov yog qee yam kev ua yuam kev.

Fragment N29 - N...: Ib txwm muaj tseeb / cuav xwm txheej

Tus kws tshuaj ntsuam tau tshaj tawm ntau cov lus ceeb toom tias tag nrho cov mob (V547) los yog ib feem ntawm (V560) yeej ib txwm muaj tseeb los yog cuav. Feem ntau cov no tsis yog qhov yuam kev tiag tiag, tab sis tsuas yog sloppy code, qhov tshwm sim ntawm macro nthuav dav, thiab lwm yam. Txawm li cas los xij, nws ua rau kev nkag siab zoo los saib tag nrho cov lus ceeb toom no, txij li cov laj thawj tiag tiag tshwm sim ib ntus. Piv txwv li, seem ntawm cov cai no yog qhov tsis txaus ntseeg:

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 ceeb toom: V560 [CWE-570] Ib feem ntawm cov lus qhia yog ib txwm tsis tseeb: RegNo == 0xe. ARMDisassembler.cpp 939

Qhov tas li 0xE yog tus nqi 14 hauv kaum. Kev tshuaj xyuas RegNo == 0 xe tsis make sense vim yog RegNo > 13, tom qab ntawd cov haujlwm yuav ua tiav nws qhov kev ua tiav.

Muaj ntau lwm cov lus ceeb toom nrog IDs V547 thiab V560, tab sis nrog rau V595, Kuv tsis xav kawm cov lus ceeb toom no. Nws twb paub meej tias kuv muaj cov ntaub ntawv txaus los sau ib tsab xov xwm :). Yog li, nws tsis paub tias muaj pes tsawg qhov yuam kev ntawm hom no tuaj yeem txheeb xyuas hauv LLVM siv PVS-Studio.

Kuv yuav muab ib qho piv txwv rau koj vim li cas kev kawm cov txiaj ntsig no dhuav. Tus kws tshuaj ntsuam xyuas yog txoj cai tiag tiag hauv kev tshaj tawm lus ceeb toom rau cov cai hauv qab no. Tab sis qhov no tsis yog qhov yuam kev.

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

PVS-Studio Warning: V547 [CWE-570] Kev nthuav qhia '!HasError' yog ib txwm tsis muaj tseeb. UnwrappedLineParser.cpp 1635

Fragment N30: ​​Kev xav rov qab los

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 ceeb toom: V612 [CWE-670] Unconditional 'rov qab' nyob rau hauv ib lub voj. R600OptimizeVectorRegisters.cpp 63

Qhov no yog ib qho yuam kev lossis ib qho txheej txheem tshwj xeeb uas yog npaj los piav qhia qee yam rau cov programmer nyeem cov lej. Qhov kev tsim no tsis piav dab tsi rau kuv thiab zoo li tsis txaus ntseeg. Nws yog qhov zoo dua tsis txhob sau li ntawd :).

nkees? Tom qab ntawd nws yog lub sijhawm los ua tshuaj yej lossis kas fes.

Nrhiav cov kab hauv LLVM 8 siv PVS-Studio analyzer

Cov teeb meem raug txheeb xyuas los ntawm kev kuaj mob tshiab

Kuv xav tias 30 kev ua haujlwm ntawm kev kuaj mob qub yog txaus. Wb tam sim no saib dab tsi nthuav tej yam yuav nrhiav tau nrog cov tshiab diagnostics uas tshwm sim nyob rau hauv lub analyzer tom qab yav dhau los kuaj. Lub sijhawm no, tag nrho ntawm 66 qhov kev kuaj pom dav dav tau ntxiv rau C ++ analyzer.

Fragment N31: Unreachable code

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 ceeb toom: V779 [CWE-561] nrhiav tsis tau code. Nws muaj peev xwm muaj qhov yuam kev tam sim no. ExecutionUtils.cpp 146

Raws li koj tau pom, ob ceg ntawm tus neeg teb xov tooj if xaus nrog kev hu rau tus neeg teb xov tooj rov qab los. Raws li, lub thawv CtorDtorsByPriority yuav tsis raug tshem tawm.

Fragment N32: Unreachable code

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

PVS-Studio ceeb toom: V779 [CWE-561] nrhiav tsis tau code. Nws muaj peev xwm muaj qhov yuam kev tam sim no. wb 835

Nthuav qhov xwm txheej. Cia peb saib qhov chaw no ua ntej:

return ParseTypeIdEntry(SummaryID);
break;

Thaum xub thawj siab ib muag, zoo li tsis muaj qhov yuam kev ntawm no. Nws zoo li tus neeg teb xov tooj so muaj ib qho ntxiv ntawm no, thiab koj tuaj yeem tshem nws yooj yim. Txawm li cas los xij, tsis yog txhua yam yooj yim.

Tus ntsuas ntsuas tau ceeb toom ntawm kab:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Thiab qhov tseeb, qhov code no yog unreachable. Txhua rooj plaub hauv hloov xaus nrog kev hu los ntawm tus neeg teb xov tooj rov qab los. Thiab tam sim no senseless ib leeg so tsis zoo li tsis mob! Tej zaum ib ceg yuav tsum xaus nrog sotsis yog nyob rau rov qab los?

Fragment N33: Random rov pib dua ntawm cov khoom siab

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 ceeb toom: V784 Qhov luaj li cas ntawm lub ntsej muag me ntsis yog tsawg dua qhov loj ntawm thawj operand. Qhov no yuav ua rau poob ntawm cov khoom siab dua. RuntimeDyld.cpp 815

Thov nco ntsoov tias muaj nuj nqi getStubAlignment rov hom tsis tau kos npe. Cia peb xam tus nqi ntawm qhov kev qhia, piv txwv tias qhov ua haujlwm rov qab tus nqi 8:

~(getStubAlignment() - 1)

~ (8u-1)

0 xf 8u

Tam sim no pom tias qhov sib txawv DataSize muaj 64-ntsis yam tsis tau kos npe. Nws hloov tawm tias thaum ua haujlwm DataSize & 0xFFFFFFFF8u, tag nrho peb caug-ob qhov kev txiav txim siab yuav rov pib dua xoom. Feem ntau, qhov no tsis yog qhov programmer xav tau. Kuv xav tias nws xav xam: DataSize & 0xFFFFFFFFFFFFFF8u.

Txhawm rau kho qhov yuam kev, koj yuav tsum sau qhov no:

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

Los yog li ntawd:

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

Fragment N34: Ua tsis tiav yam tsis meej pem

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 ceeb toom: V1028 [CWE-190] Possible overflow. Xav txog casting operands ntawm 'NumElts * Scale' tus neeg teb xov tooj mus rau hom 'size_t', tsis yog qhov tshwm sim. X86ISelLowering.h 1577

Hom kev qhia meej meej yog siv los tiv thaiv kev dhau thaum sib faib hom sib txawv rau cov menyuam. Txawm li cas los xij, hom kev qhia meej meej ntawm no tsis tiv thaiv kev dhau. Ua ntej, qhov sib txawv yuav muab sib npaug, thiab tsuas yog tom qab ntawd cov txiaj ntsig 32-ntsis ntawm qhov sib npaug yuav nthuav dav rau hom loj_t.

Fragment N35: Ua tsis tiav 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] Ob qhov chaws zoo sib xws tau pom. Tej zaum, qhov no yog typo thiab 'Op1' hloov pauv yuav tsum tau siv 'Op0'. InstCombineCompares.cpp 5507

Qhov kev nthuav dav tshiab no qhia txog cov xwm txheej uas ib daim ntawm cov lej tau raug theej thiab qee lub npe hauv nws tau pib hloov pauv, tab sis nyob rau hauv ib qho chaw lawv tsis tau kho nws.

Thov nco ntsoov tias hauv qhov thaiv thib ob lawv hloov pauv Op 0 rau Op 1. Tab sis nyob rau hauv ib qho chaw lawv tsis kho nws. Feem ntau nws yuav tsum tau sau zoo li no:

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

Fragment N36: Hloov tsis meej pem

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

PVS-Studio ceeb toom: V1001 [CWE-563] Qhov 'Mode' sib txawv yog muab tab sis tsis siv los ntawm qhov kawg ntawm qhov ua haujlwm. SIModeRegister.cpp 48

Nws yog ib qho txaus ntshai heev uas muab cov lus sib cav tib lub npe raws li cov tub kawm. Nws yooj yim heev kom tsis meej pem. Peb tsuas muaj rooj plaub no ua ntej peb. Qhov kev qhia no tsis tsim nyog:

Mode &= Mask;

Cov kev sib cav muaj nuj nqi hloov. Yog tag nrho. Qhov kev sib cav no tsis siv lawm. Feem ntau koj yuav tsum tau sau nws zoo li no:

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

Fragment N37: Hloov tsis meej pem

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

Ceeb Toom PVS-Studio: V1001 [CWE-563] Qhov 'Size' sib txawv yog muab rau tab sis tsis siv los ntawm qhov kawg ntawm kev ua haujlwm. ib.cpp 424

Qhov xwm txheej zoo ib yam li yav dhau los. Nws yuav tsum tau sau:

this->Size += this->EntrySize;

Fragment N38-N47: Lawv tsis nco qab xyuas qhov ntsuas

Yav dhau los, peb tau saib cov piv txwv ntawm kev kuaj mob tshwm sim V595. Nws lub ntsiab yog tias tus pointer yog dereferenced thaum pib, thiab tsuas yog tom qab ntawd xyuas. Kev kuaj mob hluas V1004 yog qhov opposite hauv lub ntsiab lus, tab sis kuj qhia ntau yam yuam kev. Nws txheeb xyuas cov xwm txheej uas tus pointer raug kuaj thaum pib thiab tom qab ntawd tsis nco qab ua li ntawd. Cia peb saib cov xwm txheej zoo li no hauv LLVM.

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

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

PVS-Studio ceeb toom: V1004 [CWE-476] Tus 'Ptr' pointer tau siv tsis muaj kev nyab xeeb tom qab nws tau txheeb xyuas tawm tsam nullptr. Kos kab: 729, 738. TargetTransformInfoImpl.h 738

Kuj tsis paub meej Ptr tej zaum yuav sib npaug nullptr, raws li pov thawj los ntawm daim tshev:

if (Ptr != nullptr)

Txawm li cas los xij, hauv qab no tus taw tes yog dereferenced yam tsis tau kuaj xyuas ua ntej:

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

Cia peb xav txog lwm qhov xwm txheej zoo sib xws.

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

PVS-Studio ceeb toom: V1004 [CWE-476] Tus 'FD' tus taw tes tau siv tsis muaj kev nyab xeeb tom qab nws tau txheeb xyuas tawm tsam nullptr. Kos kab: 3228, 3231. CGDebugInfo.cpp 3231

Ua tib zoo saib rau lub cim FD. Kuv paub tseeb tias qhov teeb meem pom meej meej thiab tsis tas yuav tsum muaj kev piav qhia tshwj xeeb.

Thiab ntxiv:

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

PVS-Studio ceeb toom: V1004 [CWE-476] Tus 'PtrTy' tus taw tes tau siv tsis muaj kev nyab xeeb tom qab nws tau txheeb xyuas tawm tsam nullptr. Kos kab: 960, 965. InterleavedLoadCombinePass.cpp 965

Yuav tiv thaiv koj tus kheej li cas los ntawm qhov yuam kev? Ua tib zoo saib xyuas Code-Review thiab siv PVS-Studio static analyzer kom tsis tu ncua xyuas koj cov cai.

Tsis muaj lub ntsiab lus hauv kev hais txog lwm cov kab ke nrog qhov ua yuam kev ntawm hom no. Kuv yuav tawm tsuas yog ib daim ntawv ceeb toom hauv kab lus:

  • V1004 [CWE-476] Tus taw tes 'Expr' tau siv tsis muaj kev nyab xeeb tom qab nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] Tus taw tes 'PI' tau siv tsis muaj kev nyab xeeb tom qab nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Tus taw tes 'StatepointCall' tau siv tsis muaj kev nyab xeeb tom qab nws tau txheeb xyuas tawm tsam nullptr. Kos kab: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] Tus taw tes 'RV' tau siv tsis muaj kev nyab xeeb tom qab nws tau txheeb xyuas tawm tsam nullptr. Kos kab: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Tus taw tes 'CalleeFn' tau siv tsis muaj kev nyab xeeb tom qab nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Tus 'TC' pointer tau siv tsis muaj kev nyab xeeb tom qab nws raug txheeb xyuas tawm tsam nullptr. Kos kab: 1819, 1824. Driver.cpp 1824

Fragment N48-N60: Tsis tseem ceeb, tab sis muaj qhov tsis xws luag (muaj peev xwm nco tau)

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

PVS-Studio ceeb toom: V1023 [CWE-460] Ib tus taw tes yam tsis muaj tswv yog ntxiv rau 'Cov Tswv Yim' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. llvm-isel-fuzzer.cpp 58

Ntxiv ib qho khoom mus rau qhov kawg ntawm lub thawv zoo li std:: ua > koj sau tsis tau xwb xxx.push_back(X tshiab), vim tsis muaj implicit hloov dua siab tshiab los ntawm X* Π² std::unique_ptr.

Ib qho kev daws teeb meem yog sau xxx.emplace_back(X tshiab)vim nws compiles: method emplace_rov constructs ib lub ntsiab ncaj qha los ntawm kev sib cav thiab thiaj li siv tau qhia meej constructors.

Nws tsis muaj kev nyab xeeb. Yog tias lub vector yog tag nrho, lub cim xeeb rov muab faib. Lub cim xeeb rov ua haujlwm yuav ua tsis tiav, ua rau muaj kev zam raug pov tseg std::bad_alloc. Hauv qhov no, tus pointer yuav ploj mus thiab cov khoom tsim yuav tsis raug muab tshem tawm.

Txoj kev nyab xeeb yog tsim unique_ptruas yuav muaj tus pointer ua ntej lub vector sim hloov chaw nco:

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

Txij li thaum C ++ 14, koj tuaj yeem siv 'std::make_unique':

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

Hom kev tsis zoo no tsis yog qhov tseem ceeb rau LLVM. Yog tias lub cim xeeb tsis tuaj yeem faib tau, lub compiler yuav nres. Txawm li cas los xij, rau kev siv nrog ntev sijhawm ua haujlwm, uas tsis tuaj yeem tsuas yog txiav tawm yog tias kev faib lub cim xeeb tsis ua haujlwm, qhov no tuaj yeem yog kab laum tiag tiag.

Yog li, txawm hais tias txoj cai no tsis ua rau muaj kev hem thawj rau LLVM, kuv pom tias nws muaj txiaj ntsig los tham txog qhov kev ua yuam kev no thiab tias PVS-Studio analyzer tau kawm paub txog nws.

Lwm cov lus ceeb toom ntawm hom no:

  • V1023 [CWE-460] Ib tus taw tes tsis muaj tus tswv tau ntxiv rau 'Passes' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. PassManager.h 546
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'AAs' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. AliasAnalysis.h 324
  • V1023 [CWE-460] Lub pointer yam tsis muaj tus tswv tau ntxiv rau 'Entry' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'AllEdges' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. TIAB SA 268
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'VMaps' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Cov Ntaub Ntawv' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. FDRLogBuilder.h 30
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'PendingSubmodules' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. ModuleMap.cpp 810
  • V1023 [CWE-460] Lub pointer yam tsis muaj tus tswv tau ntxiv rau 'Cov Khoom' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. DebugMap.cpp 88
  • V1023 [CWE-460] Lub pointer yam tsis muaj tus tswv tau ntxiv rau 'Strategies' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 685
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 686
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 688
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 689
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 690
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 691
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 692
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 693
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Modifiers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. xwm 694
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Operands' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] Lub pointer tsis muaj tus tswv tau ntxiv rau 'Stash' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] Ib tus taw tes tsis muaj tus tswv tau ntxiv rau 'Matchers' thawv los ntawm 'emplace_back' txoj kev. Lub cim xeeb xau yuav tshwm sim thaum muaj kev zam. GlobalISelEmitter.cpp 2702

xaus

Kuv tau tshaj tawm 60 ceeb toom tag nrho thiab tom qab ntawd nres. Puas muaj lwm yam tsis xws luag uas PVS-Studio analyzer kuaj pom hauv LLVM? Yog, kuv muaj. Txawm li cas los xij, thaum kuv tau sau cov kab lus tawg rau kab lus, nws yog yav tsaus ntuj, lossis hmo ntuj, thiab kuv txiav txim siab tias nws yog lub sijhawm hu nws ib hnub.

Kuv vam tias koj pom nws nthuav thiab yuav xav sim PVS-Studio analyzer.

Koj tuaj yeem rub tawm lub ntsuas ntsuas thiab tau txais tus yuam sij minesweeper ntawm nplooj ntawv no.

Qhov tseem ceeb tshaj plaws, siv kev tshuaj xyuas zoo li qub tsis tu ncua. Kev kuaj ib zaug, nqa tawm los ntawm peb thiaj li nrov cov txheej txheem ntawm kev soj ntsuam zoo li qub thiab PVS-Studio tsis yog qhov xwm txheej ib txwm muaj.

Hmoov zoo hauv kev txhim kho qhov zoo thiab kev ntseeg siab ntawm koj cov cai!

Nrhiav cov kab hauv LLVM 8 siv PVS-Studio analyzer

Yog tias koj xav qhia cov lus no nrog cov neeg hais lus Askiv, thov siv qhov txuas txhais lus: Andrey Karpov. Nrhiav Cov Kab Hauv LLVM 8 nrog PVS-Studio.

Tau qhov twg los: www.hab.com

Ntxiv ib saib