PVS-Studio ã¢ãã©ã€ã¶ãŒã䜿çšãã LLVM ãããžã§ã¯ãã®æåŸã®ã³ãŒã ãã§ãã¯ãã 8.0.0 幎以äžãçµéããŸããã PVS-Studio ã¢ãã©ã€ã¶ãŒãäŸç¶ãšããŠãšã©ãŒãšæœåšçãªè匱æ§ãç¹å®ããããã®äž»èŠãªããŒã«ã§ããããšã確èªããŸãããã ãããè¡ãã«ã¯ãLLVM XNUMX ãªãªãŒã¹ããã§ãã¯ããŠæ°ãããšã©ãŒãèŠã€ããŸãã
æžãèšäº
æ£çŽã«èšããšããã®èšäºãæžããããªãã£ãã®ã§ãã ãã§ã«äœåºŠããã§ãã¯ããŠãããããžã§ã¯ãã«ã€ããŠæžãã®ã¯é¢çœããããŸãã (
LLVM ã®æ°ããããŒãžã§ã³ããªãªãŒã¹ãŸãã¯æŽæ°ããããã³
èŠãŠãã ãããClang Static Analyzer ã®æ°ããããŒãžã§ã³ã¯ãæ°ãããšã©ãŒãæ€åºããããšãåŠç¿ããŸããã PVS-Studio ã䜿çšããé¢é£æ§ãäœäžããŠããããã«æããŸãã Clang ã¯ä»¥åãããå€ãã®ãšã©ãŒãæ€åºããPVS-Studio ã®æ©èœã«è¿œãã€ããŸãã ããªãã¯ãã®ããšã«ã€ããŠã©ãæããŸããïŒ
ããã«å¯ŸããŠç§ã¯ãã€ã次ã®ããã«çããããšæã£ãŠããŸãã
ç§ãã¡ãæãããŸãããŠããããã§ã¯ãããŸããïŒ PVS-Studio ã¢ãã©ã€ã¶ãŒã®æ©èœãå€§å¹ ã«åäžããŸããã å¿é ããªãã§ãã ãããç§ãã¡ã¯ä»¥åãšåãããã«ãªãŒããç¶ããŸãã
æ®å¿µãªãããããã¯ééã£ãçãã§ãã ããã«ã¯èšŒæ ã¯ãããŸããã ãããŠãããç§ãä»ãã®èšäºãæžããŠããçç±ã§ãã ããã§ãLLVM ãããžã§ã¯ããå床ãã§ãã¯ãããšãããããŸããŸãªãšã©ãŒãèŠã€ãããŸããã ããã§ã¯ãç§ã«ãšã£ãŠèå³æ·±ããšæããããã®ã玹ä»ããŸãã Clang Static Analyzer ã¯ãããã®ãšã©ãŒãæ€åºã§ããŸãã (ãŸãã¯ãClang Static Analyzer ã䜿çšããŠæ€åºããã®ã¯éåžžã«äžäŸ¿ã§ã)ã ããããããã¯å¯èœã§ãã ããã«ãç§ã¯ããããã¹ãŠã®ééããäžæ©ã§èŠã€ããŠæžãçããŸããã
ããããèšäºãæžãã®ã«æ°é±éããããŸããã ããããã¹ãŠããã¹ãã«ãŸãšããæ°ã«ã¯ãªããŸããã§ãã:)ã
ãšããã§ãPVS-Studio ã¢ãã©ã€ã¶ãŒã§ãšã©ãŒãæœåšçãªè匱æ§ãç¹å®ããããã«ã©ã®ãããªãã¯ãããžãŒã䜿çšãããŠãããã«èå³ãããå Žåã¯ããããç解ããŠããããšããå§ãããŸãã
æ°æ§ã®èšºæ
ãã§ã«è¿°ã¹ãããã«ãçŽ 3 幎åã« LLVM ãããžã§ã¯ããå床ãã§ãã¯ãããèŠã€ãã£ããšã©ãŒãä¿®æ£ãããŸããã ãã®èšäºã§ã¯ãæ°ãããšã©ãŒã®ãããã玹ä»ããŸãã æ°ãããã°ãèŠã€ãã£ãã®ã¯ãªãã§ãã? ããã«ã¯ XNUMX ã€ã®çç±ããããŸãã
- LLVM ãããžã§ã¯ãã¯é²åããŠãããå€ãã³ãŒããå€æŽããæ°ããã³ãŒããè¿œå ããŠããŸãã åœç¶ã®ããšãªãããå€æŽããæžãããã³ãŒãã«ã¯æ°ããªãšã©ãŒãçºçããŸãã ããã¯ãéçåæã¯æã ã§ã¯ãªãå®æçã«äœ¿çšããå¿ èŠãããããšãæ確ã«ç€ºããŠããŸãã ç§ãã¡ã®èšäºã§ã¯ PVS-Studio ã¢ãã©ã€ã¶ãŒã®æ©èœã詳ãã説æããŠããŸãããããã¯ã³ãŒãå質ã®åäžããšã©ãŒä¿®æ£ã³ã¹ãã®åæžãšã¯äœã®é¢ä¿ããããŸããã éçã³ãŒã ã¢ãã©ã€ã¶ãŒãå®æçã«äœ¿çšããŠãã ããã
- çŸåšãæ¢åã®èšºæãå®æãããæ¹åããŠããŸãã ãããã£ãŠãã¢ãã©ã€ã¶ãŒã¯ã以åã®ã¹ãã£ã³ã§ã¯æ°ä»ããªãã£ããšã©ãŒãç¹å®ã§ããŸãã
- 2 幎åã«ã¯ååšããªãã£ãæ°ãã蚺æã PVS-Studio ã«ç»å ŽããŸããã 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 ã®èŠå:
ååãéšåæååãavx512.mask.permvar.ãã§å§ãŸãããšãäºéãã§ãã¯ãããŸãã XNUMX åç®ã®ãã§ãã¯ã§ã¯ãæããã«äœãå¥ã®ããšãæžãããã£ãã®ã§ãããã³ããŒããããã¹ããä¿®æ£ããã®ãå¿ããŠããŸããã
ãã©ã°ã¡ã³ã 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
ã¿ã€ããã¹ã®ãããåãååã®å®æ°ã XNUMX å䜿çšãããŠããŸã CXNameRange_WantQualifier.
ãã©ã°ã¡ã³ã 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 ã®èŠå:
ç§ã®æèŠã§ã¯ãããã¯éåžžã«çŸããééãã§ãã ã¯ããç§ãçŸã«ã€ããŠå¥åŠãªèããæã£ãŠããããšã¯ç¥ã£ãŠããŸã:)ã
ããŠãã«ãããšã
(ISD == ISD::EXTRACT_VECTOR_ELT && (Index == ST->isLittleEndian())) ? 1 : 0
å®éçãªèŠ³ç¹ããèŠããšããã®ãããªæ¡ä»¶ã¯æ¬¡ã®ããã«èŠçŽã§ãããããæå³ããããŸããã
(ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian())
ããã¯æãããªééãã§ãã ããããã0/1 ãå€æ°ãšæ¯èŒãããã£ãã®ã§ãããã ã€ã³ããã¯ã¹ã ã³ãŒããä¿®æ£ããã«ã¯ãäžé æŒç®åã®åšå²ã«ãã£ããè¿œå ããå¿ èŠããããŸãã
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))
ã¡ãªã¿ã«ãäžé
æŒç®åã¯è«çãšã©ãŒãåŒãèµ·ããéåžžã«å±éºãªæŒç®åã§ãã æ¬åŒ§ã䜿çšããå Žåã¯ååã«æ³šæããããã¿ã«æ¬åŒ§ã䜿çšããªãã§ãã ããã ãã®ãããã¯ãããã«è©³ãã調ã¹ãŸãã
ãã©ã°ã¡ã³ã N4ãN5: 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;
}
....
}
PVS-Studio ã®èŠå:
ãã€ã³ã¿ã®å Žå LHS ã null ã®å Žåã¯ãèŠåãçºè¡ãããŸãã ãã ãã代ããã«ããã®åã 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] Null ãã€ã³ã¿ãŒ 'ProgClone' ã®éåç §ãçºçããå¯èœæ§ããããŸãã ã³ã³ãã€ã«ãã¹.cpp 601
åãã«ã¹ããŒããã€ã³ã¿ãŒ ããã°ã¯ããŒã³ ãªããžã§ã¯ãã®ææãããã:
BD.setNewProgram(std::move(ProgClone));
å®ã¯ä»ã ããã°ã¯ããŒã³ ã¯ãã«ãã€ã³ã¿ã§ãã ãããã£ãŠãnull ãã€ã³ã¿ã®éåç §ã¯ä»¥äžã§çºçããå¿ èŠããããŸãã
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
ããããå®éã«ã¯ãããªããšã¯èµ·ãããŸããïŒ ã«ãŒãã¯å®éã«ã¯å®è¡ãããªãããšã«æ³šæããŠãã ããã
ã³ã³ããã®å é ã« ãã¹ã³ã³ãã€ã«ãããé¢æ° ã¯ãªã¢æžã¿:
MiscompiledFunctions.clear();
次ã«ããã®ã³ã³ããã®ãµã€ãºãã«ãŒãæ¡ä»¶ã§äœ¿çšãããŸãã
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
ã«ãŒããéå§ãããŠããªãããšãç°¡åã«ããããŸãã ããããã°ã ãšæããŸãã®ã§ãã³ãŒããå¥ã®æ¹æ³ã§èšè¿°ããå¿ èŠããããŸãã
ã©ãããããã®æåãªåçã®ãšã©ãŒã«ééããããã§ãã äžã€ã®ééããå¥ã®ééããèŠãé ããŸã:)ã
ãã©ã°ã¡ã³ã 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] Null ãã€ã³ã¿ãŒ 'Test' ã®éåç §ãçºçããå¯èœæ§ããããŸãã ã³ã³ãã€ã«ãã¹.cpp 709
ãŸãåãç¶æ³ã æåã¯ãªããžã§ã¯ãã®å 容ã移åããããã®åŸã¯äœäºããªãã£ããã®ããã«äœ¿çšãããŸãã C++ ã«ç§»åã»ãã³ãã£ã¯ã¹ãç»å ŽããŠä»¥æ¥ãããã°ã©ã ã³ãŒãã§ãã®ç¶æ³ããŸããŸãé »ç¹ã«èŠãããŸãã ãããç§ã C++ èšèªã倧奜ããªçç±ã§ãã èªåã®è¶³ãæã¡èœãšãæ°ããæ¹æ³ãã©ãã©ãå¢ããŠããŸãã PVS-Studio ã¢ãã©ã€ã¶ãŒã¯åžžã«æ©èœããŸã:)ã
ãã©ã°ã¡ã³ã N8: Null ãã€ã³ã¿
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] NULL ãã€ã³ã¿ãŒ 'Type' ã®éåç §ãçºçããå¯èœæ§ããããŸãã ããªãã£ãã¡ã³ã¯ã·ã§ã³ãã³ããŒ.cpp 233
ãšã©ãŒ ãã³ãã©ãŒã«å ããŠããããã°åºåé¢æ°ã¯éåžžãã¹ããããŸããã ãŸãã«ãã®ãããªã±ãŒã¹ãç§ãã¡ã®ç®ã®åã«ãããŸãã ãã®æ©èœã¯ãŠãŒã¶ãŒãåŸ ã£ãŠããããŠãŒã¶ãŒã¯åé¡ã解決ãã代ããã«ããããä¿®æ£ããããšã匷ããããŸãã
æ£ããïŒ
if (Type)
Type->dump(*this);
else
Printer << "<unknown-type>";
ãã©ã°ã¡ã³ã N9: Null ãã€ã³ã¿
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] NULL ãã€ã³ã¿ãŒ 'Ty' ã®éåç §ãçºçããå¯èœæ§ããããŸãã 614 æ€çŽ¢å¯èœãªããŒãã«ãšããã¿ãŒ.cpp
ãã¹ãŠãæããã§ããã説æã®å¿ èŠã¯ãªããšæããŸãã
ãã©ã°ã¡ã³ã 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 ã®èŠå:
å€æ°ãããèªäœã«ä»£å ¥ããŠãæå³ããããŸããã ãããã圌ãã¯æ¬¡ã®ããã«æžãããã£ãã®ã§ãããã
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 ã®èŠå:
æåã«éåžžã«æªãããªãã¬ãŒã¿ãŒãããŸã ç Žãã ããã«äœãä»ã«æžãå¿ããŠããŸããã?
ãã©ã°ã¡ã³ã 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 ã®èŠå:
ãã€ã³ã¿ åŒã³åºãå é¢æ°ã®åŒã³åºãæã«å é ãéåç §ããã getTTI.
ãããŠããã®ãã€ã³ã¿ãçãããã©ããããã§ãã¯ããå¿ èŠãããããšãããããŸã 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] ãCalleeFnããã€ã³ã¿ãŒã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåã«äœ¿çšãããŸããã è¡ã確èªããŠãã ãã: 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 ã確èªããŸããDWARFormValue.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 ã®èŠå:
ããã¯ãã°ã§ã¯ãªãå¯èœæ§ããããã³ãŒãã¯æå³ãããšããã«æ£ç¢ºã«åäœããŸãã ããããããã¯æããã«éåžžã«çãããå Žæã§ããã確èªããå¿ èŠããããŸãã
å€æ°ãšããŸããã ãµã€ãº ã 16 ã«çããå Žåãã³ãŒãã®äœæè ã¯ãããå€æ°ã«å ¥ããããšãèšç»ããŸããã NImms å€ïŒ
1111111111111111111111111111111111111111111111111111111111100000
ãã ããå®éã«ã¯æ¬¡ã®ãããªçµæã«ãªããŸãã
0000000000000000000000000000000011111111111111111111111111100000
å®éããã¹ãŠã®èšç®ã¯ 32 ããã笊å·ãªãåã䜿çšããŠè¡ãããŸãã ãããŠãã®å Žåã«ã®ã¿ããã® 32 ãããã®ç¬Šå·ãªãåã¯æé»çã«æ¬¡ã®ããã«å±éãããŸãã uint64_tã ãã®å Žåãæäžäœãããã¯ãŒãã«ãªããŸãã
ãã®ç¶æ³ã¯æ¬¡ã®ããã«ä¿®æ£ã§ããŸãã
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
åæ§ã®ç¶æ³: V629 [CWE-190] 'Immr << 6' åŒã®æ€æ»ãæ€èšããŠãã ããã 32 ãããå€ã®ããã ã·ãããšãã®åŸã® 64 ãããåãžã®æ¡åŒµã AArch64AddressingModes.h 269
æç N19: ããŒã¯ãŒããæ¬ èœããŠããŸã ã»ãã«?
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 ã®èŠå:
ããã«ééãã¯ãããŸããã æåã® then ãããã¯ä»¥é if ã§çµãã ç¶ããããããªãã©ãã§ãããã§ããããŒã¯ãŒãããããŸãã ã»ãã« ãåŠãã ã©ã¡ãã®æ¹æ³ã§ããã³ãŒãã¯åãããã«æ©èœããŸãã ãŸã èŠéãã ã»ãã« ã³ãŒããããäžæ確ã§å±éºã«ãªããŸãã å°æ¥çã«ã¯ ç¶ãã ãæ¶ãããšãã³ãŒãã¯ãŸã£ããç°ãªãåäœãéå§ããŸãã ç§ã®æèŠã§ã¯è¿œå ããæ¹ãè¯ããšæããŸã ã»ãã«.
æç N20: åãã¿ã€ãã® XNUMX ã€ã®ã¿ã€ããã¹
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()ãåŒãæ€æ»ããããšãæ€èšããŠãã ããã ã·ã³ãã«.cpp 32
- V655 [CWE-480] æååã¯é£çµãããŸãããã䜿çšãããŠããŸããã ãResult + "(ObjC Class)" + Name.str()ãåŒãæ€æ»ããããšãæ€èšããŠãã ããã ã·ã³ãã«.cpp 35
- V655 [CWE-480] æååã¯é£çµãããŸãããã䜿çšãããŠããŸããã ãResult + "(ObjC Class EH) " + Name.str()ãåŒãæ€æ»ããããšãæ€èšããŠãã ããã ã·ã³ãã«.cpp 38
- V655 [CWE-480] æååã¯é£çµãããŸãããã䜿çšãããŠããŸããã ãResult + "(ObjC IVar)" + Name.str()ãåŒãæ€æ»ããããšãæ€èšããŠãã ããã ã·ã³ãã«.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 ã®èŠå:
åé¡è¡:
FeaturesMap[Op] = FeaturesMap.size();
If èŠçŽ 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] 'B.NDesc' å€æ°ã«å€ã 1488 åé£ç¶ããŠå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ãã: 1489ã1489ãllvm-nm.cpp XNUMX
- V519 [CWE-563] å€æ°ã«å€ã 59 åé£ç¶ããŠå²ãåœãŠãããŠããŸãã ããããããã¯ééãã§ãã è¡: 61ã2 ã確èªããŸãã coff61yaml.cpp XNUMX
ãã©ã°ã¡ã³ã 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ãå€æ°ã«å€ã 1158 åé£ç¶ããŠå²ãåœãŠãããŠããŸãã ããããããã¯ééãã§ãã è¡: 1160ã1160 ã確èªããŸããLoadStoreVectorizer.cpp XNUMX
ããã¯éåžžã«å¥åŠãªã³ãŒãã§ãããæããã«è«çãšã©ãŒãå«ãŸããŠããŸãã åãã¯å€æ° ã¢ã©ã€ã³ã¡ã³ã æ¡ä»¶ã«å¿ããŠå€ãå²ãåœãŠãããŸãã ãããŠåã³å²ãåœãŠãè¡ãããŸããããã§ãã¯ã¯è¡ãããŸããã
åæ§ã®ç¶æ³ãããã§ãèŠãããŸãã
- V519 [CWE-563] ãEffectsãå€æ°ã«å€ã 152 åé£ç¶ããŠå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡: 165ã165 ã確èªããŸããWebAssemblyRegStackify.cpp XNUMX
- V519 [CWE-563] 'ExpectNoDerefChunk' å€æ°ã« 4970 åé£ç¶ããŠå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã ãã§ãã¯è¡: 4973ã4973ãSemaType.cpp XNUMX
ãã©ã°ã¡ã³ã N28: åžžã« true æ¡ä»¶
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 ã®èŠå:
æ€æ»ããŠãæå³ãªããã å€æ° 次ã®ãã€ã åžžã«å€ãšçãããªã 0x90ãåã®ãã§ãã¯ããç¶ããŸãã ããã¯ããçš®ã®è«çãšã©ãŒã§ãã
ãã©ã°ã¡ã³ã N29 - N...: åžžã« 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 ã®èŠå:
å®æ° 0xE ã¯ã14 é²æ°ã®å€ XNUMX ã§ãã æ€æ» RegNo == 0xe æå³ããããŸããã ç»é²çªå· > 13ããã®åŸãé¢æ°ã¯å®è¡ãå®äºããŸãã
ä»ã«ã ID V547 ããã³ V560 ã®èŠåãå€æ°ãããŸãããã
ãããã®ããªã¬ãŒã®ç 究ãéå±ã§ããçç±ã®äŸã瀺ããŸãã ã¢ãã©ã€ã¶ãŒã次ã®ã³ãŒãã«å¯ŸããŠèŠåãçºè¡ããã®ã¯å®å šã«æ£ããã§ãã ãããããããééãã§ã¯ãããŸããã
bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
tok::TokenKind ClosingBraceKind) {
bool HasError = false;
....
HasError = true;
if (!ContinueOnSemicolons)
return !HasError;
....
}
PVS-Studio èŠå: V547 [CWE-570] åŒ '!HasError' ã¯åžžã« false ã§ãã 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 ã®èŠå:
ããã¯ãšã©ãŒããŸãã¯ã³ãŒããèªãã§ããããã°ã©ããŒã«äœãã説æããããšãç®çãšããç¹å®ã®ãã¯ããã¯ã®ããããã§ãã ãã®ãã¶ã€ã³ã¯ç§ã«ã¯äœã説æã§ãããéåžžã«çãããããã«èŠããŸãã ãã®ããã«æžããªãã»ããããã§ã:)ã
ç²ããïŒ æ¬¡ã«ããè¶ãŸãã¯ã³ãŒããŒãäœãæéã§ãã
æ°ãã蚺æã«ãã£ãŠç¹å®ãããæ¬ é¥
å€ã蚺æã®ã¢ã¯ãã£ããŒã·ã§ã³ã¯ 30 åã§ååã ãšæããŸãã 次ã«ãã¢ãã©ã€ã¶ãŒã«è¡šç€ºãããæ°ãã蚺æã§ã©ã®ãããªèå³æ·±ãããšãèŠã€ããããèŠãŠã¿ãŸãããã
ãã©ã°ã¡ã³ã 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 ã®èŠå:
ã芧ã®ãšãããæŒç®åã®äž¡æ¹ã®åå²ã¯ 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;
äžèŠãããšãããã«ã¯ééãããªãããã«èŠããŸãã ãªãã¬ãŒã¿ãŒã£ãœã ç Žã ããã«ã¯äœåãªãã®ããããŸãããåçŽã«åé€ã§ããŸãã ãã ãããã¹ãŠãããã»ã©åçŽã§ã¯ãããŸããã
ã¢ãã©ã€ã¶ãŒã¯æ¬¡ã®è¡ã§èŠåãçºè¡ããŸãã
Lex.setIgnoreColonInIdentifiers(false);
return false;
ãããŠç¢ºãã«ããã®ã³ãŒãã¯å°éã§ããŸããã ãã¹ãŠã®ã±ãŒã¹ ã¹ã€ãã ãªãã¬ãŒã¿ãŒããã®é»è©±ã§çµäº returnã ãããŠä»ã¯äžäººã§ã¯ç¡æå³ ç Žã ããã»ã©ç¡å®³ã«ã¯èŠããŸããïŒ ãããããã©ã³ãã® XNUMX ã€ã¯æ¬¡ã®ããã«çµããã¯ãã§ãã ç Žããããã§ã¯ãªã return?
ãã©ã°ã¡ã³ã 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 ã®èŠå:
æ©èœã«æ³šæããŠãã ãã getStubAlignment æ»ãå€ã®å 眲åãããŠããªãã é¢æ°ãå€ 8 ãè¿ããšä»®å®ããŠãåŒã®å€ãèšç®ããŠã¿ãŸãããã
~(getStubAlignment() - 1)
~(8u-1)
0xFFFFFFFF8u
ããã§ãå€æ°ã«æ³šç®ããŠãã ããã ããŒã¿ãµã€ãº 64 ãããã®ç¬Šå·ãªãåãæã¡ãŸãã DataSize & 0xFFFFFFF8u æäœãå®è¡ãããšãäžäœ 0 ãããããã¹ãŠ 8 ã«ãªã»ãããããããšãããããŸãã ãããããããã¯ããã°ã©ããæãã§ãããã®ã§ã¯ãããŸããã ãããã圌㯠DataSize & XNUMXxFFFFFFFFFFFFFFXNUMXu ãèšç®ãããã£ãã®ã ãšæããŸãã
ãšã©ãŒãä¿®æ£ããã«ã¯ã次ã®ããã«èšè¿°ããå¿ èŠããããŸãã
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 ã®èŠå:
åå€æ°ãä¹ç®ããéã®ãªãŒããŒãããŒãé¿ããããã«ãæ瀺çãªåãã£ã¹ãã䜿çšãããŸãã intåã ãã ããããã§ã®æ瀺çãªåãã£ã¹ãã¯ãªãŒããŒãããŒãé²ããã®ã§ã¯ãããŸããã ãŸãå€æ°ãä¹ç®ããããã®åŸã§ä¹ç®ã® 32 ãããçµæãåã«å±éãããŸãã
ãã©ã°ã¡ã³ã 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;
}
....
}
ãã®æ°ããèå³æ·±ã蚺æã¯ãã³ãŒãã®äžéšãã³ããŒããããã®äžã®äžéšã®ååãå€æŽããå§ããŠããã«ãããããããããå Žæãä¿®æ£ãããŠããªãç¶æ³ãç¹å®ããŸãã
XNUMX çªç®ã®ãããã¯ã§ã¯å€æŽãããŠããããšã«æ³šæããŠãã ãã 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 ã®èŠå:
é¢æ°ã®åŒæ°ã«ã¯ã©ã¹ ã¡ã³ããŒãšåãååãä»ããã®ã¯éåžžã«å±éºã§ãã éåžžã«æ··ä¹±ããããã§ãã ãŸãã«ãã®ãããªã±ãŒã¹ãç§ãã¡ã®ç®ã®åã«ãããŸãã ãã®è¡šçŸã¯æå³ããããŸãã:
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] ãSizeãå€æ°ãå²ãåœãŠãããŠããŸãããé¢æ°ã®æåŸãŸã§ã¯äœ¿çšãããŸããã ãªããžã§ã¯ã.cpp 424
ç¶æ³ã¯ååãšåæ§ã§ãã 次ã®ããã«æžãå¿ èŠããããŸã:
this->Size += this->EntrySize;
æç N38-N47: ã€ã³ããã¯ã¹ã確èªããã®ãå¿ããŸãã
ååã¯ã蚺æããªã¬ãŒã®äŸã«ã€ããŠèª¬æããŸããã
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] 'Ptr' ãã€ã³ã¿ãŒã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåŸãå®å šã«äœ¿çšãããŸããã§ããã è¡: 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] ãFDããã€ã³ã¿ãŒã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåŸãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŠãã ãã: 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] ãPtrTyããã€ã³ã¿ãŒã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåŸãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŠãã ãã: 960ã965ã InterleavedLoadCombinePass.cpp 965
ãã®ãããªãšã©ãŒãã身ãå®ãã«ã¯ã©ãããã°ããã§ãããã? ã³ãŒãã¬ãã¥ãŒã«ããã«æ³šæãæããPVS-Studio éçã¢ãã©ã€ã¶ãŒã䜿çšããŠã³ãŒããå®æçã«ãã§ãã¯ããŠãã ããã
ãã®ã¿ã€ãã®ãšã©ãŒãããä»ã®ã³ãŒãæçãåŒçšããããšã¯æå³ããããŸããã èšäºã«ã¯èŠåã®ãªã¹ãã®ã¿ãæ®ããŠãããŸãã
- V1004 [CWE-476] 'Expr' ãã€ã³ã¿ã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåŸãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŠãã ãã: 1049ã1078ã DebugInfoMetadata.cpp 1078
- V1004 [CWE-476] nullptr ã«å¯ŸããŠæ€èšŒãããåŸããPIããã€ã³ã¿ãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŠãã ãã: 733ã753ã LegacyPassManager.cpp 753
- V1004 [CWE-476] ãStatepointCallããã€ã³ã¿ã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåŸãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŠãã ãã: 4371ã4379ã Verifier.cpp 4379
- V1004 [CWE-476] ãRVããã€ã³ã¿ã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåŸãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŸã: 2263ã2268ãTGParser.cpp 2268
- V1004 [CWE-476] 'CalleeFn' ãã€ã³ã¿ãŒã¯ãnullptr ã«å¯ŸããŠæ€èšŒãããåŸãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŠãã ãã: 1081ã1096ãSimplifyLibCalls.cpp 1096
- V1004 [CWE-476] nullptr ã«å¯ŸããŠæ€èšŒãããåŸã'TC' ãã€ã³ã¿ãå®å šã«äœ¿çšãããŸããã§ããã è¡ã確èªããŠãã ãã: 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 ã®èŠå:
次ã®ããã«ã³ã³ããã®æåŸã«èŠçŽ ãè¿œå ããã«ã¯ std::vector > ãã æžãããšã¯ã§ããŸãã xxx.push_back(æ°ãã X)ããã®æé»çãªå€æããªãããã X* в std::unique_ptr.
äžè¬çãªè§£æ±ºçã¯æ¬¡ã®ããã«æžãããšã§ã 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] ææè ã®ãªããã€ã³ã¿ãŒã 'emplace_back' ã¡ãœããã«ãã£ãŠ 'AAs' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã ãšã€ãªã¢ã¹åæ.h 324
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãããemplace_backãã¡ãœããã«ãã£ãŠãEntriesãã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã DWARFDebugFrame.cpp 519
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'AllEdges' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã CFGMST.h 268
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒã 'emplace_back' ã¡ãœããã«ãã£ãŠ 'VMaps' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã SimpleLoopUnswitch.cpp 2012
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Records' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã FDRLogBuilder.h 30
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'PendingSubmodules' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã ã¢ãžã¥ãŒã«ããã.cpp 810
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒã 'emplace_back' ã¡ãœããã«ãã£ãŠ 'Objects' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã ãããã°ããã.cpp 88
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Strategies' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-isel-fuzzer.cpp 60
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 685
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 686
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 688
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 689
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 690
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 691
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 692
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 693
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Modifiers' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã llvm-ã¹ãã¬ã¹.cpp 694
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Operands' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãã'emplace_back' ã¡ãœããã«ãã£ãŠ 'Stash' ã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] ææè ã®ãªããã€ã³ã¿ãŒãããemplace_backãã¡ãœããã«ãã£ãŠãMatchersãã³ã³ãããŒã«è¿œå ãããŸãã äŸå€ãçºçãããšã¡ã¢ãª ãªãŒã¯ãçºçããŸãã GlobalISelEmitter.cpp 2702
ãŸãšã
åèš60åã®èŠåãçºããŠåæ¢ããŸããã PVS-Studio ã¢ãã©ã€ã¶ãŒã LLVM ã§æ€åºããä»ã®æ¬ é¥ã¯ãããŸãã? ã¯ãããããŸãã ããããèšäºçšã®ã³ãŒãã®æçãæžãåºããŠãããšãå€æ¹ããšãããå€ã«ãªã£ãŠããŸã£ãã®ã§ãããçµããã«ããããšæ±ºå¿ããŸããã
èå³ãæã£ãŠããã ããPVS-Studio ã¢ãã©ã€ã¶ãŒãè©ŠããŠã¿ãŠããã ããã°å¹žãã§ãã
ã¢ãã©ã€ã¶ãŒãããŠã³ããŒãããŠããã€ã³ã¹ã€ãŒãã®ããŒãå
¥æã§ããŸãã
æãéèŠãªããšã¯ãéçåæãå®æçã«äœ¿çšããããšã§ãã XNUMXåéãã®ãã§ãã¯ãéç解æã®æ¹æ³è«ãš PVS-Studio ãæ®åãããããã«åœç€Ÿãå®æœããã·ããªãªã¯éåžžã®ã·ããªãªã§ã¯ãããŸããã
ã³ãŒãã®å質ãšä¿¡é Œæ§ãåäžããããé 匵ã£ãŠãã ããã
ãã®èšäºãè±èªåã®èªè
ãšå
±æãããå Žåã¯ã翻蚳ãªã³ã¯ã䜿çšããŠãã ãã: Andrey Karpovã
åºæïŒ habr.com