
PVS-Studioã¢ãã©ã€ã¶ãŒã䜿çšããŠLLVMãããžã§ã¯ãã³ãŒããæåŸã«æ€èšŒããŠãã2幎以äžãçµéããŸããã PVS-Studioã¢ãã©ã€ã¶ãŒãããšã©ãŒãæœåšçãªè匱æ§ãæ€åºããããã®äž»èŠãªããŒã«ã§ããããšã確èªããŸãããã ãããè¡ãã«ã¯ãLLVM 8.0.0ãªãªãŒã¹ã®æ°ãããšã©ãŒã確èªããŠèŠã€ããŠãã ããã
æžãããèšäº
æ£çŽã«èšããšãç§ã¯ãã®èšäºãæžããããããŸããã§ããã ãã§ã«ç¹°ãè¿ããã¹ããããããžã§ã¯ãã«ã€ããŠæžãã®ã¯é¢çœããããŸããïŒ 1ã2ã3 ïŒã æ°ããããšã«ã€ããŠæžãã»ããããã®ã§ãããç§ã«ã¯éžæè¢ããããŸããã
LLVMã®æ°ããããŒãžã§ã³ããªãªãŒã¹ããããã Clang Static AnalyzerãæŽæ°ããããã³ã«ã次ã®ã¿ã€ãã®è³ªåãã¡ãŒã«ã«è¡šç€ºãããŸãã
èŠãŠãClang Static Analyzerã®æ°ããããŒãžã§ã³ã¯æ°ãããã°ãèŠã€ããããšãåŠãã ïŒ PVS-Studioã䜿çšããããšã®é¢é£æ§ã¯äœäžããŠããããã«æããŸãã Clangã¯ä»¥åãããå€ãã®ãšã©ãŒãæ€åºããPVS-Studioã®æ©èœã«è¿œãã€ããŸãã ããã«ã€ããŠã©ãæããŸããïŒ
ç§ã¯ãã€ããã®ãããªäœãã«çãããã§ãïŒ
ç§ãã¡ãéãã§ããããã§ã¯ãããŸããïŒ PVS-Studioã¢ãã©ã€ã¶ãŒã®æ©èœãå€§å¹ ã«æ¹åãããŸããã å¿é ããªãã§ãã ãããç§ãã¡ã¯ä»¥åãšåæ§ã«ãªãŒããç¶ããŸãã
æ®å¿µãªãããããã¯æªãçãã§ãã 蚌æ ã¯ãããŸããã ããããç§ãä»ãã®èšäºãæžããŠããçç±ã§ãã ãã®ãããLLVMãããžã§ã¯ãã¯åã³ãã¹ããããããŸããŸãªãšã©ãŒãçºèŠãããŸããã ç§ã«ãšã£ãŠé¢çœããã«æãããã®ããä»ãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ããŸãã ãããã®ãšã©ãŒã¯Clang Static Analyzerã§èŠã€ããããšãã§ããŸããïŒãŸãã¯ããããè¡ãã®ã¯éåžžã«äžäŸ¿ã§ãïŒã ãããŠãã§ããã ãããŠãããå€ã«ãããã®ãšã©ãŒããã¹ãŠèŠã€ããŠæžããŸããã
ããããèšäºã®å·çã¯æ°é±éç¶ããã ããããã¹ãŠããã¹ã圢åŒã§ã¢ã¬ã³ãžããããšã¯ã§ããŸããã§ãã:)ã
ãšããã§ããšã©ãŒãæœåšçãªè匱æ§ãæ€åºããããã«PVS-Studioã¢ãã©ã€ã¶ãŒã§äœ¿çšãããŠãããã¯ãããžãŒã«èå³ãããå Žåã¯ããã®ããŒããããç解ããããšããå§ãããŸãã
æ°æ§ã®èšºæ
ãã§ã«è¿°ã¹ãããã«ãçŽ2幎åã«ãLLVMãããžã§ã¯ããå床ãã§ãã¯ãããèŠã€ãã£ããšã©ãŒãä¿®æ£ãããŸããã ãã®èšäºã§ã¯ããšã©ãŒã®æ°ããéšåã玹ä»ããŸãã ãªãæ°ãããã°ãèŠã€ãã£ãã®ã§ããïŒ ããã«ã¯3ã€ã®çç±ããããŸãã
- LLVMãããžã§ã¯ããéçºãããå€ãã³ãŒããå€æŽãããæ°ããã³ãŒãã衚瀺ãããŸãã åœç¶ãå€æŽããã³èšè¿°ãããã³ãŒãã«ã¯æ°ãããšã©ãŒããããŸãã ããã¯ãéç解æãå®æçã«é©çšããå¿ èŠãããããšããã瀺ããŠãããå Žåã«ãã£ãŠã¯é©çšããŸããã ç§ãã¡ã®èšäºã¯PVS-Studioã¢ãã©ã€ã¶ãŒã®æ©èœããã瀺ããŠããŸãããããã¯ã³ãŒãã®å質ãæ¹åãããšã©ãŒãä¿®æ£ããã³ã¹ããåæžããããšãšã¯äœã®é¢ä¿ããããŸããã éçã³ãŒãã¢ãã©ã€ã¶ãŒãå®æçã«äœ¿çšããŠãã ããïŒ
- ç§ãã¡ã¯ãæ¢åã®èšºæãå®æãããæ¹åããŠããŸãã ãããã£ãŠãã¢ãã©ã€ã¶ã¯ã以åã®ãã§ãã¯ã§æ°ä»ããªãã£ããšã©ãŒãæ€åºã§ããŸãã
- PVS-Studioã«ã¯ã2幎åã§ã¯ãªãã£ãæ°ãã蚺æãç»å ŽããŸããã PVS-Studioã®éçºãæ確ã«ç€ºãããã«ãããããå¥ã®ã»ã¯ã·ã§ã³ã«åããããšã«ããŸããã
2幎åã«ååšãã蚺æã§ç¹å®ãããæ¬ é¥
ãã©ã°ã¡ã³ãN1ïŒã³ããŒããŒã¹ã
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èŠåïŒ V501 [CWE-570]åäžã®å¯æ¬¡åŒãName.startswithïŒ "avx512.mask.permvarã"ïŒãããããŸããã||ãã®å·Šãšå³ã« æŒç®åã AutoUpgrade.cpp 73
ååãéšåæååãavx512.mask.permvarããã§å§ãŸãããšãå確èªããŸãã 2çªç®ã®ãã¹ãã§ã¯ãæããã«ä»ã®äœããæžããããšæã£ãŠããŸããããã³ããŒããããã¹ããä¿®æ£ããã®ãå¿ããŠããŸããã
ãã©ã°ã¡ã³ãN2ïŒã¿ã€ããã¹
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; .... }
PVS-StudioèŠåïŒV501ã|ãã®å·ŠåŽãšå³åŽã«åäžã®ãµãåŒãCXNameRange_WantQualifierãããããŸã æŒç®åã CIndex.cpp 7245
ã¿ã€ããã¹ã®ãããåãååã®å®æ°CXNameRange_WantQualifierã2å䜿çšãããŸãã
ã¹ããããN3ïŒãªãã¬ãŒã¿ãŒã®åªå é äœã«é¢ããæ··ä¹±
int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) { .... if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian() ? 1 : 0) return 0; .... }
PVS-StudioèŠåïŒ V502 [CWE-783]ãïŒïŒãæŒç®åã¯ãäºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããå¯èœæ§ããããŸãã ãïŒïŒãæŒç®åã®åªå é äœã¯ãã==ãæŒç®åãããäœããªã£ãŠããŸãã PPCTargetTransformInfo.cpp 404
ç§ã®æèŠã§ã¯ãããã¯éåžžã«çŸããééãã§ãã ã¯ããç§ã¯çŸã«ã€ããŠå¥åŠãªã¢ã€ãã¢ãæã£ãŠããããšãç¥ã£ãŠããŸã:)ã
ããã§ãæŒç®åã®åªå é äœã«åŸã£ãŠãåŒã¯æ¬¡ã®ããã«èšç®ãããŸãã
(ISD == ISD::EXTRACT_VECTOR_ELT && (Index == ST->isLittleEndian())) ? 1 : 0
å®çšçãªèŠ³ç¹ããããã®æ¡ä»¶ã¯æ¬¡ã®ããã«æžããããšãã§ãããããæå³ããããŸããã
(ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian())
ããã¯æãããªééãã§ãã ããããã0/1ã¯å€æ°Indexãšæ¯èŒãããã£ãã®ã§ãã ã³ãŒããä¿®æ£ããã«ã¯ãäžé æŒç®åã®åšãã«æ¬åŒ§ãè¿œå ããŸãã
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))
ãšããã§ãäžé æŒç®åã¯éåžžã«å±éºã§ãããè«çãšã©ãŒãåŒãèµ·ãããŸãã 现å¿ã®æ³šæãæããæ¬åŒ§ãä»ããããšã欲ããªãã§ãã ããã ãã®ãããã¯ã«ã€ããŠã¯ããæŒç®åãæããïŒïŒæ¬åŒ§ã§å²ããã®ç« ã§è©³ãã説æããŸããã
ãã©ã°ã¡ã³ãN4ãN5ïŒãã«ãã€ã³ã¿ãŒ
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èŠåïŒ V522 [CWE-476]ãã«ãã€ã³ã¿ãŒãLHSãã®éåç §ãè¡ãããå ŽåããããŸãã TGParser.cpp 2152
LHSãã€ã³ã¿ãŒããã«ã®å ŽåãèŠåãçºè¡ãããå¿ èŠããããŸãã ãã ãã代ããã«ããã®NULLãã€ã³ã¿ãŒèªäœã®éåç §ãçºçããŸãïŒ LHS-> getAsStringïŒïŒ ã
ããã¯ã誰ããšã©ãŒããã¹ãããŠããªãããããšã©ãŒããšã©ãŒãã³ãã©ãŒã«é ãããŠããéåžžã«äžè¬çãªç¶æ³ã§ãã éçã¢ãã©ã€ã¶ãŒã¯ã䜿çšé »åºŠã«é¢ä¿ãªããå°éå¯èœãªãã¹ãŠã®ã³ãŒãããã§ãã¯ããŸãã ããã¯ãéçåæãä»ã®ãã¹ãããã³ãšã©ãŒä¿è·æè¡ãè£å®ããæ¹æ³ã®éåžžã«è¯ãäŸã§ãã
RHSãã€ã³ã¿ãŒãåŠçããåæ§ã®ãšã©ãŒããã³ãŒãã®å°ãäžã§äœæãããŸãããV522[CWE-476] NULLãã€ã³ã¿ãŒãRHSãã®éåç §ãè¡ãããå ŽåããããŸãã TGParser.cpp 2186
ãã©ã°ã¡ã³ãN6ïŒç§»ååŸã«ã«ãŒãœã«ã䜿çšãã
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èŠåïŒV522 [CWE-476]ãã«ãã€ã³ã¿ãŒãProgCloneãã®éåç §ãè¡ãããå ŽåããããŸãã Miscompilation.cpp 601
æåã«ã ProgCloneã¹ããŒããã€ã³ã¿ãŒã¯ãªããžã§ã¯ãã®ææãåæ¢ããŸãã
BD.setNewProgram(std::move(ProgClone));
å®éã ProgCloneã¯ãã«ãã€ã³ã¿ãŒã«ãªããŸããã ãããã£ãŠãnullãã€ã³ã¿ãŒã®éåç §ã¯ãããäžã§çºçããå¿ èŠããããŸãã
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
ããããå®éã«ã¯ãããã¯èµ·ãããŸããïŒ ã«ãŒãã¯å®éã«ã¯å®è¡ãããŠããªãããšã«æ³šæããŠãã ããã
æåã«ã MiscompiledFunctionsã³ã³ãããŒãã¯ãªã¢ãããŸãã
MiscompiledFunctions.clear();
次ã«ããã®ã³ã³ãããŒã®ãµã€ãºãã«ãŒãæ¡ä»¶ã§äœ¿çšãããŸãã
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
ã«ãŒããéå§ãããªãããšã¯ç°¡åã«ããããŸãã ãããééãã ãšæãã®ã§ãã³ãŒãã®æžãæ¹ãå€ããå¿ èŠããããŸãã
éåžžã«æåãªãšã©ãŒã®ããªãã£ã«åºäŒã£ãããã§ãïŒ 1ã€ã®ééããå¥ã®ééããé ããŸã:)ã
ãã©ã°ã¡ã³ãN7ïŒç§»ååŸã«ã«ãŒãœã«ã䜿çšãã
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èŠåïŒV522 [CWE-476]ãã«ãã€ã³ã¿ãŒããã¹ããã®éåç §ãè¡ãããå ŽåããããŸãã Miscompilation.cpp 709
åã³åãç¶æ³ã æåã¯ããªããžã§ã¯ãã®å 容ã移åãããäœãèµ·ãããªãã£ãããã«äœ¿çšãããŸãã C ++ã§åäœã®ã»ãã³ãã£ã¯ã¹ãç»å ŽããåŸãããã°ã©ã ã³ãŒãã§ãã®ç¶æ³ããŸããŸãç®ã«ããŸââãã ãã®ããã«ç§ã¯C ++èšèªã倧奜ãã§ãïŒ èªåã®è¶³ãæã€æ°ããæ¹æ³ãå¢ããŠããŸãã PVS-Studioã¢ãã©ã€ã¶ãŒã¯åžžã«åäœããŸã:)ã
ãã©ã°ã¡ã³ãN8ïŒãã«ãã€ã³ã¿ãŒ
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èŠåïŒV522 [CWE-476]ãã«ãã€ã³ã¿ãŒãã¿ã€ããã®éåç §ãè¡ãããå ŽåããããŸãã PrettyFunctionDumper.cpp 233
éåžžããšã©ãŒãã³ãã©ãŒã«å ããŠãå°å·åºåããããã°ããããã®é¢æ°ã¯ãã¹ããããŸããã ç§ãã¡ã®åã«ãã®ãããªå Žåã§ãã ãã®é¢æ°ã¯ããŠãŒã¶ãŒã®åé¡ã解決ãã代ããã«ä¿®æ£ã匷å¶ããããŠãŒã¶ãŒãåŸ ã£ãŠããŸãã
æ£ããïŒ
if (Type) Type->dump(*this); else Printer << "<unknown-type>";
ãã©ã°ã¡ã³ãN9ïŒãã«ãã€ã³ã¿ãŒ
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èŠåïŒV522 [CWE-476]ãã«ãã€ã³ã¿ãŒãTyãã®éåç §ãè¡ãããå ŽåããããŸãã SearchableTableEmitter.cpp 614
ç§ã¯æãã®ã§ããã¹ãŠãæ確ã§ããã説æãå¿ èŠãšããŸããã
ãã©ã°ã¡ã³ãN10ïŒã¿ã€ããã¹
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èŠåïŒ V570 ãèå¥å->ã¿ã€ããå€æ°ã¯ããèªäœã«å²ãåœãŠãããŸãã FormatTokenLexer.cpp 249
å€æ°ãããèªäœã«å²ãåœãŠãããšã¯æå³ããããŸããã ãããã圌ãã¯æžããããšæã£ãŠããïŒ
Identifier->Type = Question->Type;
ãã©ã°ã¡ã³ãN11ïŒäžå¯©ãªãã¬ãŒã¯
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èŠåïŒ V622 [CWE-478]ãswitchãã¹ããŒãã¡ã³ãã®æ€æ»ãæ€èšããŠãã ããã æåã®ãã±ãŒã¹ãæŒç®åãæ¬ èœããŠããå¯èœæ§ããããŸãã SystemZAsmParser.cpp 652
æåã«éåžžã«çããããã¬ãŒã¯ã¹ããŒãã¡ã³ãããããŸãã ããã«äœãä»ã®ãã®ãæžãã®ãå¿ããŸãããïŒ
ãã©ã°ã¡ã³ãN12ïŒåç §è§£é€åŸã®ãã€ã³ã¿ãŒã®ç¢ºèª
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èŠåïŒ V595 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåã«ãã åŒã³åºãå ããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªïŒ172ã174ãAMDGPUInline.cpp 172
getTTIé¢æ°ãåŒã³åºããããš ã å é ã®Calleeãã€ã³ã¿ãŒãéåç §ãããŸãã
ãããŠããã®ãã€ã³ã¿ãŒã¯nullptrã®ç䟡æ§ããã§ãã¯ããå¿ èŠãããããšãããããŸãã ã
if (!Callee || Callee->isDeclaration())
ããããæé ãã§ã...
ãã©ã°ã¡ã³ãN13-N ...ïŒåç §è§£é€åŸã®ãã€ã³ã¿ãŒã®ç¢ºèª
åã®ã³ãŒãã¹ããããã§èª¬æããç¶æ³ã¯äžæã§ã¯ãããŸããã 圌女ã¯ããã«ããŸãïŒ
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èŠåïŒV595 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåã«ããCalleeFnããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ1079ã1081ãSimplifyLibCalls.cpp 1079
ãããŠããã«ïŒ
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èŠåïŒV595 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåã«ããNDããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ532ã534ãSemaTemplateInstantiateDecl.cpp 532
ãããŠããã«ïŒ
- V595 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåã«ããUããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ404ã407ãDWARFFormValue.cpp 404
- V595 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåã«ããNDããã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ2149ã2151ãSemaTemplateInstantiate.cpp 2149
ãããŠãç§ã¯çªå·V595ã®èŠåãç 究ããããšã«èå³ããããŸããã§ããã ãããã£ãŠãããã«ãªã¹ããããŠãããšã©ãŒä»¥å€ã«åæ§ã®ãšã©ãŒããããã©ããã¯ããããŸããã ãããããããŸãã
ãã©ã°ã¡ã³ãN17ãN18ïŒçãããã·ãã
static inline bool processLogicalImmediate(uint64_t Imm, unsigned RegSize, uint64_t &Encoding) { .... unsigned Size = RegSize; .... uint64_t NImms = ~(Size-1) << 1; .... }
PVS-StudioèŠåïŒ V629 [CWE-190]ããïŒãµã€ãº-1ïŒ<< 1ãåŒã®æ€æ»ãæ€èšããŠãã ããã 32ãããå€ã®ãããã·ãããšãããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµã AArch64AddressingModes.h 260
ããããããã¯ééãã§ã¯ãªããã³ãŒãã¯æå³ãããšããã«æ©èœããŸãã ããããããã¯æããã«éåžžã«çãããå Žæã§ããã確èªããå¿ èŠããããŸãã
Sizeå€æ°ã16ã§ãããã³ãŒãã®äœæè ãNImmså€æ°ã®å€ãååŸããäºå®ã§ãããšããŸãã
11111111111111111111111111111111111111111111111111111111111111111100000000
ãã ããå®éã«ã¯ãçµæã¯æ¬¡ã®ãšããã§ãã
0000000000000000000000000000000000001111111111111111111111111111100000
å®éããã¹ãŠã®èšç®ã¯32ããã笊å·ãªãåã䜿çšããŠè¡ãããŸãã ãããŠããã®32ãããã®ç¬Šå·ãªãã®åã¯ãæé»çã«uint64_tã«æ¡åŒµãããŸã ã ãã®å Žåãæäžäœãããã¯ãŒãã«ãªããŸãã
次ã®ãããªç¶æ³ãä¿®æ£ã§ããŸãã
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
åæ§ã®ç¶æ³ïŒV629 [CWE-190]ãImmr << 6ãåŒã®æ€æ»ãæ€èšããŠãã ããã 32ãããå€ã®ãããã·ãããšãããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµã AArch64AddressingModes.h 269
Snippet N19ïŒ else ããŒã¯ãŒãããããŸã ã ãïŒ
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èŠåïŒ V646 [CWE-670]ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã®æ€æ»ãæ€èšããŠãã ããã ãelseãããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãã AMDGPUAsmParser.cpp 5655
ããã«ééãã¯ãããŸããã æåã®ifã®thenãããã¯ãcontinueã§çµããããã elseããŒã¯ãŒãããããã©ããã¯é¢ä¿ãããŸããã ãããã«ããŠããã³ãŒãã¯åãããã«æ©èœããŸãã ãã ãã ä»ãã¹ããããããšãã³ãŒããããäžæçã§å±éºã«ãªããŸãã å°æ¥ã ç¶ç¶ãæ¶ãããšãã³ãŒãã¯ãŸã£ããç°ãªãæ¹æ³ã§åäœãéå§ããŸãã ç§ã®æèŠã§ã¯ã elseãè¿œå ããæ¹ãè¯ãã§ãããã
ãã©ã°ã¡ã³ãN20ïŒåãã¿ã€ãã®4ã€ã®ã¿ã€ããã¹
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ã®èŠåïŒ
- V655 [CWE-480]æååã¯é£çµãããŠããŸããããå©çšãããŠããŸããã ãResult + Name.strïŒïŒãåŒã調ã¹ãããšãæ€èšããŠãã ããã Symbol.cpp 32
- V655 [CWE-480]æååã¯é£çµãããŠããŸããããå©çšãããŠããŸããã 'Result + "ïŒObjC ClassïŒ" + Name.strïŒïŒ'åŒã調ã¹ãããšãæ€èšããŠãã ããã Symbol.cpp 35
- V655 [CWE-480]æååã¯é£çµãããŠããŸããããå©çšãããŠããŸããã 'Result + "ïŒObjC Class EHïŒ" + Name.strïŒïŒ'åŒã調ã¹ãããšãæ€èšããŠãã ããã Symbol.cpp 38
- V655 [CWE-480]æååã¯é£çµãããŠããŸããããå©çšãããŠããŸããã 'Result + "ïŒObjC IVarïŒ" + Name.strïŒïŒ'åŒã調ã¹ãããšãæ€èšããŠãã ããã Symbol.cpp 41
å¶ç¶ã+ =æŒç®åã®ä»£ããã«+æŒç®åã䜿çšãããŸãã çµæã¯ç¡æå³ãªãã¶ã€ã³ã§ãã
ãã©ã°ã¡ã³ãN21ïŒæªå®çŸ©ã®åäœ
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(); } } }
èªåã§å±éºãªã³ãŒããèŠã€ããŠãã ããã ãããŠãããã¯æ°ãæ£ãããã®ã§ãããããã«çããèŠãªãããã«ããŠããŸãïŒ

