Wiwa awọn idun ni LLVM 8 lilo PVS-Studio itupale

Wiwa awọn idun ni LLVM 8 lilo PVS-Studio itupale
Diẹ ẹ sii ju ọdun meji lọ lati igba ayẹwo koodu to kẹhin ti iṣẹ akanṣe LLVM ni lilo oluyẹwo PVS-Studio wa. Jẹ ki a rii daju wipe PVS-Studio analyzer jẹ ṣi kan asiwaju ọpa fun idamo asise ati ki o pọju vulnerabilities. Lati ṣe eyi, a yoo ṣayẹwo ati rii awọn aṣiṣe tuntun ni idasilẹ LLVM 8.0.0.

Article to wa ni kọ

Lati so ooto, Emi ko fẹ lati kọ nkan yii. Ko ṣe igbadun lati kọ nipa iṣẹ akanṣe kan ti a ti ṣayẹwo tẹlẹ ni ọpọlọpọ igba (1, 2, 3). O dara lati kọ nipa nkan titun, ṣugbọn emi ko ni aṣayan.

Ni gbogbo igba ti ẹya tuntun ti LLVM ti wa ni idasilẹ tabi imudojuiwọn Clang Aimi Oluyanju, a gba awọn ibeere ti iru atẹle ninu meeli wa:

Wo, ẹya tuntun ti Clang Static Analyzer ti kọ ẹkọ lati wa awọn aṣiṣe tuntun! O dabi si mi pe ibaramu ti lilo PVS-Studio n dinku. Clang wa awọn aṣiṣe diẹ sii ju iṣaaju lọ ati mu awọn agbara ti PVS-Studio. Kini o ro nipa eyi?

Lati eyi Mo nigbagbogbo fẹ lati dahun nkankan bi:

A ko joko laišišẹ! A ti ni ilọsiwaju awọn agbara ti PVS-Studio analyzer. Nitorinaa maṣe yọ ara rẹ lẹnu, a tẹsiwaju lati ṣe itọsọna bi iṣaaju.

Laanu, eyi jẹ idahun buburu. Ko si awọn ẹri ninu rẹ. Ìdí nìyẹn tí mo fi ń kọ àpilẹ̀kọ yìí báyìí. Nitorinaa, iṣẹ akanṣe LLVM ti ṣayẹwo lẹẹkan si ati pe a ti rii ọpọlọpọ awọn aṣiṣe ninu rẹ. Emi yoo ṣe afihan awọn ti o dabi ẹni pe o nifẹ si mi. Oluyanju Clang Static ko le rii awọn aṣiṣe wọnyi (tabi ko ṣe aibalẹ pupọ lati ṣe bẹ pẹlu iranlọwọ rẹ). Sugbon a le. Pẹlupẹlu, Mo rii ati kọ gbogbo awọn aṣiṣe wọnyi silẹ ni irọlẹ kan.

Ṣugbọn kikọ nkan naa gba ọpọlọpọ awọn ọsẹ. Emi ko le mu ara mi lati fi gbogbo eyi sinu ọrọ :).

Nipa ọna, ti o ba nifẹ si kini awọn imọ-ẹrọ ti a lo ninu olutọpa PVS-Studio lati ṣe idanimọ awọn aṣiṣe ati awọn ailagbara ti o pọju, lẹhinna Mo daba lati ni ibatan pẹlu eyi. akiyesi.

Titun ati atijọ aisan

Gẹgẹbi a ti ṣe akiyesi tẹlẹ, ni nkan bi ọdun meji sẹyin iṣẹ akanṣe LLVM ti tun ṣayẹwo lẹẹkansii, ati pe awọn aṣiṣe ti a rii ni atunṣe. Bayi nkan yii yoo ṣafihan ipele tuntun ti awọn aṣiṣe. Kini idi ti a rii awọn idun tuntun? Awọn idi mẹta wa fun eyi:

  1. Ise agbese LLVM n dagbasi, yiyipada koodu atijọ ati fifi koodu titun kun. Nipa ti, awọn aṣiṣe titun wa ninu iyipada ati koodu kikọ. Eyi ṣe afihan kedere pe o yẹ ki a lo itupalẹ aimi nigbagbogbo, kii ṣe lẹẹkọọkan. Awọn nkan wa fihan daradara awọn agbara ti PVS-Studio analyzer, ṣugbọn eyi ko ni nkankan lati ṣe pẹlu imudarasi didara koodu ati idinku idiyele ti awọn aṣiṣe titunṣe. Lo atunnkanka koodu aimi nigbagbogbo!
  2. A n pari ati imudarasi awọn iwadii aisan to wa tẹlẹ. Nitorinaa, olutupalẹ le ṣe idanimọ awọn aṣiṣe ti ko ṣe akiyesi lakoko awọn iwoye iṣaaju.
  3. Awọn iwadii aisan titun ti han ni PVS-Studio ti ko si ni ọdun 2 sẹhin. Mo pinnu lati ṣe afihan wọn ni apakan ọtọtọ lati ṣe afihan idagbasoke ti PVS-Studio.

Awọn abawọn ti a ṣe idanimọ nipasẹ awọn iwadii aisan ti o wa ni ọdun 2 sẹhin

Ajẹkù N1: Daakọ-lẹẹmọ

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

