Ke ʻimi nei i nā pōpoki ma LLVM 8 me ka hoʻohana ʻana i ka ananaly PVS-Studio

Ke ʻimi nei i nā pōpoki ma LLVM 8 me ka hoʻohana ʻana i ka ananaly PVS-Studio
ʻOi aku ma mua o ʻelua makahiki i hala mai ka nānā ʻana i nā code hope loa o ka papahana LLVM me ka hoʻohana ʻana i kā mākou PVS-Studio analyzer. E hōʻoia ʻia ʻo ka PVS-Studio analyer ka mea alakaʻi no ka ʻike ʻana i nā hewa a me nā nāwaliwali. No ka hana ʻana i kēia, e nānā mākou a ʻike i nā hewa hou i ka hoʻokuʻu LLVM 8.0.0.

ʻatikala e kākau ʻia

ʻO kaʻoiaʻiʻo, ʻaʻole wau makemake e kākau i kēia ʻatikala. ʻAʻole hoihoi ke kākau e pili ana i kahi papahana a mākou i nānā ai i nā manawa he nui (1, 2, 3). ʻOi aku ka maikaʻi e kākau e pili ana i kahi mea hou, akā ʻaʻohe aʻu koho.

I kēlā me kēia manawa e hoʻokuʻu ʻia ai kahi mana hou o LLVM Clang Static Analyzer, loaʻa iā mākou nā nīnau o kēia ʻano ma kā mākou leka uila:

E nānā, ua aʻo ka mana hou o Clang Static Analyzer e ʻimi i nā hewa hou! Me he mea lā ke emi nei ka pili o ka hoʻohana ʻana iā PVS-Studio. ʻIke ʻo Clang i nā hewa hou aʻe ma mua o ka wā ma mua a loaʻa i nā mana o PVS-Studio. Pehea kou manao no keia?

I kēia, makemake wau e pane i kekahi mea penei:

ʻAʻole nō mākou e noho wale! Ua hoʻomaikaʻi maikaʻi mākou i nā hiki o ka PVS-Studio analyzer. No laila, mai hopohopo, hoʻomau mākou i ke alakaʻi e like me ka wā ma mua.

ʻO ka mea pōʻino, he pane ʻino kēia. ʻAʻohe mea hōʻoia i loko. A ʻo ia ke kumu aʻu e kākau nei i kēia ʻatikala i kēia manawa. No laila, ua nānā hou ʻia ka papahana LLVM a ua ʻike ʻia nā hewa like ʻole i loko. E hōʻike wau i kēia manawa i nā mea i manaʻo ʻia iaʻu. ʻAʻole hiki iā Clang Static Analyzer ke ʻike i kēia mau hewa (a i ʻole he mea paʻakikī ke hana pēlā me kāna kōkua). Akā hiki iā mākou. Eia kekahi, ua ʻike au a kākau i kēia mau hewa a pau i ke ahiahi hoʻokahi.

Akā ʻo ka kākau ʻana i ka ʻatikala i hala kekahi mau pule. ʻAʻole hiki iaʻu ke lawe iaʻu iho e hoʻokomo i kēia mau mea i loko o ka kikokikona :).

Ma ke ala, inā makemake ʻoe i nā ʻenehana i hoʻohana ʻia i ka PVS-Studio analyzer e ʻike ai i nā hewa a me nā nāwaliwali, a laila manaʻo wau e kamaʻāina me kēia. palapala.

Nā diagnostics hou a kahiko

E like me ka mea i hōʻike mua ʻia, ma kahi o ʻelua mau makahiki i hala ua nānā hou ʻia ka papahana LLVM, a ua hoʻoponopono ʻia nā hewa i ʻike ʻia. I kēia manawa e hōʻike ana kēia ʻatikala i kahi pūʻulu hewa hou. No ke aha i ʻike ʻia ai nā pōpoki hou? Aia nā kumu 3 no kēia:

  1. Ke ulu nei ka papahana LLVM, hoʻololi i ka code kahiko a hoʻohui i nā code hou. Ma keʻano maʻamau, aia nā hewa hou i ke code i hoʻololi ʻia a kākau ʻia. Hōʻike maopopo kēia i ka hoʻohana mau ʻana i ka loiloi static, ʻaʻole i kekahi manawa. Hōʻike maikaʻi kā mākou mau ʻatikala i nā hiki o ka PVS-Studio analyzer, akā ʻaʻohe mea pili i ka hoʻomaikaʻi ʻana i ka maikaʻi code a me ka hōʻemi ʻana i ke kumukūʻai no ka hoʻoponopono ʻana i nā hewa. E hoʻohana mau i ka helu helu static!
  2. Ke hoʻopau nei mākou a hoʻomaikaʻi i nā diagnostics e kū nei. No laila, hiki i ka mea nānā ke hoʻomaopopo i nā hewa i ʻike ʻole ʻia i ka wā o nā scan mua.
  3. Ua ʻike ʻia nā diagnostics hou ma PVS-Studio i loaʻa ʻole i 2 mau makahiki i hala. Ua hoʻoholo wau e hōʻike iā lākou i kahi ʻāpana ʻokoʻa e hōʻike maopopo i ka hoʻomohala ʻana o PVS-Studio.