PVS-StudioèŠåïŒ V708 [CWE-758]å±éºãªæ§é ã䜿çšãããŠããŸãïŒ 'FeaturesMap [Op] = FeaturesMap.sizeïŒïŒ'ã 'FeaturesMap'㯠'map'ã¯ã©ã¹ã§ãã ããã«ãããæªå®çŸ©ã®åäœãçºçããå ŽåããããŸãã RISCVCompressInstEmitter.cpp 490
åé¡è¡ïŒ
FeaturesMap[Op] = FeaturesMap.size();
OpèŠçŽ ãèŠã€ãããªãå Žåãæ°ããèŠçŽ ããããã«äœæããããã®ãããã®èŠçŽ ã®æ°ãããã«æžã蟌ãŸããŸãã ãµã€ãºèŠçŽ ãæ°ããèŠçŽ ãè¿œå ããåã«åŒã³åºãããããåŸã«åŒã³åºããããã¯äžæã§ãã
ãã©ã°ã¡ã³ãN22-N24ïŒåå²ãåœãŠ
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èŠåïŒ V519 [CWE-563]ãNTypeãå€æ°ã«ã¯é£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ããã§ãã¯ããŸãïŒ1663ã1664ãMachOObjectFile.cpp 1664
ããã«æ¬åœã®ééãã¯ãªããšæããŸãã ç¡é§ãªç¹°ãè¿ãå²ãåœãŠã ããããããã§ã倱æã§ãã
åæ§ã«ïŒ
- V519 [CWE-563]ãB.NDescãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ1488ã1489ãllvm-nm.cpp 1489
- V519 [CWE-563]å€æ°ã«ã¯å€ãé£ç¶ããŠ2åå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ59ã61ãcoff2yaml.cpp 61
ãã©ã°ã¡ã³ãN25-N27ïŒè¿œå ã®åå²ãåœãŠ
次ã«ããããã«ç°ãªãåå²ãåœãŠãªãã·ã§ã³ãæ€èšããŸãã
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èŠåïŒV519 [CWE-563] 'Alignment'å€æ°ã«ã¯ãå€ãé£ç¶ããŠ2åå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ1158ã1160ãLoadStoreVectorizer.cpp 1160
ããã¯éåžžã«å¥åŠãªã³ãŒãã§ãè«çãšã©ãŒãå«ãŸããŠããããã§ãã æåã«ã Alignmentå€æ°ã«ã¯ãæ¡ä»¶ã«å¿ããŠå€ãå²ãåœãŠãããŸãã ãããŠãå²ãåœãŠãåã³è¡ãããŸãããçŸåšã¯æ€èšŒãè¡ãããŠããŸããã
åæ§ã®ç¶æ³ã¯ããã§èŠãããšãã§ããŸãïŒ
- V519 [CWE-563]ãå¹æãå€æ°ã«ã¯ãå€ãé£ç¶ããŠ2åå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªïŒ152ã165ãWebAssemblyRegStackify.cpp 165
- V519 [CWE-563] 'ExpectNoDerefChunk'å€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ4970ã4973ãSemaType.cpp 4973
ãã©ã°ã¡ã³ãN28ïŒåžžã«çã®ç¶æ
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 èŠå ïŒ V547 [CWE-571]åŒ 'nextByteïŒ= 0x90'ã¯åžžã«trueã§ãã X86DisassemblerDecoder.cpp 379
æ€èšŒã¯æå³ããããŸããã nextByteå€æ°ã¯åžžã«0x90ãšçãããããŸãããããã¯åã®ãã§ãã¯ã®çµæã§ãã ããã¯ããçš®ã®è«ççãªééãã§ãã
ãã©ã°ã¡ã³ãN29-N ...ïŒåžžã«ç/åœã®æ¡ä»¶
ã¢ãã©ã€ã¶ãŒã¯ãæ¡ä»¶å šäœïŒ V547 ïŒãŸãã¯ãã®äžéšïŒ V560 ïŒãåžžã«trueãŸãã¯falseã§ãããšããå€ãã®èŠåãåºããŸãã å€ãã®å Žåããããã¯æ¬åœã®ééãã§ã¯ãªããåã«ããããªã³ãŒãããã¯ããªã©ã®å±éã®çµæã§ãã ããã«ãããããããå®éã®è«çãšã©ãŒãæã ããã®ã§ããããã®èŠåããã¹ãŠèŠãã®ã¯çã«ããªã£ãŠããŸãã ããšãã°ã次ã®ã³ãŒãã¯çããããã®ã§ãã
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èŠåïŒ V560 [CWE-570]æ¡ä»¶åŒã®äžéšãåžžã«falseã§ãïŒRegNo == 0xeã ARMDisassembler.cpp 939
å®æ°0xEã¯ã10é²æ³ã®å€14ã§ãã RegNo == 0xeããã§ãã¯ããŠãæå³ããããŸãããRegNo> 13ã®å Žåãé¢æ°ã¯å®è¡ãå®äºããããã§ãã
èå¥åV547ããã³V560ã«ã¯ä»ã«ãå€ãã®èŠåããããŸããããV595ãšåæ§ã«ããããã®èŠåã調ã¹ãããšã«èå³ã¯ãããŸããã§ããã èšäºãæžãã®ã«ååãªè³æãããããšã¯ãã§ã«æããã§ãã:)ã ãããã£ãŠãPVS-Studioã䜿çšããŠLLVMã§ãã®ã¿ã€ãã®ãšã©ãŒãããã€æ€åºã§ãããã¯äžæã§ãã
ãããã®åå¿ãç 究ããã®ãéå±ãªçç±ã®äŸãæããŸãã ã¢ãã©ã€ã¶ãŒã¯ã次ã®ã³ãŒãã«èŠåãçºè¡ããã®ã«çµ¶å¯Ÿã«æ£ããã§ãã ããããããã¯ééãã§ã¯ãããŸããã
bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons, tok::TokenKind ClosingBraceKind) { bool HasError = false; .... HasError = true; if (!ContinueOnSemicolons) return !HasError; .... }
PVS-StudioèŠåïŒV547 [CWE-570]åŒ 'ïŒHasError'ã¯åžžã«falseã§ãã UnwrappedLineParser.cpp 1635
ãã©ã°ã¡ã³ãN30ïŒäžå¯©ãªåž°é
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èŠåïŒ V612 [CWE-670]ã«ãŒãå ã®ç¡æ¡ä»¶ã®ãæ»ããã R600OptimizeVectorRegisters.cpp 63
ããã¯ééãããã³ãŒããèªãã§ããããã°ã©ããŒã«äœãã説æããããšãç®çãšããç¹å®ã®ææ³ã§ãã ãã®ãã¶ã€ã³ã§ã¯äœã説æããããéåžžã«çãããããã«èŠããŸãã ãã®ããã«æžããªãæ¹ãè¯ãã§ã:)ã
ç²ããïŒ æ¬¡ã«ããè¶ãã³ãŒããŒãäœãæéã§ãã