Ikilọ PVS-Studio: V501 [CWE-570] Awọn ikosile-ipin kanna wa 'Name.startswith("avx512.mask.permvar.")' si apa osi ati si ọtun ti '||' onišẹ. AutoUpgrade.cpp 73

O jẹ ayẹwo lẹẹmeji pe orukọ naa bẹrẹ pẹlu okun “avx512.mask.permvar.”. Ni ayẹwo keji, o han gbangba wọn fẹ lati kọ nkan miiran, ṣugbọn wọn gbagbe lati ṣe atunṣe ọrọ ti a daakọ.

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

Ikilọ PVS-Studio: V501 Awọn ikosile-ipin kanna wa 'CXNameRange_WantQualifier' si apa osi ati si ọtun ti '|' onišẹ. Cindex.cpp 7245

Nitori a typo, kanna ti a npè ni ibakan lo lemeji CXNameRange_WantQualifier.

Ajẹkù N3: Idarudapọ pẹlu iṣaju oniṣẹ

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

Ikilọ PVS-Studio: V502 [CWE-783] Boya oniṣẹ ẹrọ '?:' n ṣiṣẹ ni ọna ti o yatọ ju bi o ti ṣe yẹ lọ. Oniṣẹ '?:' naa ni ayo kekere ju oniṣẹ '==' lọ. PPCTargetTransformInfo.cpp 404

Ni ero mi, eyi jẹ aṣiṣe ti o lẹwa pupọ. Bẹẹni, Mo mọ pe Mo ni awọn imọran ajeji nipa ẹwa :).

Bayi, ni ibamu si ayo onišẹ, a ṣe ayẹwo ọrọ naa gẹgẹbi atẹle:

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

Lati oju wiwo ti o wulo, iru ipo bẹẹ ko ni oye, nitori o le dinku si:

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

Eyi jẹ aṣiṣe ti o daju. O ṣeese, wọn fẹ lati ṣe afiwe 0/1 pẹlu oniyipada kan Ìwé. Lati ṣatunṣe koodu naa o nilo lati ṣafikun awọn akọmọ ni ayika oniṣẹ ternary:

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

Nipa ọna, oniṣẹ ternary jẹ eewu pupọ ati mu awọn aṣiṣe ọgbọn mu. Ṣọra gidigidi pẹlu rẹ ki o maṣe ṣe ojukokoro pẹlu awọn akomo. Mo wo koko yii ni awọn alaye diẹ sii nibi, nínú orí “Ṣọ́ra fún ?: Oṣiṣẹ́ kí o sì Fi Ọ́ sínú Àwọn Òkè.”

Ajeku N4, N5: Atọka 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;
  }
  ....
}

Ikilọ PVS-Studio: V522 [CWE-476] Dereferencing ti itọka asan 'LHS' le waye. TGParser.cpp 2152

Ti o ba ti ijuboluwole LHS jẹ asan, a Ikilọ yẹ ki o wa ti oniṣowo. Sibẹsibẹ, dipo, itọka asan kanna ni yoo kọ silẹ: LHS->getAsString().

Eyi jẹ ipo aṣoju pupọ nigbati aṣiṣe kan farapamọ ni oluṣakoso aṣiṣe, nitori ko si ẹnikan ti o ṣe idanwo wọn. Awọn atunnkanka aimi ṣayẹwo gbogbo koodu ti o le de ọdọ, laibikita iye igba ti o nlo. Eyi jẹ apẹẹrẹ ti o dara pupọ ti bii itupalẹ aimi ṣe ṣe iranlowo awọn idanwo miiran ati awọn ilana aabo aṣiṣe.

Itọkasi mimu aṣiṣe RHS laaye ni koodu kan ni isalẹ: V522 [CWE-476] Dereferencing ti awọn asan ijuboluwole 'RHS' le gba ibi. TGParser.cpp 2186

Fragment N6: Lilo itọka lẹhin gbigbe

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 Ikilọ: V522 [CWE-476] Dereferencing ti awọn asan ijuboluwole 'ProgClone' le waye. Iṣakojọpọ.cpp 601

Ni ibere a smati ijuboluwole ProgClone dẹkun lati ni nkan naa:

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

Ni otitọ, ni bayi ProgClone jẹ asan ijuboluwole. Nitorinaa, ifasilẹ itọka asan yẹ ki o waye ni isalẹ:

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

Ṣugbọn, ni otitọ, eyi kii yoo ṣẹlẹ! Ṣe akiyesi pe lupu naa ko ṣiṣẹ gangan.

Ni ibere ti eiyan Awọn iṣẹ aiṣedeede nu:

MiscompiledFunctions.clear();

Nigbamii ti, iwọn ti eiyan yii ni a lo ni ipo loop:

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

O rọrun lati rii pe lupu naa ko bẹrẹ. Mo ro pe eyi tun jẹ kokoro ati pe koodu yẹ ki o kọ ni oriṣiriṣi.

O dabi wipe a ti konge wipe olokiki iyi ti awọn aṣiṣe! Aṣiṣe kan boju miiran :).

Fragment N7: Lilo itọka lẹhin gbigbe

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 Ikilọ: V522 [CWE-476] Dereferencing ti awọn asan ijuboluwole 'Idanwo' le gba ibi. Iṣakojọpọ.cpp 709