ʻO nā hemahema i ʻike ʻia e nā diagnostics i loaʻa i 2 mau makahiki i hala

Māhele N1: Kope-Paʻi

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

ʻŌlelo aʻo PVS-Studio: V501 [CWE-570] He mau hua'ōlelo like 'Name.startswith("avx512.mask.permvar.")' ma ka hema a ma ka ʻākau o ka '||' mea hoʻohana. AutoUpgrade.cpp 73

Hoʻopaʻa pālua ʻia e hoʻomaka ka inoa me ka substring "avx512.mask.permvar.". Ma ka helu ʻelua, makemake lākou e kākau i kahi mea ʻē aʻe, akā poina e hoʻoponopono i ka kikokikona i kope ʻia.

Māhele 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;
  ....
}

'Ōlelo Aʻo PVS-Studio: V501 Loaʻa nā huaʻōlelo like 'CXNameRange_WantQualifier' ma ka hema a ma ka ʻākau o ka '|' mea hoʻohana. CIindex.cpp 7245

Ma muli o kahi typo, ua hoʻohana ʻia ka inoa ʻelua CXNameRange_WantQualifier.

Māhele N3: huikau me ka mea hoʻohana

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

ʻŌlelo aʻo PVS-Studio: V502 [CWE-783] He ʻano ʻokoʻa ka hana o ka '?:' ma mua o ka mea i manaʻo ʻia. He haʻahaʻa ko ka '?:' mea hoʻohana ma mua o ka '==' mea hoʻohana. PPCTargetTransformInfo.cpp 404

I koʻu manaʻo, he kuhihewa maikaʻi loa kēia. ʻAe, ʻike wau he manaʻo ʻē koʻu e pili ana i ka nani :).

I kēia manawa, e like me nā mea nui o ka mea hoʻohana, loiloi ʻia ka ʻōlelo penei:

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

Mai ka manaʻo kūpono, ʻaʻole kūpono kēlā ʻano kūlana, no ka mea hiki ke hoʻemi ʻia i:

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

He kuhihewa maopopo keia. ʻO ka mea nui, makemake lākou e hoʻohālikelike i ka 0/1 me kahi loli Index. No ka hoʻoponopono ʻana i ke code pono ʻoe e hoʻohui i nā pale a puni ka mea hoʻohana ternary:

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

Ma ke ala, weliweli loa ka mea hoʻohana ternary a hoʻonāukiuki i nā hewa kūpono. E akahele loa me ia a mai kuko i ka pale. Ua nānā au i kēia kumuhana i nā kikoʻī hou aku maanei, ma ka mokuna "E makaala i ka ?: Operator a hoʻopili iā ia i loko o nā Parentheses."

Māhele N4, N5: Kuhikuhi null

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

ʻŌlelo aʻo PVS-Studio: V522 [CWE-476] Hiki ke hoʻopanee ʻia ke kuhikuhi ʻana o ka 'LHS' null. TGParser.cpp 2152

Ina ke kuhikuhi LHS he null, pono e hoopukaia ka olelo ao. Eia nō naʻe, e hoʻopau ʻia kēia kuhikuhi null like: LHS->getAsString().

He kūlana maʻamau kēia i ka hūnā ʻia ʻana o kahi hewa i kahi mea hoʻoponopono hewa, no ka mea ʻaʻohe mea e hoʻāʻo iā lākou. Nānā nā mea hōʻike static i nā code hiki ke loaʻa, ʻaʻohe mea e hoʻohana pinepine ʻia. He laʻana maikaʻi loa kēia o ka hoʻokō ʻana o ka loiloi static i nā ʻenehana hoʻāʻo a me nā ʻenehana pale hewa.

Kuhihewa ka lawelawe kuhikuhi ʻana RHS ʻae ʻia ma ke code ma lalo iho nei: V522 [CWE-476] Hiki ke hoʻopau ʻia ka hoʻopaʻa inoa ʻole 'RHS'. TGParser.cpp 2186

Māhele N6: Hoʻohana i ke kuhikuhi ma hope o ka neʻe ʻana

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

'Ōlelo Aʻo PVS-Studio: V522 [CWE-476] Hiki ke hoʻopaneʻe ʻia ka ʻōkuhi null 'ProgClone'. Micompilation.cpp 601

I ka hoʻomaka ʻana he kuhikuhi akamai ProgClone hoʻopau i ka kuleana:

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

ʻOiaʻiʻo, i kēia manawa ProgClone he kuhikuhi nul. No laila, pono e hoʻokuʻu ʻia kahi kuhikuhi kuhikuhi null ma lalo iho:

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

Akā, ʻoiaʻiʻo, ʻaʻole hiki kēia! E hoʻomaopopo ʻaʻole i hoʻokō maoli ʻia ka loop.

I ka hoʻomaka o ka ipu Micompiled Functions hoʻomaʻemaʻe:

MiscompiledFunctions.clear();

A laila, hoʻohana ʻia ka nui o kēia ipu i ke kūlana loop:

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

He mea maʻalahi ke ʻike ʻaʻole hoʻomaka ka loop. Manaʻo wau he bug kēia a pono e kākau ʻokoʻa ke code.