æ°ãã蚺æã§æ€åºãããæ¬ é¥
å€ã蚺æã®30åã®ããªã¬ãŒã§ååã ãšæããŸãã èå³æ·±ãã®ã¯ã ååã®ãã§ãã¯åŸã«ã¢ãã©ã€ã¶ãŒã«è¡šç€ºãããæ°ãã蚺æã§ãããããšã§ãã ãã®éã«ãåèš66åã®æ±çšèšºæãC ++ã¢ãã©ã€ã¶ãŒã«è¿œå ãããŸããã
ãã©ã°ã¡ã³ãN31ïŒå°éäžèœã³ãŒã
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èŠåïŒ V779 [CWE-561]å°éäžèœã³ãŒããæ€åºãããŸããã ãšã©ãŒãååšããå¯èœæ§ããããŸãã ExecutionUtils.cpp 146
ã芧ã®ãšããã ifã¹ããŒãã¡ã³ãã®äž¡æ¹ã®ãã©ã³ãã¯returnã¹ããŒãã¡ã³ãã®åŒã³åºãã§çµäºããŠããŸãã ãããã£ãŠã CtorDtorsByPriorityã³ã³ãããŒã空ã«ãªãããšã¯ãããŸããã
ã¹ããããN32ïŒå°éäžèœã³ãŒã
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èŠåïŒV779 [CWE-561]å°éäžèœã³ãŒããæ€åºãããŸããã ãšã©ãŒãååšããå¯èœæ§ããããŸãã LLParser.cpp 835
èå³æ·±ãç¶æ³ã ãã®å Žæã®å§ãŸããèŠãŠã¿ãŸãããã
return ParseTypeIdEntry(SummaryID); break;
äžèŠãééãããªãããã§ãã ããã§ã¯breakã¹ããŒãã¡ã³ãã¯äžèŠãªããã§ãåçŽã«åé€ã§ããŸãã ãã ãããã¹ãŠãããã»ã©åçŽã§ã¯ãããŸããã
ã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®è¡ã«èŠåãçæããŸãã
Lex.setIgnoreColonInIdentifiers(false); return false;
å®éããã®ã³ãŒãã¯å°éäžèœã§ãã switchã®ãã¹ãŠã®ã±ãŒã¹ã¯ã returnã¹ããŒãã¡ã³ãã®åŒã³åºãã§çµäºããŸãã ãããŠä»ãç¡æå³ãªå€ç¬ãªäŒæ©ã¯ããã»ã©ç¡å®³ã«èŠããŸããïŒ ãããããã©ã³ãã®1ã€ã¯returnã§ã¯ãªãbreakã§çµããã¹ãã§ããããïŒ
ãã©ã°ã¡ã³ãN33ïŒé«ãããã®å¶çºå
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èŠåïŒ V784ããããã¹ã¯ã®ãµã€ãºã¯ã第1ãªãã©ã³ãã®ãµã€ãºããå°ãããªã£ãŠããŸãã ããã«ãããäžäœãããã倱ãããŸãã RuntimeDyld.cpp 815
getStubAlignmenté¢æ°ã¯ç¬Šå·ãªãã®åãè¿ãããšã«æ³šæããŠãã ããã é¢æ°ãå€8ãè¿ããšä»®å®ããå ŽåãåŒã®å€ãèšç®ããŸãã
ãïŒgetStubAlignmentïŒïŒ-1ïŒ
ãïŒ8u-1ïŒ
0xFFFFFFF8u
ããã§ã DataSizeå€æ°ã¯64ãããã®ç¬Šå·ãªãåã§ããããšã«æ³šæããŠãã ããã DataSizeïŒ0xFFFFFFF88ã®æäœäžã«ã32åãã¹ãŠã®äžäœãããããªã»ãããããããšãããããŸããã ãããããããã¯ããã°ã©ããæãã§ãããã®ã§ã¯ãããŸããã 圌ã¯ãDataSizeïŒ0xFFFFFFFFFFFFFFFFF8uãèšç®ãããã£ãã®ã§ã¯ãªãããšæããŸãã
ãšã©ãŒãä¿®æ£ããã«ã¯ã次ã®ããã«èšè¿°ããå¿ èŠããããŸãã
DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);
ãŸãã¯ïŒ
DataSize &= ~(getStubAlignment() - 1ULL);
ãã©ã°ã¡ã³ãN34ïŒæ瀺çãªãã£ã¹ãã«å€±æããŸãã
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èŠåïŒ V1028 [CWE-190]ãªãŒããŒãããŒã®å¯èœæ§ã ãNumElts * ScaleãæŒç®åã®ãªãã©ã³ãããçµæã§ã¯ãªããsize_tãåã«ãã£ã¹ãããããšãæ€èšããŠãã ããã X86ISelLowering.h 1577
æ瀺çãªåå€æã¯ã intåã®å€æ°ãä¹ç®ãããšãã«ãªãŒããŒãããŒãé²ãããã«äœ¿çšãããŸãã ãã ããããã§ã®æ瀺çãªãã£ã¹ãã§ã¯ããªãŒããŒãããŒãé²æ¢ã§ããŸããã æåã«å€æ°ãä¹ç®ããã32ãããã®ä¹ç®çµæãsize_tåã«å±éãããŸãã
ãã©ã°ã¡ã³ãN35ïŒã³ããŒããŒã¹ãã®å€±æ
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]åæ§ã®2ã€ã®ã³ãŒããã©ã°ã¡ã³ããèŠã€ãããŸããããããããããã¯ã¿ã€ããã¹ã§ããããOp0ãã®ä»£ããã«ãOp1ãå€æ°ã䜿çšããå¿ èŠããããŸããInstCombineCompares.cpp 5507
ãã®æ°ããèå³æ·±ã蚺æã«ãããã³ãŒããã©ã°ã¡ã³ããã³ããŒãããäžéšã®ååãå€æŽããå§ããããäžç®æã§ä¿®æ£ãããªãã£ãç¶æ³ãæããã«ãªããŸãã
2çªç®ã®ãããã¯ã§Op0ãOp1ã«å€æŽããããšã«æ³šæããŠãã ããããããã圌ãã¯äžç®æã§ãããä¿®æ£ããŸããã§ãããã»ãšãã©ã®å Žåã次ã®ããã«æžãããŠããã¯ãã§ãã
if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) { I.setOperand(1, ConstantFP::getNullValue(Op1->getType())); return &I; }
ãã©ã°ã¡ã³ãN36ïŒå€æ°ã®æ··ä¹±
struct Status { unsigned Mask; unsigned Mode; Status() : Mask(0), Mode(0){}; Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) { Mode &= Mask; }; .... };
PVS-StudioèŠåïŒV1001 [CWE-563]ãã¢ãŒããå€æ°ãå²ãåœãŠãããŠããŸãããé¢æ°ã®æåŸãŸã§äœ¿çšãããŠããŸãããSIModeRegister.cpp 48
é¢æ°ã®åŒæ°ã«ã¯ã©ã¹ã¡ã³ããŒãšåãååãä»ããããšã¯éåžžã«å±éºã§ããæ··ä¹±ãããããç§ãã¡ã®åã«ãã®ãããªå Žåã§ãããã®åŒã¯æå³ããããŸããïŒ
Mode &= Mask;
é¢æ°ã®åŒæ°ãå€æŽãããŸãã ããã ãã§ãããã®åŒæ°ã¯äœ¿çšãããªããªããŸãããã»ãšãã©ã®å Žåã次ã®ããã«èšè¿°ããå¿ èŠããããŸããã
Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) { this->Mode &= Mask; };
ãã©ã°ã¡ã³ãN37ïŒå€æ°ã®æ··ä¹±
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; }
PVS-StudioèŠåïŒV1001 [CWE-563]ããµã€ãºãå€æ°ãå²ãåœãŠãããŠããŸãããé¢æ°ã®æåŸãŸã§äœ¿çšãããŠããŸãããObject.cpp 424
ãã®ç¶æ³ã¯åã®ç¶æ³ãšäŒŒãŠããŸããããã¯æžãããã¹ãã§ãïŒ
this->Size += this->EntrySize;
ãã©ã°ã¡ã³ãN38-N47ïŒãã€ã³ã¿ãŒããã§ãã¯ããã®ãå¿ããŠãã
以åãV595蚺æããªã¬ãŒã®äŸã調ã¹ãŸããããã®æ¬è³ªã¯ããã€ã³ã¿ãŒãæåã«éæ¥åç §ããããã®åŸã®ã¿ãã§ãã¯ãããããšã§ããV1004ã®è¥ã蚺æã¯ãã®æå³ã®éã§ãããå€ãã®ãšã©ãŒãæ€åºããŸãããã€ã³ã¿ãæåã«ãã§ãã¯ãããç¶æ³ãç¹å®ãããããå¿ããŠããŸããã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èŠåïŒV1004 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåŸããPtrããã€ã³ã¿ãŒãå®å šã«äœ¿çšãããŸããã§ããããã§ãã¯è¡ïŒ729ã738ãTargetTransformInfoImpl.h 738 ãã§ãã¯ã§æãããªããã«ãPtr
å€æ°ã¯nullptrã«ããããšãã§ããŸãã
if (Ptr != nullptr)
ãã ãã以äžã®ãã€ã³ã¿ãŒã¯äºåæ€èšŒãªãã§éåç §ãããŸãã
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());
å¥ã®åæ§ã®ã±ãŒã¹ãæ€èšããŠãã ããã
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èŠåïŒV1004 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåŸããFDããã€ã³ã¿ãŒãå®å šã«äœ¿çšãããŸããã§ãããè¡ã確èªããŠãã ããïŒ3228ã3231ãCGDebugInfo.cpp 3231
ãã€ã³ã¿ãŒFDã«æ³šæããŠãã ãããåé¡ã¯ã¯ã£ãããšèŠããã®ã§ãç¹å¥ãªèª¬æã¯å¿ èŠãããŸããã
ãããŠãŸãïŒ
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èŠåïŒV1004 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåŸããPtrTyããã€ã³ã¿ãŒãå®å šã«äœ¿çšãããŸããã§ãããè¡ã確èªããŠãã ããïŒ960ã965ãInterleavedLoadCombinePass.cpp 965
ãã®ãããªãšã©ãŒãã身ãå®ãæ¹æ³ã¯ïŒã³ãŒãã¬ãã¥ãŒã«æ³šæããPVS-Studioéçã¢ãã©ã€ã¶ãŒã䜿çšããŠã³ãŒããå®æçã«ãã§ãã¯ããŠãã ããã
ãã®ã¿ã€ãã®ãšã©ãŒãæã€ä»ã®ã³ãŒããã©ã°ã¡ã³ããæã¡èŸŒãããšã¯æå³ããããŸãããèšäºã«ã¯èŠåã®ãªã¹ãã®ã¿ãæ®ããŸãã
- V1004 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåŸããExprããã€ã³ã¿ãŒãå®å šã«äœ¿çšãããŸããã§ãããè¡ã確èªããŠãã ããïŒ1049ã1078ãDebugInfoMetadata.cpp 1078
- V1004 [CWE-476] nullptrã«å¯ŸããŠæ€èšŒãããåŸã 'PI'ãã€ã³ã¿ãŒãå®å šã«äœ¿çšãããŸããã§ãããè¡ã確èªïŒ733ã753ãLegacyPassManager.cpp 753
- V1004 [CWE-476] The 'StatepointCall' pointer was used unsafely after it was verified against nullptr. Check lines: 4371, 4379. Verifier.cpp 4379
- V1004 [CWE-476] The 'RV' pointer was used unsafely after it was verified against nullptr. Check lines: 2263, 2268. TGParser.cpp 2268
- V1004 [CWE-476] The 'CalleeFn' pointer was used unsafely after it was verified against nullptr. Check lines: 1081, 1096. SimplifyLibCalls.cpp 1096
- V1004 [CWE-476] The 'TC' pointer was used unsafely after it was verified against nullptr. Check lines: 1819, 1824. Driver.cpp 1824
N48-N60: , ( )
std::unique_ptr<IRMutator> createISelMutator() { .... std::vector<std::unique_ptr<IRMutationStrategy>> Strategies; Strategies.emplace_back( new InjectorIRStrategy(InjectorIRStrategy::getDefaultOps())); .... }
PVS-StudioèŠåïŒV1023 [CWE-460]ãemplace_backãã¡ãœããã«ãããææè ã®ãªããã€ã³ã¿ãŒããStrategiesãã³ã³ãããŒã«è¿œå ãããŸããäŸå€ãçºçãããšãã¡ã¢ãªãªãŒã¯ãçºçããŸãã llvm-isel-fuzzer.cpp 58 std :: vector <std :: unique_ptr <X >>ã®
ãããªã³ã³ããã®æ«å°Ÿã«ã¢ã€ãã ãè¿œå ããã«ã¯ãX *ããstdãžã®æé»çãªå€æããªããããxxx.push_backïŒæ°ããXïŒã ããæžãããšã¯ã§ããŸããã ïŒunique_ptr <X>ãäžè¬çãªè§£æ±ºçã¯ãxxx.emplace_backïŒæ°ããXïŒãã³ã³ãã€ã«ããããšã§ããemplace_backã¡ãœããã¯åŒæ°ããçŽæ¥èŠçŽ ãæ§ç¯ãããããæ瀺çãªã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšã§ããŸãã
ããã¯å®å šã§ã¯ãããŸããããã¯ãã«ããã£ã±ãã®å Žåãã¡ã¢ãªãå²ãåœãŠãããŸããã¡ã¢ãªã®åå²ãåœãŠæäœã倱æããstd :: bad_allocäŸå€ãã¹ããŒãããå¯èœæ§ããããŸãããã®å Žåããã€ã³ã¿ãŒã¯å€±ãããäœæããããªããžã§ã¯ãã¯åé€ãããŸããã
å®å šãªè§£æ±ºçã¯unique_ptrãäœæããããšã§ããããã¯ããã¯ã¿ãŒãã¡ã¢ãªãåå²ãåœãŠããåã«ãã€ã³ã¿ãŒãææããŸãã
xxx.push_back(std::unique_ptr<X>(new X))
C ++ 14以éã§ã¯ããstd :: make_uniqueãã䜿çšã§ããŸãã
xxx.push_back(std::make_unique<X>())
ãã®ã¿ã€ãã®æ¬ é¥ã¯ãLLVMã«ãšã£ãŠéèŠã§ã¯ãããŸãããã¡ã¢ãªãå²ãåœãŠãããšãã§ããªãå Žåãã³ã³ãã€ã©ã¯åã«åäœãåæ¢ããŸãããã ããã¡ã¢ãªã®å²ãåœãŠã«å€±æããå Žåã«çµäºã§ããªãã¢ããã¿ã€ã ã®é·ãã¢ããªã±ãŒã·ã§ã³ã®å Žåãããã¯éåžžã«åä»ãªééãã§ãã
ãã®ããããã®ã³ãŒãã¯LLVMã«å®éçãªå±éºãããããããšã¯ãããŸãããããã®ãšã©ãŒãã¿ãŒã³ãšãPVS-Studioã¢ãã©ã€ã¶ãŒããããæ€åºããããšãåŠãã ããšã¯æçã§ããããšãããããŸããã
ãã®ã¿ã€ãã®ä»ã®èŠåïŒ
- V1023 [CWE-460]ææè ã®ãªããã€ã³ã¿ãŒã¯ã 'emplace_back'ã¡ãœããã«ãã£ãŠ 'Passes'ã³ã³ãããŒã«è¿œå ãããŸããäŸå€ãçºçãããšãã¡ã¢ãªãªãŒã¯ãçºçããŸããPassManager.h 546
- V1023 [CWE-460] A pointer without owner is added to the 'AAs' container by the 'emplace_back' method. A memory leak will occur in case of an exception. AliasAnalysis.h 324
- V1023 [CWE-460] A pointer without owner is added to the 'Entries' container by the 'emplace_back' method. A memory leak will occur in case of an exception. DWARFDebugFrame.cpp 519
- V1023 [CWE-460] A pointer without owner is added to the 'AllEdges' container by the 'emplace_back' method. A memory leak will occur in case of an exception. CFGMST.h 268
- V1023 [CWE-460] A pointer without owner is added to the 'VMaps' container by the 'emplace_back' method. A memory leak will occur in case of an exception. SimpleLoopUnswitch.cpp 2012
- V1023 [CWE-460] A pointer without owner is added to the 'Records' container by the 'emplace_back' method. A memory leak will occur in case of an exception. FDRLogBuilder.h 30
- V1023 [CWE-460] A pointer without owner is added to the 'PendingSubmodules' container by the 'emplace_back' method. A memory leak will occur in case of an exception. ModuleMap.cpp 810
- V1023 [CWE-460] A pointer without owner is added to the 'Objects' container by the 'emplace_back' method. A memory leak will occur in case of an exception. DebugMap.cpp 88
- V1023 [CWE-460] A pointer without owner is added to the 'Strategies' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-isel-fuzzer.cpp 60
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 685
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 686
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 688
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 689
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 690
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 691
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 692
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 693
- V1023 [CWE-460] A pointer without owner is added to the 'Modifiers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. llvm-stress.cpp 694
- V1023 [CWE-460] A pointer without owner is added to the 'Operands' container by the 'emplace_back' method. A memory leak will occur in case of an exception. GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] A pointer without owner is added to the 'Stash' container by the 'emplace_back' method. A memory leak will occur in case of an exception. GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] A pointer without owner is added to the 'Matchers' container by the 'emplace_back' method. A memory leak will occur in case of an exception. GlobalISelEmitter.cpp 2702
ãããã«
åèšã§ãç§ã¯60åã®èŠåãæžãããã®åŸåæ¢ããŸãããPVS-Studioã¢ãã©ã€ã¶ãŒãLLVMã§æ€åºããä»ã®æ¬ é¥ã¯ãããŸããïŒã¯ãããããŸãããããããã®èšäºã®ã³ãŒãã¹ãããããäœæãããšããããã¯å€æ¹é ãããããã¯å€ã§ãããã£ãã®ã§ãç· ããããæéã§ãããšå€æããŸããã
èå³ããæã¡ã§ãPVS-Studioã¢ãã©ã€ã¶ãŒãè©ŠããŠã¿ãŠãã ããããã®ããŒãžã§
ã¢ãã©ã€ã¶ãŒãããŠã³ããŒãããŠããã©ã€ã¢ã«ããŒãååŸã§ããŸãã
æãéèŠãªããšã¯ãéçåæãå®æçã«äœ¿çšããããšã§ããéçåæãšPVS-Studioã®æ¹æ³è«ãæ®åãããããã«ç§ãã¡ãè¡ã£ã1åéãã®ãã§ãã¯ã¯ãéåžžã®ã·ããªãªã§ã¯ãããŸããã
ã³ãŒãã®å質ãšä¿¡é Œæ§ãåäžãããŠãã ããïŒ
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒAndrey Karpovã PVS-Studioã䜿çšããLLVM 8ã®ãã°ã®çºèŠã