Ipo kanna lẹẹkansi. Ni akọkọ, awọn akoonu ti nkan naa yoo gbe, lẹhinna a lo bi ẹnipe ko si nkan ti o ṣẹlẹ. Mo rii ipo yii siwaju ati siwaju sii nigbagbogbo ni koodu eto lẹhin atunmọ iṣipopada han ni C ++. Eyi ni idi ti Mo nifẹ ede C ++! Awọn ọna tuntun ati siwaju sii wa lati titu ẹsẹ tirẹ kuro. Oluyẹwo PVS-Studio yoo nigbagbogbo ni iṣẹ :).

Ajeku N8: Null ijuboluwole

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 Ikilọ: V522 [CWE-476] Dereferencing ti awọn asan ijuboluwole 'Iru' le gba ibi. PrettyFunctionDumper.cpp 233

Ni afikun si awọn olutọju aṣiṣe, awọn iṣẹ atẹjade n ṣatunṣe aṣiṣe nigbagbogbo kii ṣe idanwo. A ni iru ọran kan niwaju wa. Iṣẹ naa n duro de olumulo, ẹniti, dipo ti yanju awọn iṣoro rẹ, yoo fi agbara mu lati ṣatunṣe.

Ti o tọ:

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

Ajeku N9: Null ijuboluwole

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 Ikilọ: V522 [CWE-476] Dereferencing ti awọn asan ijuboluwole 'Ty' le gba ibi. SearchableTableEmitter.cpp 614

Mo ro pe ohun gbogbo jẹ kedere ati pe ko nilo alaye.

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

Ikilọ PVS-Studio: V570 Oniyipada 'Identifier-> Iru' ni a yàn si ararẹ. FormatTokenLexer.cpp 249

Ko si aaye ni fifun oniyipada si ara rẹ. O ṣeese wọn fẹ lati kọ:

Identifier->Type = Question->Type;

Ajẹkù N11: Ifura ifura

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

Ikilọ PVS-Studio: V622 [CWE-478] Gbiyanju lati ṣayẹwo alaye 'iyipada' naa. O ṣee ṣe pe oniṣẹ 'nla' akọkọ ko padanu. SystemZAsmParser.cpp 652

Oṣiṣẹ ifura pupọ wa ni ibẹrẹ Bireki. Njẹ o gbagbe lati kọ nkan miiran nibi?

Ajẹkù N12: Ṣiṣayẹwo itọka kan lẹhin yiyọkuro

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

Ikilọ PVS-Studio: V595 [CWE-476] Itọkasi 'Callee' ni a lo ṣaaju ki o to jẹrisi rẹ lodi si nullptr. Ṣayẹwo awọn ila: 172, 174. AMDGPUInline.cpp 172

Agbewero Callee ni ibẹrẹ ti wa ni kọ silẹ ni akoko ti a pe iṣẹ naa gbaTTI.

Ati lẹhinna o wa ni pe o yẹ ki o ṣayẹwo itọka yii fun isọgba nullptr:

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

Sugbon o ti pẹ ju…

Ajẹkù N13 - N...: Ṣiṣayẹwo itọka kan lẹhin yiyọkuro

Ipo ti a jiroro ni ajẹkù koodu ti tẹlẹ kii ṣe alailẹgbẹ. O han nibi:

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

Ikilọ PVS-Studio: V595 [CWE-476] Itọkasi 'CalleeFn' ni a lo ṣaaju ki o to rii daju lodi si nullptr. Ṣayẹwo awọn ila: 1079, 1081. SimplifyLibCalls.cpp 1079

Ati nibi:

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 Ikilọ: V595 [CWE-476] A lo itọka 'ND' ṣaaju ki o to rii daju lodi si nullptr. Ṣayẹwo awọn ila: 532, 534. SemaTemplateInstantiateDecl.cpp 532

Ati nibi:

  • V595 [CWE-476] Itọkasi 'U' ni a lo ṣaaju ki o to jẹrisi rẹ lodi si nullptr. Ṣayẹwo awọn ila: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] Itọkasi 'ND' ni a lo ṣaaju ki o to rii daju lodi si nullptr. Ṣayẹwo awọn ila: 2149, 2151. SemaTemplateInstantiate.cpp 2149

Ati lẹhinna Emi ko nifẹ ninu kikọ awọn ikilọ pẹlu nọmba V595. Nitorinaa Emi ko mọ boya awọn aṣiṣe ti o jọra diẹ sii yatọ si awọn ti a ṣe akojọ si nibi. O ṣeese julọ nibẹ.

Ajẹkù N17, N18: Iyipada ifura

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

Ikilọ PVS-Studio: V629 [CWE-190] Gbero ṣiṣayẹwo '~ (Iwọn - 1) ikosile << 1'. Iyipada Bit ti iye 32-bit pẹlu imugboroja ti o tẹle si iru 64-bit. AArch64AddressingModes.h 260

O le ma jẹ kokoro ati pe koodu naa n ṣiṣẹ ni deede bi a ti pinnu. Ṣugbọn eyi jẹ kedere aaye ifura pupọ ati pe o nilo lati ṣayẹwo.