Me he mea lā ua hālāwai mākou i kēlā parity kaulana o nā hewa! Hoʻopili kekahi hewa i kekahi :).

Māhele N7: Hoʻohana i ke kuhikuhi ma hope o ka neʻe ʻana

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

ʻŌlelo aʻo PVS-Studio: V522 [CWE-476] Hiki ke hoʻopaʻa ʻia ka hōʻike ʻana i ka 'Ho'āʻo' null pointer. Miscompilation.cpp 709

ʻO ke kūlana like hou. I ka mua, hoʻoneʻe ʻia nā mea i loko o ka mea, a laila hoʻohana ʻia me he mea lā ʻaʻohe mea i hana. ʻIke pinepine au i kēia kūlana i ka code program ma hope o ka puka ʻana o nā semantics neʻe i C++. ʻO kēia ke kumu makemake wau i ka ʻōlelo C++! Nui aʻe nā ala hou e pana ai i kou wāwae ponoʻī. E loaʻa mau ka hana a ka PVS-Studio analyzer :).

Māhele 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);
}

ʻŌlelo aʻo PVS-Studio: V522 [CWE-476] Hiki ke hoʻopanee ʻia ka ʻano kikoʻī null 'Type'. PrettyFunctionDumper.cpp 233

Ma waho aʻe o nā mea hana hewa, ʻaʻole i hoʻāʻo pinepine ʻia nā hana paʻi debug. He hihia like wale nō kā mākou i mua o mākou. Ke kali nei ka hana i ka mea hoʻohana, ka mea, ma kahi o ka hoʻoponopono ʻana i kāna mau pilikia, e koi ʻia e hoʻoponopono.

Ua pololei:

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

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

ʻŌlelo aʻo PVS-Studio: V522 [CWE-476] Hiki ke hoʻopaneʻe ʻia ka ʻōkuhi null 'Ty'. SearchableTableEmitter.cpp 614

Manaʻo wau ua maopopo nā mea a pau a ʻaʻole pono e wehewehe.

Māhele 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;
}

ʻŌlelo aʻo PVS-Studio: V570 Hāʻawi ʻia ka 'Identifier-> Type' iā ia iho. FormatTokenLexer.cpp 249

ʻAʻohe kumu o ka hāʻawi ʻana i kahi mea hoʻololi iā ia iho. Ua makemake paha lākou e kākau:

Identifier->Type = Question->Type;

Māhele N11: Haʻihaʻi kānalua

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

ʻŌlelo aʻo PVS-Studio: V622 [CWE-478] E noʻonoʻo e nānā i ka ʻōlelo 'switch'. Ua nalo paha ka mea hoʻohana 'hihia' mua. SystemZAsmParser.cpp 652

Aia kekahi mea hoʻohana kānalua loa i ka hoʻomaka wanaao ae. Ua poina anei ʻoe e kākau i kekahi mea ʻē aʻe ma ʻaneʻi?

Māhele N12: Ke nānā ʻana i kahi kuhikuhi ma hope o ka haʻalele ʻana

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

ʻŌlelo aʻo PVS-Studio: V595 [CWE-476] Ua hoʻohana ʻia ka pointer 'Callee' ma mua o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 172, 174. AMDGPUInline.cpp 172

Pointer Callee i ka hoʻomaka ua dereferenced i ka manawa i kapa ʻia ka hana loaaTTI.

A laila ʻike ʻia e nānā ʻia kēia kuhikuhi no ke kaulike nullptr:

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

Akā ua lohi loa…

Māhele N13 - N...: Ke nānā ʻana i kahi kuhikuhi ma hope o ka haʻalele ʻana

ʻAʻole kū hoʻokahi ke kūlana i kūkākūkā ʻia ma ka ʻāpana code mua. Hōʻike ʻia ma ʻaneʻi:

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

ʻŌlelo aʻo PVS-Studio: V595 [CWE-476] Ua hoʻohana ʻia ka ʻōkuhi 'CalleeFn' ma mua o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 1079, 1081. SimplifyLibCalls.cpp 1079

A maanei:

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

ʻŌlelo aʻo PVS-Studio: V595 [CWE-476] Ua hoʻohana ʻia ka ʻōkuhi 'ND' ma mua o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 532, 534. SemaTemplateInstantiateDecl.cpp 532

A maanei:

  • V595 [CWE-476] Ua hoʻohana ʻia ka ʻōkuhi 'U' ma mua o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Ua hoʻohana ʻia ka pointer 'ND' ma mua o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 2149, 2151. SemaTemplateInstantiate.cpp 2149

A laila lilo wau i makemake ʻole i ke aʻo ʻana i nā ʻōlelo luhi me ka helu V595. No laila ʻaʻole maopopo iaʻu inā he nui nā hewa like ʻole ma waho o nā mea i helu ʻia ma aneʻi. Loaʻa paha.

Māhele N17, N18: Hoʻololi kānalua

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

