á¨áĽáá PVS-Studio á°ááłá á áá áá á¨á¤áá¤ááŞá¤á ááŽáááľ á¨áá¨á¨áť á¨áŽáľ áá°áť áŤáá á¨áááľ áááłáľ á áá á áááᢠá¨PVS-áľáąá˛áŽ á°ááłá á ááá áľá
á°áśá˝á áĽá ááá á¨áá˝á á°áááááśá˝á áááá¨áľ áááŁá áá°á ááłáŞáŤ áááá áĽáá¨áááĽá˘ áá
áá áááľá¨á á á¤áá¤ááŞá¤á 8.0.0 áááľ ááľáĽ á á˛áľ áľá
á°áśá˝á áĽáááľáťáá áĽá áĽáááááá˘
á¨ááťá á˝áá
áĽáááąá ááááá áá
á á˝áá ááťá á ááááŠáᢠáá°á á˛á áĽá áá áľááá¨áááá ááŽáááľ ááťá á áľá°áłá˝ á áá°áá (
á á˛áľ á¨á¤áá¤ááŞá¤á áľáŞáľ á á°ááá ááá á á°ááá ááĽá
á°ááá¨áľáŁ á á˛áą ᨠClang Static Analyzer áĽáľá á áłá˛áľ áľá á°áśá˝á áááááľ á°ááŻá! ááŞá¤áľ-áľáąá˛áŽá á¨áá áá á áľáááááľ áĽá¨ááá° áááľááᢠáááá á¨á ááą á¨á áá áľá á°áśá˝á áŤááá áĽá ᨠPVS-áľáąá˛áŽá á˝ááłáá˝ ááááᢠáľááá ááłá áá áŤáľáŁá?
ááá á ááá á ááľ ááá ááááľ áĽááááááĄ-
áĽáá áá áĽáá á ááááĽá! á¨PVS-áľáąá˛áŽ á°ááłá á á áá á áĽá á á áťá˝áááᢠáľááá á áá¨ááᣠáĽáá°ááľáá áááŤáłá˝áá áĽáááĽáááá˘
á ááŤáłáá áááł, áá ááĽá áááľ áá. á ááľáĄ ááá áá¨áááŤáá˝ á¨áá. áĽá á áá áá á á˝áá á¨áá˝áá ááá ááᢠáľááá ᣠá¨á¤áá¤ááŞá¤á ááŽáááą á áľáá á°ááľá¸á áĽá á ááľáĄ á¨á°ááŤáŠ áľá á°áśá˝ á°ááá°ááᢠá áá ááĽá á áľá°áłá˝ á¨áááľááá á áłááťááᢠClang Static Analyzer áĽááá á áľá á°áśá˝ ááááľ á ááťáá (ááá á áĽáą áĽááłáł áá á áááľá¨á á áŁá ááš á áá°áá)ᢠáá áĽáá˝áááᢠá¨áá á á áá áĽááá á áá áľá á°áśá˝ á á ááľ áá˝áľ á áááź áťááŠ.
ááá áá á˝ááá áááťá áĽá áłáááłáľ áá áˇá. áá áá áá áá° á˝áá áááľááŁáľ áŤá´á áááŁáľ á ááťááŠá :).
á áááŤá˝á áá á PVS-Studio analyzer ááľáĽ áľá
á°áśá˝á áĽá ááá á¨áá˝á á°áááááśá˝á áááá¨áľ áá á´áááááá˝ áĽá
á áá áĽáá°ááá ááááľ áŤááľ á¨áá
áá ááá°ááá
ááłáĽ á áááŁáá á˘
á á˛áľ áĽá á áŽá ááááŤáá˝
áá°á á˛á áĽáá°á°ááááᣠá¨áááľ á ááľ á ááľ á¨á¤áá¤ááŞá¤á ááŽáááľ á áľáá á°ááľá¸á á¨á°áááľ áľá á°áśá˝ á°áľá°áŤááááᢠá áá áá á˝áá á á˛áľ á¨áľá á°áľ áľáĽáľáŚá˝á áŤáááŁá. ááá á á˛áľ áľá á°áśá˝ á°áá? ááá 3 ááááŤáśá˝ á ááĄ-
- á¨á¤áá¤ááŞá¤á ááŽáááą áĽá¨á°áťáťáᣠá¨áľáŽ áŽáľ áĽá¨áá¨á¨ áĽá á á˛áľ áŽáľ á áá¨áá áá ááᢠá á°ááĽáŽáŁ á á°áťáťáá áĽá á á°áťáá áŽáľ ááľáĽ á áłá˛áľ áľá á°áśá˝ á áᢠáá á ááá˝ á¨ááŤáłá¨á á¨áááááłááľ áľááłá á áá°á áááľ áĽá á áá ááá á áá áľ áĽáá á áá á áá á áá°ááᢠá˝áááťá˝á ᨠPVS-Studio analyzerá á˝ááłáá˝ á á°áἠáŤáłáŤá, ááá áá áá á¨áŽáľ áĽáŤáľá á¨ááťáťá áĽá áľá á°áśá˝á áááľá°áŤá¨á ááŞá á¨ááááľ áá ááá áááááľ á¨ááá. á¨áááááłááľ áŽáľ á°ááłá á áá°á áááľ áá áá!
- áŤááľá ááááŤáá˝ áĽáŤá ááá á áĽá áĽáŤáťáťáá ááᢠáľááá á°ááłá á áá°ááľ á ááśá˝ áá áľ áŤááľá°ááá¸áá áľá á°áśá˝ ááá¨áľ áá˝ááá˘
- á¨2 á ááľ á ááľ áŤááá ᨠá á˛áľ ááá፠á PVS-Studio áłááˇáᢠᨠPVS-áľáąá˛áŽá áĽáľááľ á ááá˝ áááłá¨áľ á á°áᨠááá ááľáĽ áááááľ áá°ááŠ.
ᨠ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-áľáąá˛áŽ ááľá ááááŤáĄ-
áľá á ááĄáľ ááĽá¨ááá "avx512.mask.permvar" áááአá áĽáĽá á°á¨ááá§áᢠá ááá°áá áźá ááľáĽ, áá ááá áááťá áĽáá°áááá ááá˝ áá, ááá áá á¨á°ááłáá á˝áá áá¨á á¨áľá°áá.
ááŤá 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;
....
}
ááľá ááá፠PVS-áľáąá˛áŽáĄ V501 á¨'|' á áľá°á፠áĽá á áľá°áá 'CXNameRange_WantQualifier' á°ááłáłá áááľ ááááŤáá˝ á áᢠáŚááŹá°á. á˛áá°ááľ.á˛á 7245
á áłáá ááááŤáľáŁ á°ááłáłá áľá áŤáá áá áááľ áá áĽá á áá áááá 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-áľáąá˛áŽ ááľá ááááŤáĄ-
á áĽá á áľá°áŤá¨áľ áá á áŁá á¨ááŤáá áľá á°áľ áá. á á, áľá áá áľ áĽáááł ááłáŚá˝ áĽááłáá á áááá :).
á áá, áá á¨áľ
(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))
á áááŤá˝á áá, ᨠternary áŚááŹá°á á áŁá á á°áá áĽá ááááŤáłá áľá
á°áśá˝á áŤáľááłá. á áĽáą áá á áŁá áá ááá áĽá á á
áá ááľáĽ áľááĽáἠá áááᢠáá
áá áááľ á á áá áááá á°ááá¨áľáŠá
ááŤá 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-áľáąá˛áŽ ááľá ááááŤáĄ-
á ááá á¨áá á¤á.á¤á˝.á¤áľ. áá á¨áááᣠááľá ááá፠áá°áĽ áááŁáᢠáááᣠá ááľáŠáŁ áá á°ááłáłá áŁáś á áá áá°á¨áááĄ- LHS->getAsString().
ááá á¨ááááľáá¸á áľáá°áľ á áľá á°áľ á°ááŁáŁáŞ ááľáĽ á˛á°á á áá á áŁá á¨á°ááá° áááł ááᢠá¨áááááłááľ á°ááłáá˝ ááá áŤá á á á°á°ááá áĽá á áá á˘áá áááá áá°á¨áľáŁá¸á á¨áá˝á áŽáľ áááľášá˘ áá á¨áááááłááľ áľááłá áĽáá´áľ ááá˝ á¨áá¨áŤ áĽá á¨áľá á°áľ áá¨áá¨áŤ áá´áá˝á áĽáá°ááŤáá á¨ááŤáłá á áŁá áĽáŠ ááłá ááá˘
á°ááłáłá á¨á áá á áŤáŤá áľá á°áľ ááľáľ á¨áá á áłá˝ áŁáá áŽáľ ááľáĽ á°áá áśááłáᥠV522 [CWE-476] á¨áá á áááŤá˝ '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-áľáąá˛áŽ ááľá ááááŤáĄ V522 [CWE-476] áŁáś á áá 'ProgClone'á ááá°á ááŤááľ áá˝ááᢠá¨á°áłáłá° áľáĽáľáĽ.cpp 601
ááááŞáŤ áá áĽáἠá áá ááŽáááá á¨ááአáŁáá¤áľ ááá áŤááááĄ-
BD.setNewProgram(std::move(ProgClone));
áĽáá°áá á áá ááŽáááá áŁáś á áá ááᢠáľááá ᣠáŁáś á áá ááᣠá¨áá á áłá˝ áá¨á°áľ á áá áľá˘
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
áá, á áĽáááą, áá á áááá! ááááą á áľááá áĽááłáá°áá ᨠáἠáá áá˘
á ááŤáŁá ááááŞáŤ áá á¨á°áłáłáą á°ááŁáŤáľ á¸áľáˇááĄ
MiscompiledFunctions.clear();
á ááá á ᣠá¨áá ááŤáŁ áá á á loop áááł ááľáĽ áĽá á áá áááá á˘
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-áľáąá˛áŽ ááľá ááááŤáĄ- V522 [CWE-476] á¨áá á áá 'áá¨áŤ' ááłá áá°á¨á áá˝ááᢠá¨á°áłáłá° áľáĽáľáĽ.cpp 709
áĽáá°áá á°ááłáłá áááł. ááááŞáŤ áá á¨áĽáá áááľ ááááłááłá, á¨ááŤá ááá áĽááłáá°á¨á°á° áá áŤááááá. á C ++ ááľáĽ á¨áĽáá áľáá´ ááşáá˝ á¨áłáŠ á áá áá áá áááł á ááŽááŤá áŽáľ ááľáĽ áĽá áá á ááťááᢠááá áá á¨C++ áááá á¨ááá°á! á¨áŤáľáá áĽáá ááááłáľ áĽá áĽá áĽá á áłá˛áľ ááááśá˝ á áᢠᨠPVS-áľáąá˛áŽ á°ááłá áááá áĽáŤ ááá¨áá :).
ááŤá 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-áľáąá˛áŽ ááľá ááááŤáĄ- 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-áľáąá˛áŽ ááľá ááááŤáĄ- V522 [CWE-476] áŁáś á áá 'áłá'á ááá°á ááŤááľ áá˝ááᢠáááá á¨áá˝á á á¨á´áEmitter.cpp 614
ááá ááá ááá˝ áá áĽá ááĽáŤáŞáŤ á áŤáľááááá áĽáŹ á áľáŁáá.
ááŤá N10: Typo
bool FormatTokenLexer::tryMergeCSharpNullConditionals() {
....
auto &Identifier = *(Tokens.end() - 2);
auto &Question = *(Tokens.end() - 1);
....
Identifier->ColumnWidth += Question->ColumnWidth;
Identifier->Type = Identifier->Type; // <=
Tokens.erase(Tokens.end() - 1);
return true;
}
á¨PVS-áľáąá˛áŽ ááľá ááááŤáĄ-
á°áááá ááŤáą ááá°áĽ ááá áááł á¨ááá. ááááŁáľ áĽááą áááťá áááá áá á-
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-áľáąá˛áŽ ááľá ááááŤáĄ-
ááááŞáŤ áá á áŁá á á áŤáŁáŞ áŚááŹá°á á áᢠáá¨áŁ. áĽáá áá ááá ááťá á¨áľá°áá?
ááááá 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-áľáąá˛áŽ ááľá ááááŤáĄ-
á áá áŤá ááááŞáŤ áá á°ááŁáŠ á áá áŤá áľ áá ááááťá ááááľTTI.
áĽá á¨á፠áá á áá ááĽáŠáááľ áá¨ááἠáĽááłáá áľ á°ááá 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-áľáąá˛áŽ ááľá ááááŤáĄ- 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-áľáąá˛áŽ ááľá ááááŤáĄ- V595 [CWE-476] á¨'ND' á áá á nullptr áá á¨áá¨ááᥠá ááľ áĽá á áá áááᢠááľááŽá˝á áŤá¨áááĄáĄ 532ᣠ534. SemaTemplateInstantiateDecl.cpp 532
áĽá áĽáá :
- V595 [CWE-476] á¨'U' á áá á nullptr áá á¨áá¨ááᥠá ááľ áĽá á áá áááᢠááľááŽá˝á áŤá¨áááĄ: 404, 407. DWARFormValue.cpp 404
- V595 [CWE-476] á¨'ND' á áá á nullptr áá á¨áá¨ááᥠá ááľ áĽá á áá áááᢠááľááŽá˝á áŤá¨áááĄáĄ 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-áľáąá˛áŽ ááľá ááááŤáĄ-
áľá á°áľ áááá áá˝áá áĽá áŽáą áĽáá°áłá°á á áá°áŤáᢠáá áá á ááá˝ á áŁá á á áŤáŁáŞ áá áĽá ááá°á˝ á áá áľá˘
á°áááááá áĽáá á áá á ᨠ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-áľáąá˛áŽ ááľá ááááŤáĄ-
áĽáá ááá áľá á°áľ á¨áá. á¨ááááŞáŤá áá-á ááľ ááᎠif áá áŤá áá ááĽá, á¨á፠ááá á áá°áá, ááá áá á á áŤáá፠áŚá ááľ. á ááááá ááááľ áŽáą á á°ááłáłá ááአáá°áŤá. á ááá á áááŚáłáᢠáŤáá፠áŽáąá á¨á áá ááá˝ áŤááá áĽá á á°áá áŤá°ááááᢠáá°ááľ á¨áá ááĽá áá áá, áŽáą áá ááá á á°áᨠááááľ ááľáŤáľ ááááŤá. á áĽá á áľá°áŤá¨áľ áá¨áá ááťáá áŤáááŤ.
ááŤá N20ᥠá áŤáľ á áááľ á°ááłáłá ááááśá˝
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-áľáąá˛áŽ ááľá ááááŤáá˝áĄ-
- V655 [CWE-480] áááśáš á°áŁáá¨á áá áĽá á áá á ááááᢠá¨'áá¤áľ + áľá.str()' á áááá á áááááá áŤáľáĄá áľá˘ Symbol.cpp 32
- V655 [CWE-480] áááśáš á°áŁáá¨á áá áĽá á áá á ááááᢠá¨'áá¤áľ +"(ObjC ááá)" + Name.str()" á áááá á áááááá áŤáľáĄá áľá˘ Symbol.cpp 35
- V655 [CWE-480] áááśáš á°áŁáá¨á áá áĽá á áá á ááááᢠá¨'áá¤áľ +"(ObjC Class EH)" + Name.str()" á áááá á áááááá áŤáľáĄá áľá˘ Symbol.cpp 38
- V655 [CWE-480] áááśáš á°áŁáá¨á áá áĽá á áá á ááááᢠá¨'áá¤áľ +"(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-áľáąá˛áŽ ááľá ááááŤáĄ-
á¨á˝áá ááľáááĄ
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-áľáąá˛áŽ ááľá ááááŤáĄ-
áĽáá áľáááá áľá á°áľ áŤá á áááľáááᢠá ááľááá á°á°ááá áá°áŁ áĽáťá˘ áá á ááá áľá á°áľ ááá˘
á á°ááłáłááĄ-
- V519 [CWE-563] á¨'B.NDesc' á°áááá áĽá´áśá˝ á á°á¨áłáłá áááľ áá ááá°áŁá. ááááŁáľ áá áľá á°áľ áá. ááľááŽá˝á áŤá¨áááĄ: 1488, 1489. llvm-nm.cpp 1489
- V519 [CWE-563] á°ááááá á á°á¨áłáłá áááľ áá áĽá´áśá˝ á°á°áĽáˇáᢠááááŁáľ áá áľá á°áľ áá. ááľááŽá˝á áŤá¨áááĄáĄ 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-áľáąá˛áŽ ááľá ááááŤáĄ- V519 [CWE-563] á¨'á á°ááá' á°áááá á á°á¨áłáłá áááľ áá áĽá´áśá˝ á°á°áĽáˇáᢠááááŁáľ áá áľá á°áľ áá. ááľááŽá˝á áŤá¨áááĄáĄ 1158ᣠ1160. LoadStoreVectorizer.cpp 1160
áá á áŁá áĽáááł á¨áá áŽáľ á˛áá áááľáá ááááŤáłá áľá á°áľ á¨áŤáᢠááááŞáŤ áá, á°áááá á á°ááá áĽáá° áááłá ââáĽá´áľ ááá°áŁá. áĽá á¨á፠áá°áŁá áĽáá°áá áá¨á°áłá ᣠáá á áá áŤá ááá áá¨áááŤá˘
á°ááłáłá áááłáá˝ áĽáá ááłáŠ áá˝áá-
- V519 [CWE-563] á¨'Effects' á°áááá áĽá´áśá˝ á á°á¨áłáłá áááľ áá ááá°áŁá. ááááŁáľ áá áľá á°áľ áá. ááľááŽá˝á áŤá¨áááĄáĄ 152ᣠ165. WebAssemblyRegStackify.cpp 165
- V519 [CWE-563] á¨'ExpectNoDerefChunk' á°áááá áĽá´áśá˝ á á°á¨áłáłá áááľ áá ááá°áŁá. ááááŁáľ áá áľá á°áľ áá. ááľááŽá˝á áŤá¨áááĄ: 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-áľáąá˛áŽ ááľá ááááŤáĄ-
ááá°á˝ áľááá á¨áááᢠá°áááá ááŁá áŁááľ áááá á¨ááá áá áĽáŠá á áá°áá 0x90, áá á á¨ááłáá áźá áá¨á°áá. áá á ááłááľ ááááľ ááááŤáłá áľá á°áľ ááá˘
ááŤá N29 - N...: áááá áĽáááľ/áá°áľ áááłáá˝
á°ááłá áĽá ááľá ááááŤáá˝á áá°áŁá á á ááá áááł (
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-áľáąá˛áŽ ááľá ááááŤáĄ-
ááá 0xE á á áľááŽá˝ áá 14 ááᢠááá፠RegNo == 0xe áľááá á¨ááá ááááŤáąá á¨áá RegNo > 13, á¨á፠á°ááŁáŠ á ááááá áŤá áá áá.
ááłáá፠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' ááááá áá°áľ ááᢠáŤáá°á ááá ááľáá ááá°á.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-áľáąá˛áŽ ááľá ááááŤáĄ-
áá áľá á°áľ ááá á¨á°áᨠá´ááá áá áŽáąá áááŤáᥠááŽááŤááŽá˝á˘ áá ááľá ááá ááá á áááá˝ááá áĽá á áŁá á á áŤáŁáŞ áááľáá. áĽáá°á፠á áááťá ááťáá :).
á°áááá? á¨ááŤá áťá ááá áĄá áááĽáŤáľ ááá á áá áá.
ááľááśá˝ á á á˛áľ ááááŤáá˝ á°ááá°á ááłááá
áĽá áĽáá°ááľá á 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-áľáąá˛áŽ ááľá ááááŤáĄ-
áĽáá°ááłá¨á, áááąá á¨áŚááŹá°áŠ á áááŤáá˝ if áá° áŚááŹá°áŠ á áá°áá áŤá áá ááááľ. á áá áá á¨áľ ááŤáŁá á¨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-áľáąá˛áŽ ááľá ááááŤáĄ- V779 [CWE-561] á¨ááá°á¨áľ áŽáľ á°áááˇáᢠáľá á°áľ ááá áá˝áá. LLParser.cpp 835
á áľá°áłá˝ áááł. á ááááŞáŤ áá áá áŚáł áĽáááĄ-
return ParseTypeIdEntry(SummaryID);
break;
á ááááŞáŤ á˛áłá, áĽáá ááá áľá á°áľ á¨áá áááľáá. áŚááŹá°áŠá áááľáá áá¨áŁ áĽáá á ááľ á°á¨á᪠á á, áĽá á ááá áá°á¨á áá˝áá. ááá áá, ááá á áŁá ááá á áá°áá.
á°ááłá á ááľááŽáš áá ááľá ááá፠áá°áŁááĄ-
Lex.setIgnoreColonInIdentifiers(false);
return false;
áĽá á áĽáááĽ, áá áŽáľ áá°á¨áľá áľ á¨ááá˝á áá. ááá ááłáŽá˝ á ááá á áŚááŹá°áŠ áĽáŞ áŤá áá ááááľ. áĽá á áá áĽáťáá áľááá á¨áá˝ áá¨áŁ ááá ááłáľ á¨ááá á áááľáá! ááááŁáľ á¨á áááŤááš ááľáĽ á ááą ááá á áá áľ áá¨áŁáŁ áá á áá°áá ááááľ?
ááŤá 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-áľáąá˛áŽ ááľá ááááŤáĄ-
áĽáŁááá á°ááŁáŠá áŤáľá°áá getStubAligment á¨ááááť á áááľ áŤáá°áá¨á. á°ááŁáŠ áĽá´áąá 8 áĽáá°ááááľ á áá°áĽ á¨áááťáá áá áĽáá°áá˘
~(getStubAligment() - 1)
~(8u-1)
0xFFFFFFFF8u
á áá á°áááá áááá áἠáá á á¨ááἠáá á áŁá 64-á˘áľ áŤáá°áá¨á á áááľ á ááᢠá¨DataSize & 0xFFFFFFF8u áľáŤ á˛á°áŤ ááá á ááł áááľ áŁáá¨áá°á á˘áľ áá° áᎠáááá áŤáᢠááááŁáľá, áá ááŽááŤá á ááŞá á¨áááá á áá°áá. áĽáą áááľááľ áĽáá°ááá áĽá áŤá áŤááᥠDataSize & 0xFFFFFFFFFFFFFFFF8u.
áľá á°áąá áááľá°áŤá¨á, á¨áá¨á°ááá ááťá á ááĽááľ:
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-áľáąá˛áŽ ááľá ááááŤáĄ-
á¨ááááľ á°ááááŽá˝á á ááŁááľ áá á¨áá á á áá ááá°áľá áááľáááľ ááá˝ ááááľ ááá°áľ áĽá
á áá áááá 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;
}
....
}
áá á á˛áľ á áľá°áłá˝ ááá፠áŽáľ á¨á°ááłá áľá áĽá á ááľáĄ á ááłááľ áľáá˝ áááἠá¨áááŠá áľá áááłáá˝á áááŤá ᣠáá á á ááľ áŚáł áá áĽááą á ááľá°áŤá¨ááá˘
áĽáŁáá á ááá°áá áĽáá ááľáĽ á°ááá áá áŚá0 áá áŚá1. áá á á ááľ áŚáł áá á ááľá°áŤá¨áá. ááááŁáľá áĽáá˛á á°áĽá ááá áá á¨á áľá˘
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-áľáąá˛áŽ ááľá ááááŤáĄ-
á¨á°ááŁá ááááŽá˝á á¨ááá á áŁááľ áá á°ááłáłá áľáá˝á ááľá áľ á áŁá á á°áá ááᢠá፠áááŁáľ á áŁá ááá ááᢠá ááłá˝á áĽáá°áá áŤá ááłá á ááᢠáá á áááá˝ áľááá á¨ááááĄ-
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-áľáąá˛áŽáĄ V1001 [CWE-563] á¨'áá á' á°áááá á°ááľá§á áá áĽáľá¨ á°ááŁáŠ áá¨á¨áť áľá¨áľ áĽá á áá á ááááᢠObject.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-áľáąá˛áŽ ááľá ááááŤáĄ 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-áľáąá˛áŽ ááľá ááááŤáĄ 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-áľáąá˛áŽ ááľá ááááŤáĄ V1004 [CWE-476] á¨'PtrTy' á áá á nullptr áá á¨á°á¨ááá á áá á°á áááą áŁáá°á á á áááł áĽá á áá áááᢠááľááŽá˝á áŤá¨áááĄáĄ 960ᣠ965. InterleavedLoadCombinePass.cpp 965
áĽáŤáľáá á¨áĽáá°áá á áááľ áľá á°áśá˝ áĽáá´áľ áĽáá°áá¨áá¨á? á Code-Review áá á¨á áá áľáŠá¨áľ ááľáĄ áĽá áŽáľáá á áá°á áááľ áááá°á˝ á¨PVS-Studio static analyzer áá ááá˘
á¨áá á áááľ áľá á°áśá˝ áŤááŁá¸á ááá˝ á¨áŽáľ áááĽáŤáŽá˝á ááĽááľ ááá áááł á¨ááá. á á˝áá ááľáĽ á¨ááľá ááááŤáá˝ ááááá áĽáť áĽá°áááá-
- V1004 [CWE-476] á¨'Expr' á áá á nullptr áá á¨á°á¨ááá á áá á°á áááą áŁáá°á á á áááł áĽá á áá áááᢠááľááŽá˝á áŤá¨áááĄáĄ 1049ᣠ1078. DebugInfoMetadata.cpp 1078
- V1004 [CWE-476] á¨'PI' á áá á nullptr áá á¨á°á¨ááá á áá á°á áááą áŁáá°á á á áááł áĽá á áá áááᢠááľááŽá˝á áŤá¨áááĄáĄ 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] á¨'TC' á áá á nullptr áá á¨á°á¨ááá á áá á°á áááą áŁáá°á á á áááł áĽá á áá áááᢠááľááŽá˝á áŤá¨áááĄáĄ 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-áľáąá˛áŽ ááľá ááááŤáĄ-
áĽáá° ááŤáŁá áá¨á¨áť áá á ááľ ááĽá¨ ááá ááá¨áá std :: áŹáá°á > áá áĽáá ááťá á áľá˝ááᢠxxx.push_back(á á˛áľ X), ᨠá¨á°ááá᪠ááᣠá¨áá ááᎠX* в std :: ááŠ_ptr.
á ááľ á¨á°ááá° áááľá ááťá áá xxx.emplace_back(á á˛áľ X)áľáááŤá áá á ᥠáá´ emplace_back á ááľ á¤ááááľá á¨áá¨áŤá¨áŞáŤááš á ááĽáł ááááŁá áĽá áľááá ááá˝ ááá˘áá˝á áá áá áá˝ááá˘
á áľá°ááá á áá°áá. áŹáá°áŠ áá á¨áá, áá á°á¨ áľááľáł áĽáá°áá ááá°áŁá. á¨áá á°á¨ áľááľáł áŚáł ááľáŤá ááá ááłáŤ áá˝ááᣠá áá á ááááŤáľ á¨á°áᨠáááááá áŤáľá¨áľáá std :: ááĽá_alloc. á áá á ááŁá á ááá áá áá áĽá á¨á°áá á¨á ááá áá˝á á áá°á¨áá.
á áľá°ááá áááľá ááá á áá ááŠ_ptráŹáá°áŠ áá á°á¨ áľááľáłá áá° áá áŚáł áááá¨á á¨ááá¨áŠ á ááľ á¨á ááá áŁáá¤áľ á¨ááááĄ
xxx.push_back(std::unique_ptr<X>(new X))
á¨C++14 ááᎠ'std:: make_unique' áá áá áá˝áááĄ-
xxx.push_back(std::make_unique<X>())
áá
ááááą ááľááľ áá¤áá¤ááŞá¤á ááłá á áá°ááᢠáá
á°á¨ áľááľáł ááá°áĽ áŤáá°áťá, áá áá¨áŞáŤá á ááá áááá. ááá áĽáá áá¨á
á áá áá°áá áŞáŤáá˝
áľááá ááá áĽááłá áá áŽáľ áá¤áá¤ááŞá¤á á°ááŁáŤá áľááľ áŁáááĽáá áŁáľááá á¨áľá á°áľ ááľá áááŤáľ á áá áá á áááźááá áĽá ᨠPVS-áľáąá˛áŽ á°ááłá áĽáąá áááá¨áľ á°ááŻáá˘
á¨áá á áááľ ááá˝ ááľá ááááŤáá˝áĄ-
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá áá° 'ááááŤáá˝' ááŤáŁ á 'emplace_back' áá´ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. PassManager.h 546
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá áá° 'AAs' ááŤáŁ á 'emplace_back' áá´ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. á ááŤáľ áľááłá.á 324
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'á¨ááá˘áŤ' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. DWARFDebugFrame.cpp 519
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá áá° 'AllEdges' ááŤáŁ á 'emplace_back' áá´ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. CFGMST.h 268
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá áá° 'VMaps' ááŤáŁ á 'emplace_back' áá´ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. SimpleLoopUnswitch.cpp 2012
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'áŞáŽááśá˝' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. FDRLogBuilder.h 30
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'á áá áŁá á áá áŤá áááľ ááąáá˝' ááŤáŁ ááľáĽ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. ModuleMap.cpp 810
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá áá° 'áááŽá˝' ááŤáŁ á 'emplace_back' áá´ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. DebugMap.cpp 88
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'áľááśá˝' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-isel-fuzzer.cpp 60
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 685
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 686
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 688
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 689
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 690
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 691
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 692
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 693
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Modifiers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. lvm-stress.cpp 694
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá áá° 'Operands' ááŤáŁ á 'emplace_back' áá´ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá áá° 'áĽáľáłá˝' ááŤáŁ á 'emplace_back' áá´ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] áŁáá¤áľ á¨ááá á áá á 'emplace_back' áá´ áá° 'Matchers' ááŤáŁ ááłá¨ááᢠá á°áᨠáááł á¨ááľáłááľ á˝ááł ááá°áľ áá¨á°áłá. GlobalISelEmitter.cpp 2702
áá°áá°ááŤ
á á á ááá 60 ááľá ááááŤáá˝á á ááĽáź á¨á፠á áááŠá˘ á¨PVS-Studio analyzer á á¤áá¤ááŞá¤á ááľáĽ á¨ááŤááá¸á ááá˝ ááľááśá˝ á á? á á á ááᢠááá ááᣠáá˝áá áŽáľ áááĽáŤá áľá˝áᣠá ááťáš áá áá áᣠááá áĽáá˛áŤáá áá˝áľ áá áᣠáĽá á ááľ áá áááĽáŤáľ ááá áĽáá°á°á¨á° áá°ááŠáá˘
á áľá°áłá˝ áá áĽááłáááľ áĽá á¨PVS-Studio analyzerá ááá¨á áĽáá°áááá á°áľá á á°ááááá˘
á°ááłáá á ááá°á á¨áááľá áľááá áááá á áá ááááľ áá˝ááá˘
á¨ááá á áá, áá áľááłáá á áá°á áááľ áá áá. á¨á ááľ áá áźáŽá˝, á áĽá á¨á°áŤáá°á á¨áľáłá˛á áľáá°á áá´á áĽá PVS-áľáąá˛áŽá áááľá°ááá á¨á°ááá° áááł á áá°áá.
á¨áŽáľáá áĽáŤáľ áĽá á áľá°áááááľ áááťáťá áááŤá ááľá!
áá
á á˝áá ááĽááááá á°áá᪠áłáłááá˝ áááŤáľ á¨áááᣠáĽáŁáá á¨áľááá ááŤáŤáŁáá á ááľáŹ áŤááá áá ááá˘
ááá: hab.com