Jẹ ká sọ oniyipada iwọn jẹ dogba si 16, ati lẹhinna onkọwe koodu naa gbero lati gba ni oniyipada kan NImms itumo:

1111111111111111111111111111111111111111111111111111111111100000

Sibẹsibẹ, ni otitọ, abajade yoo jẹ:

0000000000000000000000000000000011111111111111111111111111100000

Otitọ ni pe gbogbo awọn iṣiro waye nipa lilo iru 32-bit ti a ko fowo si. Ati pe lẹhinna nikan, iru 32-bit ti a ko fowo si ni yoo gbooro si taara si uint64_t. Ni ọran yii, awọn iwọn pataki julọ yoo jẹ odo.

O le ṣatunṣe ipo naa bii eyi:

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

Ipo ti o jọra: V629 [CWE-190] Ronu ṣiṣayẹwo ikosile 'Immr << 6'. Iyipada Bit ti iye 32-bit pẹlu imugboroja ti o tẹle si iru 64-bit. AArch64AddressingModes.h 269

Ajẹkù N19: Koko ti o padanu miran?

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

Ikilọ PVS-Studio: V646 [CWE-670] Ronu lati ṣayẹwo oye ohun elo naa. O ṣee ṣe pe ọrọ-ọrọ 'miiran' sonu. AMDGPUAsmParser.cpp 5655

Ko si asise nibi. Niwon lẹhinna-ìdènà ti akọkọ if pari pẹlu tesiwaju, lẹhinna ko ṣe pataki, Koko kan wa miran bi beko. Ọna boya koodu yoo ṣiṣẹ kanna. Si tun padanu miran mu ki awọn koodu diẹ koyewa ati ki o lewu. Ti o ba wa ni ojo iwaju tesiwaju disappears, koodu yoo bẹrẹ ṣiṣẹ patapata otooto. Ni ero mi o dara lati ṣafikun miran.

Ajẹkù N20: Awọn oriṣi mẹrin ti iru kanna

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

Awọn ikilọ PVS-Studio:

  • V655 [CWE-480] Awọn gbolohun ọrọ ti a concatenated sugbon ti wa ni ko lo. Gbiyanju lati ṣayẹwo ikosile 'Esi + Name.str()'. Symbol.cpp 32
  • V655 [CWE-480] Awọn gbolohun ọrọ ti a concatenated sugbon ti wa ni ko lo. Gbiyanju lati ṣayẹwo ọrọ 'Esi + "(Klas ObjC)" + Name.str ()'. Symbol.cpp 35
  • V655 [CWE-480] Awọn gbolohun ọrọ ti a concatenated sugbon ti wa ni ko lo. Gbiyanju lati ṣayẹwo ikosile 'Esi + "(ObjC Class EH)" + Name.str ()'. Ami.cpp 38
  • V655 [CWE-480] Awọn gbolohun ọrọ ti a concatenated sugbon ti wa ni ko lo. Gbiyanju lati ṣayẹwo ikosile 'Esi + "(ObjC IVar)" + Name.str ()'. Ami.cpp 41

Nipa ijamba, + oniṣẹ ẹrọ ni a lo dipo oniṣẹ +=. Abajade jẹ awọn apẹrẹ ti ko ni itumọ.

Ajẹkù N21: Aisọye iwa

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

Gbiyanju lati wa koodu ti o lewu funrararẹ. Ati pe eyi jẹ aworan lati yọkuro akiyesi ki o maṣe wo idahun lẹsẹkẹsẹ:

Wiwa awọn idun ni LLVM 8 lilo PVS-Studio itupale

Ikilọ PVS-Studio: V708 [CWE-758] Ikole ti o lewu ni a lo: 'FeaturesMap[Op] = FeaturesMap.size ()', nibiti 'FeaturesMap' jẹ ti kilasi 'maapu'. Eyi le ja si iwa aisọye. RISCVCompressInstEmitter.cpp 490

Laini iṣoro:

FeaturesMap[Op] = FeaturesMap.size();

Ti o ba ti ano Op ko ri, lẹhinna a ṣẹda nkan tuntun ninu maapu ati nọmba awọn eroja ti o wa ninu maapu yii ni a kọ sibẹ. O kan jẹ aimọ boya iṣẹ naa yoo pe iwọn ṣaaju tabi lẹhin fifi nkan tuntun kun.

Ajẹkù N22-N24: Awọn iṣẹ iyansilẹ tun

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

Ikilọ PVS-Studio: V519 [CWE-563] Oniyipada 'NType' jẹ awọn iye ti a sọtọ lẹmeji ni itẹlera. Boya eyi jẹ aṣiṣe. Ṣayẹwo awọn ila: 1663, 1664. MachOObjectFile.cpp 1664

Emi ko ro pe aṣiṣe gidi kan wa nibi. O kan iṣẹ iyansilẹ ti ko wulo. Sugbon si tun a blunder.

Bakanna:

  • V519 [CWE-563] Iyipada 'B.NDesc' jẹ awọn iye ti a sọtọ lẹẹmeji ni itẹlera. Boya eyi jẹ aṣiṣe. Ṣayẹwo awọn ila: 1488, 1489. llvm-nm.cpp 1489
  • V519 [CWE-563] Oniyipada jẹ awọn iye ti a sọtọ lẹmeji ni itẹlera. Boya eyi jẹ aṣiṣe. Ṣayẹwo awọn ila: 59, 61. coff2yaml.cpp 61