ʻŌlelo aʻo PVS-Studio: V629 [CWE-190] E noʻonoʻo e nānā i ka '~(Size - 1) << 1' hōʻike. ʻO ka hoʻololi ʻana i ka waiwai 32-bit me ka hoʻonui ʻana i ka ʻano 64-bit. AArch64AddressingModes.h 260

ʻAʻole paha ia he bug a hana pololei ke code e like me ka mea i manaʻo ʻia. Akā he wahi kānalua loa kēia a pono e nānā ʻia.

E ʻōlelo kākou i ka hoʻololi Size ua like ia me 16, a laila ua hoʻolālā ka mea kākau o ke code e kiʻi iā ia ma kahi loli NImms waiwai:

1111111111111111111111111111111111111111111111111111111111100000

Eia nō naʻe, ʻo ka hopena ka hopena:

0000000000000000000000000000000011111111111111111111111111100000

ʻO ka ʻoiaʻiʻo ʻo ka helu ʻana a pau me ka 32-bit unsigned type. A laila wale nō, e hoʻonui ʻia kēia ʻano 32-bit unsigned implicitly uint64_t. I kēia hihia, ʻo nā ʻāpana koʻikoʻi loa he zero.

Hiki iā ʻoe ke hoʻoponopono i ke kūlana e like me kēia:

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

Kūlike like: V629 [CWE-190] E noʻonoʻo e nānā i ka ʻōlelo 'Immr << 6'. ʻO ka hoʻololi ʻana i ka waiwai 32-bit me ka hoʻonui ʻana i ka ʻano 64-bit. AArch64AddressingModes.h 269

Māhele N19: ʻAʻohe huaʻōlelo e ae?

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

ʻŌlelo aʻo PVS-Studio: V646 [CWE-670] E noʻonoʻo e nānā i ka loiloi o ka noi. Ua nalo paha ka hua'ōlelo 'ē a'e. AMDGPUAsmParser.cpp 5655

ʻAʻohe hewa ma ʻaneʻi. Mai ia manawa-papa o ka mua if pau me hoʻomau, a laila, ʻaʻohe mea nui, aia kahi huaʻōlelo e ae aole paha. Ma kēlā me kēia ala e hana like ke code. Ua hala nae e ae ʻoi aku ka maopopo ʻole a me ka pōʻino o ke code. Inā i ka wā e hiki mai ana hoʻomau nalo, e hoʻomaka ke code e hana ʻokoʻa loa. I koʻu manaʻo, ʻoi aku ka maikaʻi o ka hoʻohui e ae.

Māhele N20: ʻEhā kuhi hewa o ke ʻano like

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

Nā ʻōlelo aʻo PVS-Studio:

  • V655 [CWE-480] Hoʻohui ʻia nā kaula akā ʻaʻole hoʻohana ʻia. E noʻonoʻo e nānā i ka ʻōlelo 'Result + Name.str()'. Hōʻailona.cpp 32
  • V655 [CWE-480] Hoʻohui ʻia nā kaula akā ʻaʻole hoʻohana ʻia. E noʻonoʻo e nānā i ka ʻōlelo 'Hua + "(ObjC Class)" + Name.str()'. Hōʻailona.cpp 35
  • V655 [CWE-480] Hoʻohui ʻia nā kaula akā ʻaʻole hoʻohana ʻia. E noʻonoʻo e nānā i ka ʻōlelo 'Hua + "(ObjC Class EH) " + Name.str()'. Hōʻailona.cpp 38
  • V655 [CWE-480] Hoʻohui ʻia nā kaula akā ʻaʻole hoʻohana ʻia. E noʻonoʻo e nānā i ka ʻōlelo 'Hua + "(ObjC IVar)" + Name.str()'. Hōʻailona.cpp 41

Ma ka pōʻino, hoʻohana ʻia ka + mea hoʻohana ma kahi o ka += mea hoʻohana. ʻO ka hopena, ʻo ia nā hoʻolālā i nele i ke ʻano.

Māhele N21: ʻAʻole i wehewehe ʻia

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

E ho'āʻo e ʻimi iā ʻoe iho i ke code weliweli. A he kiʻi kēia e hoʻohuli i ka manaʻo i ʻole e nānā koke i ka pane.

Ke ʻimi nei i nā pōpoki ma LLVM 8 me ka hoʻohana ʻana i ka ananaly PVS-Studio

ʻŌlelo aʻo PVS-Studio: V708 [CWE-758] Hoʻohana ʻia ka hana ʻino: 'FeaturesMap[Op] = FeaturesMap.size()', kahi 'FeaturesMap' o ka papa 'palapala'. Hiki i kēia ke alakaʻi i ka hana i wehewehe ʻole ʻia. RISCVCompressInstEmitter.cpp 490

Laina pilikia:

FeaturesMap[Op] = FeaturesMap.size();

Inā ʻeleʻele Op ʻAʻole i loaʻa, a laila hana ʻia kahi mea hou ma ka palapala ʻāina a kākau ʻia ka helu o nā mea ma kēia palapala ʻāina. ʻAʻole ʻike ʻia inā e kāhea ʻia ka hana ka nui ma mua a ma hope paha o ka hoʻohui ʻana i kahi mea hou.

Māhele N22-N24: Nā hana hou

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