Ajẹkù N25-N27: Awọn atunṣe diẹ sii

Bayi jẹ ki ká wo ni kan die-die ti o yatọ version of 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;
  ....
}

Ikilọ PVS-Studio: V519 [CWE-563] Iyipada 'titọ' jẹ awọn iye ti a sọtọ lẹmeeji ni itẹlera. Boya eyi jẹ aṣiṣe. Ṣayẹwo awọn ila: 1158, 1160. LoadStoreVectorizer.cpp 1160

Eyi jẹ koodu ajeji pupọ ti o han gedegbe ni aṣiṣe ọgbọn kan ninu. Ni ibẹrẹ, iyipada titete a iye ti wa ni sọtọ da lori awọn majemu. Ati lẹhinna iṣẹ iyansilẹ tun waye lẹẹkansi, ṣugbọn ni bayi laisi ayẹwo eyikeyi.

Iru awọn ipo le ṣee ri nibi:

  • V519 [CWE-563] Iyipada 'Awọn ipa' jẹ awọn iye ti a sọtọ lẹẹmeji ni itẹlera. Boya eyi jẹ aṣiṣe. Ṣayẹwo awọn ila: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] Iyipada 'ExpectNoDerefChunk' jẹ awọn iye ti a sọtọ lẹmeji ni itẹlera. Boya eyi jẹ aṣiṣe. Ṣayẹwo awọn ila: 4970, 4973. SemaType.cpp 4973

Ajẹkù N28: Nigbagbogbo otitọ majemu

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

Ikilọ PVS-Studio: V547 [CWE-571] Ikosile 'nextByte!= 0x90' jẹ otitọ nigbagbogbo. X86DisassemblerDecoder.cpp 379

Ṣiṣayẹwo ko ni oye. Ayípadà NextByte nigbagbogbo ko dogba si iye 0x90, eyi ti o tẹle lati ayẹwo ti tẹlẹ. Eyi jẹ diẹ ninu awọn aṣiṣe ọgbọn.

Ajẹkù N29 - N...: Nigbagbogbo otitọ / eke awọn ipo

Olutupalẹ ṣe awọn ikilọ pupọ pe gbogbo ipo naa (V547) tabi apakan rẹ (V560) jẹ otitọ tabi eke nigbagbogbo. Nigbagbogbo iwọnyi kii ṣe awọn aṣiṣe gidi, ṣugbọn koodu sloppy lasan, abajade ti imugboroosi Makiro, ati bii. Bí ó ti wù kí ó rí, ó bọ́gbọ́n mu láti wo gbogbo ìkìlọ̀ wọ̀nyí, níwọ̀n bí àwọn àṣìṣe tí ó bọ́gbọ́n mu ní ti gidi ti ń ṣẹlẹ̀ láti ìgbà dé ìgbà. Fun apẹẹrẹ, apakan koodu yii jẹ ifura:

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

Ikilọ PVS-Studio: V560 [CWE-570] Apa kan ti ikosile majemu jẹ nigbagbogbo eke: RegNo == 0xe. ARMDisassembler.cpp 939

0xE igbagbogbo jẹ iye 14 ni eleemewa. Ayẹwo RegNo == 0xe ko ṣe ori nitori ti o ba RegNo> 13, lẹhinna iṣẹ naa yoo pari ipaniyan rẹ.

Ọpọlọpọ awọn ikilo miiran wa pẹlu awọn ID V547 ati V560, ṣugbọn bi pẹlu V595, Emi ko nifẹ ninu kika awọn ikilọ wọnyi. O ti han tẹlẹ pe Mo ni ohun elo to lati kọ nkan kan :). Nitorinaa, a ko mọ iye awọn aṣiṣe ti iru yii le ṣe idanimọ ni LLVM nipa lilo PVS-Studio.

Emi yoo fun ọ ni apẹẹrẹ ti idi ti ikẹkọ awọn okunfa wọnyi jẹ alaidun. Olutupalẹ jẹ ẹtọ ni pipe ni ipinfunni ikilọ kan fun koodu atẹle. Ṣugbọn eyi kii ṣe aṣiṣe.

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

PVS-Studio Ikilọ: V547 [CWE-570] Ikosile '! HasError' jẹ nigbagbogbo eke. UnwrappedLineParser.cpp 1635

Ajẹkù N30: ​​ipadabọ ifura

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

Ikilọ PVS-Studio: V612 [CWE-670] Ailopin 'pada' laarin lupu kan. R600OptimizeVectorRegisters.cpp 63

Eyi jẹ boya aṣiṣe tabi ilana kan pato ti o pinnu lati ṣalaye nkan si awọn olupilẹṣẹ kika koodu naa. Apẹrẹ yii ko ṣe alaye ohunkohun fun mi ati pe o dabi ifura pupọ. O dara ki a ko kọ bii iyẹn :).

O rẹwẹsi? Lẹhinna o to akoko lati ṣe tii tabi kofi.

Wiwa awọn idun ni LLVM 8 lilo PVS-Studio itupale

Awọn abawọn ti a ṣe idanimọ nipasẹ awọn iwadii aisan titun

Mo ro pe awọn iṣiṣẹ 30 ti awọn iwadii aisan atijọ ti to. Jẹ ki a ni bayi wo kini awọn nkan ti o nifẹ si ni a le rii pẹlu awọn iwadii aisan tuntun ti o han ninu olutupalẹ lẹhin ti tẹlẹ sọwedowo. Lakoko yii, apapọ awọn iwadii idi gbogbogbo 66 ni a ṣafikun si olutupalẹ C ++.

Ajẹkù N31: koodu ti a ko le de

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

Ikilọ PVS-Studio: V779 [CWE-561] Kode ti ko le de ọdọ ti ri. O ṣee ṣe pe aṣiṣe kan wa. ExecutionUtils.cpp 146

Bi o ti le rii, awọn ẹka mejeeji ti oniṣẹ if pari pẹlu ipe si oniṣẹ ẹrọ pada. Accordingly, awọn eiyan CtorDtorsByPriority yoo ko wa ni nso.

Ajẹkù N32: koodu ti a ko le de

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 ìkìlọ: V779 [CWE-561] Unreachable koodu-ri. O ṣee ṣe pe aṣiṣe kan wa. LLParser.cpp 835

Ipo ti o nifẹ. Jẹ ki a kọkọ wo ibi yii:

return ParseTypeIdEntry(SummaryID);
break;

Ni wiwo akọkọ, o dabi pe ko si aṣiṣe nibi. O dabi oniṣẹ ẹrọ Bireki nibẹ jẹ ẹya afikun nibi, ati awọn ti o le nìkan pa awọn ti o. Sibẹsibẹ, ko gbogbo ki o rọrun.

Olutupalẹ ṣe ikilọ kan lori awọn laini:

Lex.setIgnoreColonInIdentifiers(false);
return false;

Ati nitootọ, koodu yii ko le de ọdọ. Gbogbo awọn ọran ni yipada dopin pẹlu ipe lati ọdọ oniṣẹ pada. Ati nisisiyi aimọ nikan Bireki ko dabi laiseniyan! Boya ọkan ninu awọn ẹka yẹ ki o pari pẹlu Bireki, kii ṣe pada?

Ajeku N33: Atunto laileto ti awọn iwọn giga

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

Ikilọ PVS-Studio: V784 Iwọn boju-boju bit kere ju iwọn ti operand akọkọ. Eleyi yoo fa awọn isonu ti ga die-die. RuntimeDyld.cpp 815

Jọwọ ṣe akiyesi pe iṣẹ naa getStubAlignment pada iru ko wole. Jẹ ki a ṣe iṣiro iye ikosile naa, ni ro pe iṣẹ naa da iye 8 pada:

~ (getStubAligment () - 1)

(8u-1)

0xFFFFFFFF8u

Bayi ṣe akiyesi pe oniyipada naa Data Iwon ni o ni a 64-bit unsigned iru. O wa ni pe nigbati o ba n ṣiṣẹ DataSize & 0xFFFFFF8u, gbogbo awọn iwọn aṣẹ-giga ọgbọn-meji yoo jẹ atunto si odo. O ṣeese julọ, eyi kii ṣe ohun ti olupilẹṣẹ fẹ. Mo fura pe o fẹ lati ṣe iṣiro: DataSize & 0xFFFFFFFFFFFFFFFF8u.

Lati ṣatunṣe aṣiṣe, o yẹ ki o kọ eyi:

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

Tabi bẹ:

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

Ajẹkù N34: Ikuna iru simẹnti ti o fojuhan

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

Ikilọ PVS-Studio: V1028 [CWE-190] Owun to le aponsedanu. Gbero sisẹ awọn operands ti 'NumElts * Scale' oniṣẹ si iru 'size_t', kii ṣe abajade. X86ISelLowering.h 1577

Simẹnti iru ti o fojuhan ni a lo lati yago fun iṣan omi nigba ti o ba n pọ si awọn oniyipada iru int. Sibẹsibẹ, iru simẹnti ti o han gbangba nibi ko ṣe aabo fun aponsedanu. Ni akọkọ, awọn oniyipada yoo di pupọ, ati pe lẹhinna abajade 32-bit ti isodipupo yoo gbooro si iru. iwọn_t.

Ajẹkù N35: Ti kuna

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] Meji iru koodu ajẹkù ni won ri. Boya, eyi jẹ typo ati oniyipada 'Op1' yẹ ki o lo dipo 'Op0'. InstCombineCompares.cpp 5507

Ayẹwo tuntun ti o nifẹ si n ṣe idanimọ awọn ipo nibiti a ti daakọ koodu kan ati pe awọn orukọ diẹ ninu rẹ ti bẹrẹ lati yipada, ṣugbọn ni aaye kan wọn ko ṣe atunṣe.

Jọwọ ṣe akiyesi pe ni bulọki keji wọn yipada Op0 on Op1. Ṣugbọn ni ibi kan wọn ko ṣe atunṣe. O ṣeese julọ pe o yẹ ki o ti kọ bi eleyi:

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

Ajẹkù N36: Ayípadà Ayipada

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

Ikilọ PVS-Studio: V1001 [CWE-563] Oniyipada 'Ipo' jẹ sọtọ ṣugbọn kii ṣe lo nipasẹ opin iṣẹ naa. SIModeRegister.cpp 48