ʻŌlelo aʻo PVS-Studio: V519 [CWE-563] Hāʻawi ʻia ka helu 'NType' i ʻelua mau waiwai. He kuhihewa paha keia. E nānā i nā laina: 1663, 1664. MachOObjectFile.cpp 1664

ʻAʻohe oʻu manaʻo he hewa maoli ma ʻaneʻi. He hana hou ʻole pono ʻole. Akā naʻe he hewa.

Pēlā nō:

  • V519 [CWE-563] Hāʻawi ʻia ka helu 'B.NDesc' i ʻelua mau waiwai. He kuhihewa paha keia. E nānā i nā laina: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Hāʻawi ʻia ka ʻano helu i ʻelua mau manawa. He kuhihewa paha keia. E nānā i nā laina: 59, 61. coff2yaml.cpp 61

Māhele N25-N27: Hoʻololi hou aku

I kēia manawa, e nānā kākou i kahi ʻano ʻokoʻa iki o ka 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;
  ....
}

PVS-Studio ʻōlelo aʻoaʻo: V519 [CWE-563] ʻO ka 'Alignment' variable i hāʻawi ʻia i ʻelua mau waiwai. He kuhihewa paha keia. E nānā i nā laina: 1158, 1160. LoadStoreVectorizer.cpp 1160

He code ʻano ʻē loa kēia i ʻike ʻia i loko o kahi hewa kūpono. I ka hoʻomaka, hoʻololi hoʻopololei ua hāʻawi ʻia kahi waiwai ma muli o ke kūlana. A laila hoʻi hou ka hana, akā i kēia manawa me ka ʻole o ka nānā.

Hiki ke ʻike ʻia nā kūlana like ma aneʻi:

  • V519 [CWE-563] Hāʻawi ʻia ka helu 'Effects' i ʻelua mau waiwai. He kuhihewa paha keia. E nānā i nā laina: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Ua hāʻawi ʻia ka helu 'ExpectNoDerefChunk' i ʻelua mau waiwai. He kuhihewa paha keia. E nānā i nā laina: 4970, 4973. SemaType.cpp 4973

Māhele N28: Kūlana ʻoiaʻiʻo mau

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

ʻŌlelo aʻo PVS-Studio: V547 [CWE-571] ʻOiaʻiʻo mau ka ʻōlelo 'nextByte != 0x90'. X86DisassemblerDecoder.cpp 379

ʻAʻole kūpono ka nānā ʻana. Hoʻololi nextByte ʻaʻole like mau me ka waiwai 0x90, e hahai ana mai ka helu mua. He ʻano kuhi hewa kēia.

Māhele N29 - N...: Kūlana ʻoiaʻiʻo/hewa mau

Hoʻopuka ka mea loiloi i nā ʻōlelo aʻo he nui ke kūlana holoʻokoʻa (V547) a i ʻole kekahi hapa o ia mea (V560) he ʻoiaʻiʻo a he wahaheʻe paha. ʻO ka manawa pinepine ʻaʻole kēia mau hewa maoli, akā he code sloppy wale nō, ka hopena o ka hoʻonui macro, a me nā mea like. Eia nō naʻe, kūpono ke nānā ʻana i kēia mau ʻōlelo aʻo a pau, no ka mea, ʻike ʻia nā hewa loiloi maoli i kēlā me kēia manawa. No ka laʻana, kānalua kēia ʻāpana o ke code:

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

ʻŌlelo aʻo PVS-Studio: V560 [CWE-570] He wahaheʻe kekahi hapa o ka ʻōlelo kūlana: RegNo == 0xe. ARMDisassembler.cpp 939

ʻO ka 0xE mau ka waiwai 14 ma ka decimal. Nānā RegNo == 0xe ʻaʻohe manaʻo no ka mea inā Ka helu inoa > 13, a laila e hoʻopau ka hana i kāna hana.

Nui nā ʻōlelo luhi ʻē aʻe me nā ID V547 a me V560, akā e like me V595, ʻAʻole au i hoihoi i ke aʻo ʻana i kēia mau ʻōlelo aʻo. Ua maopopo ua lawa kaʻu mau mea e kākau ai i kahi ʻatikala :). No laila, ʻaʻole ʻike ʻia ka nui o nā hewa o kēia ʻano i ʻike ʻia ma LLVM me ka hoʻohana ʻana i ka PVS-Studio.

E hāʻawi wau iā ʻoe i kahi laʻana no ke aha e ʻoluʻolu ai ke aʻo ʻana i kēia mau mea hoʻowalewale. Ua pololei loa ka mea anaana i ka hoopuka ana i ka olelo ao no keia code. Akā, ʻaʻole kēia he kuhi.

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

PVS-Studio 'Ōlelo Aʻo: V547 [CWE-570] Hōʻike '!HasError' he wahaheʻe mau. UnwrappedLineParser.cpp 1635

Māhele N30: ​​Hoʻihoʻi hou mai

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

ʻŌlelo aʻo PVS-Studio: V612 [CWE-670] He 'hoʻihoʻi' ʻole i loko o kahi loop. R600OptimizeVectorRegisters.cpp 63