O lewu pupọ lati fun awọn ariyanjiyan iṣẹ ni awọn orukọ kanna gẹgẹbi awọn ọmọ ẹgbẹ kilasi. O rọrun pupọ lati ni idamu. A ni iru ọran kan niwaju wa. Ọrọ yii ko ni oye:

Mode &= Mask;

Awọn ariyanjiyan iṣẹ yipada. Gbogbo ẹ niyẹn. A ko lo ariyanjiyan yii mọ. O ṣeese julọ o yẹ ki o ti kọ bi eleyi:

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

Ajẹkù N37: Ayípadà Ayipada

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

Ikilọ PVS-Studio: V1001 [CWE-563] Oniyipada 'Iwọn' jẹ sọtọ ṣugbọn kii ṣe lo nipasẹ opin iṣẹ naa. Ohun.cpp 424

Ipo naa jọra si ti iṣaaju. O yẹ ki o kọ:

this->Size += this->EntrySize;

Ajẹkù N38-N47: Wọn gbagbe lati ṣayẹwo atọka naa

Ni iṣaaju, a wo awọn apẹẹrẹ ti okunfa okunfa V595. Koko-ọrọ rẹ ni pe itọka naa ti kọ silẹ ni ibẹrẹ, ati pe lẹhinna ṣayẹwo nikan. Awọn iwadii ọdọ V1004 jẹ idakeji ni itumọ, ṣugbọn tun ṣe afihan ọpọlọpọ awọn aṣiṣe. O ṣe idanimọ awọn ipo nibiti a ti ṣayẹwo itọka ni ibẹrẹ ati lẹhinna gbagbe lati ṣe bẹ. Jẹ ki a wo iru awọn ọran ti a rii inu 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 Ikilọ: V1004 [CWE-476] Itọkasi 'Ptr' ti a lo lailewu lẹhin ti o ti wadi lodi si nullptr. Ṣayẹwo awọn ila: 729, 738. TargetTransformInfoImpl.h 738

Oniyipada Ptr le dogba nullptr, gẹgẹ bi ẹri nipasẹ ayẹwo:

if (Ptr != nullptr)

Sibẹsibẹ, ni isalẹ itọka yii ni a kọ silẹ laisi iṣayẹwo alakoko:

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

Ẹ jẹ́ ká gbé ọ̀ràn míì tó jọ èyí yẹ̀ wò.

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 Ikilọ: V1004 [CWE-476] Itọkasi 'FD' ti a lo lailewu lẹhin ti o ti jẹri lodi si nullptr. Ṣayẹwo awọn ila: 3228, 3231. CGDebugInfo.cpp 3231

San ifojusi si ami naa FD. Mo ni idaniloju pe iṣoro naa han gbangba ati pe ko nilo alaye pataki.

Ati siwaju sii:

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 Ikilọ: V1004 [CWE-476] Awọn 'PtrTy' ijuboluwole ti a lo lailewu lẹhin ti o ti wadi lodi si nullptr. Ṣayẹwo awọn ila: 960, 965. InterleavedLoadCombinePass.cpp 965

Bawo ni lati dabobo ara re lati iru awọn aṣiṣe? Ṣe akiyesi diẹ sii lori Atunwo koodu ati lo oluṣayẹwo aimi PVS-Studio lati ṣayẹwo koodu rẹ nigbagbogbo.

Ko si aaye ni sisọ awọn ajẹkù koodu miiran pẹlu awọn aṣiṣe ti iru yii. Emi yoo fi atokọ kan ti awọn ikilọ silẹ nikan ninu nkan naa:

  • V1004 [CWE-476] Itọkasi 'Expr' ni a lo lailewu lẹhin ti o ti jẹri ni ilodi si nullptr. Ṣayẹwo awọn ila: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] Itọkasi 'PI' ni a lo lailewu lẹhin ti o ti jẹri ni ilodi si nullptr. Ṣayẹwo awọn ila: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] Itọkasi 'StatepointCall' ni a lo lailewu lẹhin ti o ti jẹri ni ilodi si nullptr. Ṣayẹwo awọn ila: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] Itọkasi 'RV' ni a lo lailewu lẹhin ti o ti jẹri ni ilodi si nullptr. Ṣayẹwo awọn ila: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] Itọkasi 'CalleeFn' ni a lo lailewu lẹhin ti o ti jẹri ni ilodi si nullptr. Ṣayẹwo awọn ila: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] Itọkasi 'TC' ni a lo lailewu lẹhin ti o ti jẹri ni ilodi si nullptr. Ṣayẹwo awọn ila: 1819, 1824. Driver.cpp 1824

Ajeku N48-N60: Kii ṣe pataki, ṣugbọn abawọn kan (o ṣee ṣe iranti jijo)

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

Ikilọ PVS-Studio: V1023 [CWE-460] Atọka laisi oniwun ni a ṣafikun si apoti 'Awọn ilana' nipasẹ ọna 'emplace_back'. A jo iranti yoo waye ni irú ti ohun sile. lvm-isel-fuzzer.cpp 58

Lati fi ohun kan kun si opin ti a eiyan bi std :: fekito > o ko le kan kọ xxx.push_back(X tuntun), niwon nibẹ ni ko si ifasilẹ awọn iyipada lati X* в std :: oto_ptr.

Ojutu ti o wọpọ ni lati kọ xxx.emplace_back(X tuntun)niwon o compiles: ọna emplace_pada nse ohun ano taara lati awọn oniwe-ariyanjiyan ati ki o le nitorina lo fojuhan Constructors.

Ko lewu. Ti fekito ba ti kun, lẹhinna iranti ti tun pin. Iṣiṣẹ ibi-itumọ ti iranti le kuna, ti o fa idasile kan ju silẹ std :: buburu_alloc. Ni idi eyi, itọka naa yoo sọnu ati pe ohun ti o ṣẹda kii yoo paarẹ.

Ojutu ailewu ni lati ṣẹda oto_ptreyi ti yoo ni itọkasi ṣaaju ki fekito gbiyanju lati tunto iranti:

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

Lati C ++14, o le lo 'std :: make_unique':

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

Iru abawọn yii ko ṣe pataki fun LLVM. Ti a ko ba le pin iranti, akopọ yoo da duro. Sibẹsibẹ, fun awọn ohun elo pẹlu gun uptime, eyiti ko le fopin si ti ipin iranti ba kuna, eyi le jẹ kokoro ẹgbin gidi kan.

Nitorinaa, botilẹjẹpe koodu yii ko ṣe irokeke ewu si LLVM, Mo rii pe o wulo lati sọrọ nipa apẹẹrẹ aṣiṣe yii ati pe oluyẹwo PVS-Studio ti kọ ẹkọ lati ṣe idanimọ rẹ.

Awọn ikilọ miiran ti iru yii:

  • V1023 [CWE-460] Atọka laisi oniwun ni a ṣafikun si apoti 'Passes' nipasẹ ọna 'emplace_back'. A jo iranti yoo waye ni irú ti ohun sile. PassManager.h 546
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'AAs' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. AliasAnalysis.h 324
  • V1023 [CWE-460] Atọka laisi oniwun ni a ṣafikun si apoti 'Awọn titẹ sii' nipasẹ ọna 'emplace_back'. A jo iranti yoo waye ni irú ti ohun sile. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'AllEdges' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. CFGMST.h 268
  • V1023 [CWE-460] Atọka laisi oniwun ni a ṣafikun si apoti 'VMaps' nipasẹ ọna 'emplace_back'. A jo iranti yoo waye ni irú ti ohun sile. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] Atọka laisi oniwun ti wa ni afikun si apoti 'Awọn igbasilẹ' nipasẹ ọna 'emplace_back'. A jo iranti yoo waye ni irú ti ohun sile. FDRLogBuilder.h 30
  • V1023 [CWE-460] Atọka laisi oniwun ni a ṣafikun si apoti 'isunmọtosiSubmodules' nipasẹ ọna 'emplace_back'. A jo iranti yoo waye ni irú ti ohun sile. ModuleMap.cpp 810
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Ohun' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. DebugMap.cpp 88
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Awọn ilana' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 685
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 686
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 688
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 689
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 690
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 691
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 692
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 693
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Modifiers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. lvm-stress.cpp 694
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Operands' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] Atọka laisi oniwun ti wa ni afikun si apoti 'Stash' nipasẹ ọna 'emplace_back'. A jo iranti yoo waye ni irú ti ohun sile. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] A ijuboluwole lai eni ti wa ni afikun si awọn 'Matchers' eiyan nipasẹ awọn 'emplace_back' ọna. A jo iranti yoo waye ni irú ti ohun sile. GlobalISelEmitter.cpp 2702

ipari

Mo ti ṣe awọn ikilo 60 lapapọ ati lẹhinna duro. Njẹ awọn abawọn miiran wa ti oluyẹwo PVS-Studio ṣe awari ni LLVM? Bẹẹni, Mo ni. Bí ó ti wù kí ó rí, nígbà tí mo ń kọ àwọn àjákù àlàyé fún àpilẹ̀kọ náà, ó ti di ìrọ̀lẹ́, tàbí dípò bẹ́ẹ̀ alẹ́, mo sì pinnu pé ó ti tó àkókò láti pè é ní ọjọ́ kan.

Mo nireti pe o rii pe o nifẹ ati pe yoo fẹ lati gbiyanju itupalẹ PVS-Studio.

O le ṣe igbasilẹ atunnkanka ati gba bọtini minesweeper ni oju-ewe yii.

Ni pataki julọ, lo itupalẹ aimi nigbagbogbo. Awọn sọwedowo akoko kan, ti a ṣe nipasẹ wa lati le gbaye ilana ilana ti itupalẹ aimi ati PVS-Studio kii ṣe oju iṣẹlẹ deede.

Orire ti o dara ni imudarasi didara ati igbẹkẹle ti koodu rẹ!

Wiwa awọn idun ni LLVM 8 lilo PVS-Studio itupale

Ti o ba fẹ pin nkan yii pẹlu olugbo ti o sọ Gẹẹsi, jọwọ lo ọna asopọ itumọ: Andrey Karpov. Wiwa Awọn idun ni LLVM 8 pẹlu PVS-Studio.

orisun: www.habr.com

Fi ọrọìwòye kun