He kuhi paha kēia a i ʻole kahi ʻenehana kikoʻī i manaʻo ʻia e wehewehe i kekahi mea i nā mea polokalamu e heluhelu ana i ke code. ʻAʻole wehewehe kēia hoʻolālā i kekahi mea iaʻu a he mea kānalua loa. ʻOi aku ka maikaʻi ʻaʻole e kākau pēlā :).

luhi? A laila ʻo ka manawa kēia e hana ai i ke kī a i ʻole ke kope.

Ke ʻimi nei i nā pōpoki ma LLVM 8 me ka hoʻohana ʻana i ka ananaly PVS-Studio

ʻO nā hemahema i ʻike ʻia e nā diagnostics hou

Manaʻo wau ua lawa nā hana 30 o nā diagnostics kahiko. E ʻike kākou i nā mea hoihoi e hiki ke loaʻa me nā diagnostics hou i ʻike ʻia ma ka mea ananala ma hope mamua hōʻoia. I loko o kēia manawa, ua hoʻohui ʻia he 66 mau diagnostics general-purpose i ka C++ analyzer.

Māhele N31: Ka helu hiki ʻole ke loaʻa

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

ʻŌlelo aʻo PVS-Studio: V779 [CWE-561] ʻIke ʻia ke code hiki ʻole ke kiʻi ʻia. He hewa paha. ExecutionUtils.cpp 146

E like me kāu e ʻike ai, nā lālā ʻelua o ka mea hoʻohana if pau me ke kelepona i ka mea hoʻohana hoi mai. No laila, ka ipu CtorDtorsByPriority ʻaʻole loa e hoʻomaʻemaʻe ʻia.

Māhele N32: Ka helu hiki ʻole ke loaʻa

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

ʻŌlelo aʻo PVS-Studio: V779 [CWE-561] ʻike ʻia ke code hiki ʻole ke ʻike ʻia. Aia paha he hewa. LLParser.cpp 835

Kūlana hoihoi. E nānā mua kākou i kēia wahi:

return ParseTypeIdEntry(SummaryID);
break;

I ka nānā mua ʻana, me he mea lā ʻaʻohe hewa ma ʻaneʻi. Ua like ia me ka mea hoʻohana wanaao ae aia kekahi mea ʻē aʻe ma ʻaneʻi, a hiki iā ʻoe ke holoi wale. Akā naʻe, ʻaʻole maʻalahi nā mea a pau.

Hoʻopuka ka mea anamanaʻo i kahi ʻōlelo aʻo ma nā laina:

Lex.setIgnoreColonInIdentifiers(false);
return false;

A ʻoiaʻiʻo, ʻaʻole hiki ke loaʻa kēia code. ʻO nā hihia a pau ma kuapo pau me ke kelepona mai ka mea hoʻohana hoi mai. A i kēia manawa ʻaʻohe manaʻo wale nō wanaao ae ʻaʻohe mea ʻino loa! E pau paha kekahi o na lala me wanaao aeʻaʻole naʻe hoi mai?

Māhele N33: Hoʻoponopono hou i nā ʻāpana kiʻekiʻe

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

ʻŌlelo aʻo PVS-Studio: V784 ʻOi aku ka nui o ka mask bit ma mua o ka nui o ka operand mua. ʻO kēia ka mea e nalowale ai nā ʻāpana kiʻekiʻe. RuntimeDyld.cpp 815

E ʻoluʻolu e hoʻomaopopo i ka hana getStubAlignment ʻano hoʻihoʻi ʻaihue ʻole. E helu kāua i ka waiwai o ka ʻōlelo, me ka manaʻo e hoʻihoʻi ka hana i ka waiwai 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

I kēia manawa e nānā i ka loli Nui ʻIkepili Loaʻa iā ia kahi ʻano 64-bit unsigned type. ʻIke ʻia i ka wā e hoʻokō ai i ka hana DataSize & 0xFFFFFFF8u, e hoʻihoʻi ʻia nā ʻāpana kiʻekiʻe he kanakolukumamālua i ka ʻole. ʻO ka mea nui, ʻaʻole kēia ka mea i makemake ai ka mea polokalamu. Manaʻo wau ua makemake ʻo ia e helu: DataSize & 0xFFFFFFFFFFFFFFFF8u.

No ka hoʻoponopono ʻana i ka hewa, pono ʻoe e kākau i kēia:

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

A penei paha:

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

Māhele N34: ʻAʻole i hoʻolei ʻia ke ʻano kikoʻī

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

ʻŌlelo aʻo PVS-Studio: V1028 [CWE-190] Hiki ke kahe. E noʻonoʻo e hoʻolei i nā operand o ka mea hoʻohana 'NumElts * Scale' i ke ʻano 'size_t', ʻaʻole ka hopena. X86ISelLowering.h 1577

Hoʻohana ʻia ka hoʻoheheʻe ʻana i ke ʻano e pale aku i ke kahe ʻana i ka wā e hoʻonui ai i nā ʻano hoʻololi INT. Eia nō naʻe, ʻaʻole pale ka hoʻolei ʻana i ke ʻano kikoʻī ma ʻaneʻi. ʻO ka mua, e hoʻonui ʻia nā mea hoʻololi, a laila e hoʻonui ʻia ka hopena 32-bit o ka hoʻonui ʻana i ke ʻano. nui_t.

Māhele N35: Kāpe-Pāʻī ʻole

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] Ua loaʻa ʻelua mau ʻāpana code like. Malia paha, he typo kēia a pono e ho'ohana 'ia ka 'Op1' ma kahi o 'Op0'. InstCombineCompares.cpp 5507

Hōʻike kēia diagnostic hoihoi hou i nā kūlana kahi i kope ʻia ai kahi ʻāpana code a ua hoʻomaka e hoʻololi ʻia kekahi mau inoa i loko, akā ma kahi hoʻokahi ʻaʻole lākou i hoʻoponopono.

E ʻoluʻolu e hoʻomaopopo i ka lua o ka poloka ua hoʻololi lākou Op0 maluna o Op1. Akā ma kahi hoʻokahi ʻaʻole lākou i hoʻoponopono. Pono paha e kākau ʻia e like me kēia:

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

Māhele N36: Huikau Paʻa

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

ʻŌlelo aʻo PVS-Studio: V1001 [CWE-563] Hāʻawi ʻia ka ʻano hoʻololi 'Mode' akā ʻaʻole hoʻohana ʻia e ka pau ʻana o ka hana. SIModeRegister.cpp 48

He mea weliweli loa ka hāʻawi ʻana i nā manaʻo manaʻo i nā inoa like me nā lālā o ka papa. He mea maʻalahi loa ka huikau. He hihia like wale nō kā mākou i mua o mākou. ʻAʻole kūpono kēia ʻōlelo:

Mode &= Mask;

Hoʻololi ka manaʻo hana. ʻo ia wale nō. ʻAʻole hoʻohana hou ʻia kēia hoʻopaʻapaʻa. Ua kākau paha ʻoe penei:

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

Māhele N37: Huikau Paʻa

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

'Ōlelo Aʻo PVS-Studio: V1001 [CWE-563] Hāʻawi ʻia ka ʻano hoʻololi 'Size' akā ʻaʻole hoʻohana ʻia e ka hopena o ka hana. Object.cpp 424

Ua like ke kūlana me ko mua. Pono e kākau ʻia:

this->Size += this->EntrySize;

Māhele N38-N47: Ua poina iā lākou e nānā i ka index

Ma mua, ua nānā mākou i nā laʻana o ka diagnostic triggering V595. ʻO ka mea nui, ʻaʻole i kuhikuhi ʻia ka pointer ma ka hoʻomaka, a laila nānā ʻia. ʻŌpio diagnostics V1004 ʻo ia ka mea ʻē aʻe i ka manaʻo, akā hōʻike pū kekahi i nā hewa he nui. Hōʻike ia i nā kūlana kahi i nānā ʻia ai ka pointer i ka hoʻomaka ʻana a laila poina e hana pēlā. E nānā i kēlā mau hihia i loaʻa i loko o 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());  // <=
  ....
}

ʻŌlelo aʻo PVS-Studio: V1004 [CWE-476] Ua hoʻohana pono ʻole ʻia ka ʻōkuhi 'Ptr' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 729, 738. TargetTransformInfoImpl.h 738

Nā ʻano ʻO Ptr like paha nullptr, e like me ka mea i hōʻike ʻia e ka māka:

if (Ptr != nullptr)

Eia naʻe, ma lalo o kēia kuhikuhi ke hoʻoneʻe ʻia me ka ʻole o ka nānā mua ʻana:

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

E noʻonoʻo kākou i kekahi hihia like.

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

ʻŌlelo aʻo PVS-Studio: V1004 [CWE-476] Ua hoʻohana pono ʻole ʻia ka ʻōkuhi 'FD' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 3228, 3231. CGDebugInfo.cpp 3231

E hoʻolohe i ka hōʻailona FD. Ua maopopo iaʻu ua ʻike maopopo ʻia ka pilikia a ʻaʻole koi ʻia ka wehewehe kūikawā.

A eia kekahi:

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

ʻŌlelo aʻo PVS-Studio: V1004 [CWE-476] Ua hoʻohana pono ʻia ka 'PtrTy' pointer ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 960, 965. InterleavedLoadCombinePass.cpp 965

Pehea e pale ai iā ʻoe iho mai ia mau hewa? E noʻonoʻo nui i ka Code-Review a hoʻohana i ka PVS-Studio static analyzer e nānā mau i kāu code.

ʻAʻohe kumu o ka haʻi ʻana i nā ʻāpana code ʻē aʻe me nā hewa o kēia ʻano. E waiho wale wau i kahi papa inoa o nā ʻōlelo aʻo ma ka ʻatikala:

  • V1004 [CWE-476] Ua hoʻohana pono ʻia ka 'Expr' pointer ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] Ua hoʻohana pono ʻia ka ʻōkuhi 'PI' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Ua hoʻohana pono ʻia ka ʻōkuhi 'StatepointCall' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] Ua hoʻohana pono ʻole ʻia ka ʻōkuhi 'RV' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Ua hoʻohana pono ʻia ka ʻōkuhi 'CalleeFn' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Ua hoʻohana pono ʻia ka ʻōkuhi 'TC' ma hope o ka hōʻoia ʻana i ka nullptr. E nānā i nā laina: 1819, 1824. Keaukaha.cpp 1824

Māhele N48-N60: ʻAʻole koʻikoʻi, akā he kīnā (hiki paha i ka leki hoʻomanaʻo)

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

ʻŌlelo aʻo PVS-Studio: V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'Strategies' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-isel-fuzzer.cpp 58

E hoʻohui i kahi mea i ka hope o kahi pahu like std::vector > ʻaʻole hiki iā ʻoe ke kākau wale xxx.push_back(X hou), no ka mea, ʻaʻohe hoʻololi implicit mai X* в std:: unique_ptr.

ʻO kahi hoʻonā maʻamau e kākau xxx.emplace_back(X hou)oiai ua houluulu: method emplace_back kūkulu pololei i kahi mea mai nā hoʻopaʻapaʻa a no laila hiki ke hoʻohana i nā mea kūkulu kikoʻī.

ʻAʻole palekana. Inā piha ka vector, a laila hoʻokaʻawale hou ʻia ka hoʻomanaʻo. Hiki ke hāʻule ka hana hoʻokaʻawale hoʻomanaʻo, e hoʻolei ʻia kahi ʻokoʻa std::bad_alloc. I kēia hihia, e nalowale ke kuhikuhi a ʻaʻole e holoi ʻia ka mea i hana ʻia.

ʻO kahi hoʻonā palekana ka hana ʻana unique_ptrnona ka pointer ma mua o ka hoʻāʻo ʻana o ka vector e hoʻokaʻawale i ka hoʻomanaʻo:

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

Mai ka C++ 14, hiki iā ʻoe ke hoʻohana 'std::make_unique':

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

ʻAʻole koʻikoʻi kēia ʻano kīnā no LLVM. Inā ʻaʻole hiki ke hoʻokaʻawale ʻia ka hoʻomanaʻo, hoʻopau wale ka mea hoʻopili. Eia naʻe, no nā noi me ka lōʻihi uptime, ʻaʻole hiki ke hoʻopau wale inā hāʻule ka hoʻokaʻawale ʻana i ka hoʻomanaʻo, hiki i kēia ke lilo i mea ʻino maoli.

No laila, ʻoiai ʻaʻole i hoʻoweliweli kēia code i ka LLVM, ʻike wau he mea pono ke kamaʻilio e pili ana i kēia ʻano kuhi hewa a ua aʻo ʻia ka PVS-Studio analyzer e ʻike iā ia.

Nā ʻōlelo aʻo ʻē aʻe o kēia ʻano:

  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'Passes' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. PassManager.h 546
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'AA' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. AliasAnalysis.h 324
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'Entries' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'AllEdges' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. CFGMST.h 268
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'VMaps' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'Records' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. FDRLogBuilder.h 30
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'PendingSubmodules' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. ModuleMap.cpp 810
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'Objects' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. DebugMap.cpp 88
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Strategies' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 685
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 686
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 688
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 689
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 690
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 691
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 692
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 693
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Modifiers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. llvm-stress.cpp 694
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'Operands' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka ipu 'Stash' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] Hoʻohui ʻia kahi kuhikuhi me ka mea ʻole i ka pahu 'Matchers' ma ke ʻano 'emplace_back'. E loaʻa kahi leak hoʻomanaʻo inā he ʻokoʻa. GlobalISelEmitter.cpp 2702

hopena

Ua hoʻopuka au i 60 mau ʻōlelo aʻo a pau a laila hoʻōki. Aia kekahi mau hemahema ʻē aʻe i ʻike ʻia e ka PVS-Studio analyzer ma LLVM? ʻAe, ua loaʻa iaʻu. Eia naʻe, i koʻu kākau ʻana i nā ʻāpana code no ka ʻatikala, ua ahiahi, a i ʻole i ka pō, a ua hoʻoholo wau ʻo ia ka manawa e kapa ai he lā.

Manaʻo wau ua loaʻa iā ʻoe he mea hoihoi a makemake ʻoe e hoʻāʻo i ka PVS-Studio analyzer.

Hiki iā ʻoe ke hoʻoiho i ka mea anaana a loaʻa ke kī minesweeper ma kēiaʻaoʻao.

ʻO ka mea nui loa, e hoʻohana mau i ka loiloi static. Hoʻokahi manawa nānā, i hana ʻia e mākou i mea e hoʻolaha ai i ke ʻano o ka loiloi static a ʻo PVS-Studio ʻaʻole ia he hanana maʻamau.

Laki maikaʻi i ka hoʻomaikaʻi ʻana i ka maikaʻi a me ka hilinaʻi o kāu code!

Ke ʻimi nei i nā pōpoki ma LLVM 8 me ka hoʻohana ʻana i ka ananaly PVS-Studio

Inā makemake ʻoe e kaʻana like i kēia ʻatikala me kahi anaina ʻōlelo Pelekania, e ʻoluʻolu e hoʻohana i ka loulou unuhi: Andrey Karpov. Ke ʻimi nei i nā Bugs ma LLVM 8 me PVS-Studio.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka