ααΆαααΈαααααΆαααΆαααααααα»ααα
α
αΆααααΆααααΈααΆααααα½ααα·αα·ααααααααΌαα
α»αααααααααααααα LLVM αααααααΎα§ααααααα·ααΆα PVS-Studio ααααααΎαα α
αΌαααααΆααααΆ α§ααααααα·ααΆα PVS-Studio αα
ααααΆα§αααααααΆααα»ααααααααΆαααααααα’ααααααααΆαααα α»α αα·αααΆαααΆαααααααααααα’αΆα
ααΎαααΆαα ααΎααααΈααααΎααΌα
αααααΎαααΉααα·αα·αααααΎααα·ααααααααααα α»αααααΈαα
αααα»αααΆαα
ααααααΆα LLVM 8.0.0 α
α’ααααααααααααΌαααααα
αα·ααΆαα±ααααααααα
αααα»ααα·αα
αααααααα’ααααααααααα ααΆαα·ααα½αα±ααα
αΆααα’αΆαααααααααα»αααΆααααααα’αααΈαααααααα½ααααααΎαααΆααα·αα·αααα
αααΎααααα½α
ααα αΎα (
ααΆααααααααααααααααΈαα LLVM ααααΌαααΆαα
ααααααΆα α¬ααααΎαα
αα
α»ααααααααΆα
ααΎα ααααααααΈαααα Clang Static Analyzer ααΆαααααααααααααα α»αααααΈ! ααΆα αΆααααΌα ααΆαααα»αααΆααΆαααΆαααααααααααΆαααααΎααααΆαα PVS-Studio αααα»αααα α»αα Clang ααααΎαααα α»αα αααΎαααΆααα»α α αΎαααΆαααΆαααααααααΆααααα PVS-Studio α ααΎαααα·ααα·αααααααααΆαααΆαααα ααααααΏαααα?
α ααααααΏαααααααα»ααααααα ααααααΎαα’αααΈαα½αααΌα ααΆα
ααΎααααα·αα’αααα»ααααααααα! ααΎαααΆαααααΎα±αααααααΎαα‘αΎααααΆαααααΆααααΌααααααααΆαααααα’ααααα·ααΆα PVS-Studio α ααΌα αααααα»αααΆαααα ααΎαααααααΉαααΆαααΌα αα»αα
ααΆα’αα»αα αααααΊααΆα ααααΎααα·αααα’α αα·αααΆαααααα»ααΆααα αααα»αααΆααα αααα αΎαααΆααΌαα ααα»ααααααα»ααααα»ααααααα’ααααααααα₯α‘αΌααααα ααΌα αααα αααααα LLVM ααααΌαααΆααα·αα·αααααααααα α αΎαααα α»αααΆα αααΎαααααΌαααΆαααααΎααα αααα»αααΆα α₯α‘αΌαααα αααα»αααΉααααα αΆαα’αααΈααααα½αα±ααα αΆααα’αΆαααααααααααΆαααααα»αα Clang Static Analyzer αα·αβα’αΆα βααβααΎαβααα α»αβααΆααβαααβαα (α¬βααΆβααΆβααΆαβαα’αΆαααα’α½αβααααΆααβαααα»αβααΆαβααααΎβααΌα ααααβαααβααΆαβαααα½αβααααβααΆ)α ααα»ααααααΎαα’αΆα ααααΎααΆαα ααΆαααααα ααα αααα»αααΆαααααΎα αα·ααααααααα α»αααΆααα’ααααααα ααααΆα αα½αα
ααα»ααααααΆααααααα’αααααα αααΆααααα αααΎααααααΆα αα αααα»αβαα·αβα’αΆα βααβαααα½αβαααα»αβαα βααΆααβααΆααβα’ααβαααβααΆβα’ααααα :) α
ααααα·ααΈααα ααααα·αααΎα’αααα
αΆααα’αΆααααααααΉααα
αα
αααα·ααααΆααΆαααααααΌαααΆαααααΎαα
αααα»αα§ααααααα·ααΆα PVS-Studio ααΎααααΈαααααα’ααααααααΆαααα α»α αα·αααΆαααΆαααααααααααα’αΆα
ααΎαααΆαααα αααα»αααααΎα±ααααααΆααααΆ
ααΆαααααΎααααα·αα·α ααααααααΈαα·αα αΆαα
ααΌα αααααΆαααααααααΆαααα½α α αΎα αααα ααααΈαααααΆααα»α αααααα LLVM ααααΌαααΆααα·αα·αααααααααα α αΎαααα α»ααααααΆαααααΎαααααΌαααΆαααααααΌαα α₯α‘αΌαβαααβα’αααααβαααβααΉαβαααα αΆαβααα α»αβαα½αβααΆα αβααααΈα α ααα»α’αααΈααΆαααΆαααααααααΈααααΌαααΆαααααΎα? ααΆαα ααα»αα α£ αααΆααααααΆααααΏααααα
- αααααα 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α
ααΆααααΌαααΆααααα½ααα·αα·αααααΈαααααΆαααααα αΆααααααΎααααα’αααααα "avx512.mask.permvar" α αα αααα»αααΆααααα½ααα·αα·αααααΎαααΈααΈα αα½αααα αααΆααααΆα αααααααα’αααΈααααα ααα»ααααααααα ααα’ααααααααααΆαα ααααα
ααααα 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.
Fragment 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 ααΆαα½αααΉαα’ααααα½αα ααααααααα. ααΎααααΈαα½ααα»αααΌα α’αααααααΌαααααααααααααα ααα»ααα·αααααα·ααααα·αα ternaryα
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-Studioα
ααααα·αααΎααααα·α α’α·αα’αα αα»αααΆαααα ααΆααααααΆααα½αααααααΌαααΆαα ααα ααααααΆαααΆααααα αααα»ααα αα·α ααααα·α αααααΌα ααααΆαααααΉαααααΌαααΆααααα LHS->getAsString().
αααααΊααΆααααΆαααΆαααααααΆαααα»α αα ααααααααα α»αααααΌαααΆαααΆαααα αααα»αα§ααααααααααααΆαααα α»α αααααΆαααααΆαααααΆααααΆααααΆααααααα½αααα α§ααααααα·ααΆααα·αα·αααααα·αα·αααααΎαααΌααααα’αΆα αα αααααΆαααΆααα’αα αααααΈααΆααΆααααΌαααΆαααααααΎααΉαααΆααααα»ααααΆαααααα αααααΊααΆα§ααΆα αααααααα’αα½αα’αααΈαααααααααΆααα·ααΆααα·αα·αααααααααααααααααΆαααααΎααααα αα·ααα αα αααααααΆαααΆαααα α»αααααααα
ααα α»ααααα»αααΆααααααααΆαααααα·α ααααααααααΆ HRH ααααΌαααΆαα’αα»ααααΆααα αααα»αααΌαααΆααααααα V522 [CWE-476] ααΆαααα·αααααααααα·α ααααΆαααα 'RHS' α’αΆα ααΎαα‘αΎαα TGParser.cpp 2186
Fragment 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 pointer αα½αααααΎαα‘αΎαααΌα ααΆααααααα
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
ααα»ααααααΆααα·α ααΏααααααΉααα·αααΎαα‘αΎααα! α αααΆαααΆααααα·ααα»ααα·αααααΌαααΆαααααα·ααααα·ααΆααα·αααα
αα ααΎααα»α αα»αααΆααα»α αααααα
MiscompiledFunctions.clear();
αααααΆαα ααα ααααα»αααΊααααααααααΌαααΆαααααΎαααα»αααααααααααααα·ααα»αα
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
ααΆααΆααααα½ααααα»αααΆαααΎαααΆααααα·ααα»ααα·αα αΆααααααΎαααα αααα»αβαα·αβααΆβαααβααβααΆβααα α»αβααα α αΎαβααΌαβαα½αβααβααααΌαβααΆαβαααααβαα»αβααααΆα
ααΆα αΆααααΈααΌα ααΆααΎαααΆααα½ααααααααα α»αααααααααααΆααααααΈααα! ααα α»ααα½ααα·αααΆαααα½αααα :) α
Fragment 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
ααααΆαααΆααααααααααααα ααααΌα ααΆαα·ααΆααααααααα»ααααΌαααΆαααααΆααααΈ α αΎααααααΆααααααΆααααΌαααΆαααααααΎααΌα ααΆααααΆαα’αααΈααΎαα‘αΎαα αααα»αααΎαααααΆαααΆααααααΆααααα αααΎαα‘αΎααααΆααΉαααΆαααα αααα»αααΌααααααα·ααΈαααααΆααααΈα αααΆ semantics ααΆααααα αΆααααα½ααα αααα»α 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 α’α£α£
ααααααααΈααΎα§ααααααααααααΆαααα α»α αα»αααΆααα»αααΆαααααα»αααααΆααααααΆαα·αααααΌαααΆαααΆαααααααα ααΎαβααΆαβααααΈβαααβαααβαα βα ααααβαα»αβααΎαα αα»αααΆααααα»ααααα αΆαα’αααααααΎααααΆαα ααααααα½αα±ααααΆααααααααΆααααα αΆααααααΆαα ααΉαααααΌααααααα±αααα½ααα»αααΆα
ααααΉαααααΌαα
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α
ααΆααααΆαα ααα»α ααΆαααα»αααΆααααααα’ααααα αααα½αααΆααα ααΆαα αααΎαααααααΆαα½αααα αααααααα
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α
ααΆαααααα·ααααα·αααα½αα±ααααααααααΆαααα ααΎαααααΌα ααααα. ααΎα’αααααααα αααααα’αααΈαααααααααα ααΈααααα?
Fragment 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α
α ααα’α»α Callee αα βααΎαβααααΌαβααααΌαβααΆαβααβααα·αααβαα βαααβαααβαα»αααΆαβααααΌαβααΆαβα α β ααα½αααΆαTTI.
α αΎααααααΆααααααΆααααααΆααααα·α ααααα½αααααααΌαααΆααα·αα·ααααααααΆααααααΆα nullptr:
if (!Callee || Callee->isDeclaration())
ααα»ααααααΆααΊααααα αΎαβ¦
Fragment 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] ααααα·α '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-Studioα
ααΆαααα ααααΆαα·ααααααΆααα α»ααα α αΎααααααΌαααααΎαααΆααααΆααα·αααααΆααααΌα ααααα ααα»ααααβαααβα αααΆααβααΆβααααααβαααβαα½αβα²ααβααααααβααααΆαα α αΎαβααααΌαβαα·αα·αααβααΎαα
α αΌααα·ααΆαααΆα’ααα ααα α ααΊααααΎααΉα 16 α αΎααααααΆααααα’ααααα·ααααααααΌααααααααΉαααααΆαα ααΆα’ααα NImms αααααα
1111111111111111111111111111111111111111111111111111111111100000
ααααααΆαααΆαααααααΆααα·αααααααααΉαααΆαα
0000000000000000000000000000000011111111111111111111111111100000
ααΆααα·αααΊααΆααΆαααααΆααΆααα’ααααΎαα‘αΎααααααααΎαααααα 32-bit unsigned α α αΎαααΆααααααααααα ααααααααααα·αααΆαα α»αα αααααααΆ 32 αααΈααααααΉαααααΌαααΆααααααΈααααΆαααΆααααααα uint64_t. αααα»αααααΈααα αααΈαααααααΆαααααα»αααΉαααΆααΌαααα
α’αααα’αΆα αα½ααα»αααααΆαααΆαααΌα αααα
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
ααααΆαααΆαααααααααααΆα V629 [CWE-190] αα·α αΆαααΆαα·αα·αααααΎααααααα 'Immr << 6' α ααΆαααααΆααααααΌααααΈαααααααα 32 αααΈαααΆαα½αααΉαααΆααααααΈαααΆαααααααααΆαααα αααααα 64 αααΈαα AArch64AddressingModes.h α’α¦α©
ααααα 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α
αα·αααΆαααα α»ααα ααΈαααααα α αΆααααΆααααΈαααααααα - αααα»αααΈαα½α if αααα αααα αααααααααΆααααααΆαα·αααΆααααα αΆαα ααΆαααΆααααααααΉα αααααααα α¬βαα·αβαααα αα·ααΈααΆααααα ααΌαααΉαααααΎαααΆαααΌα ααααΆα αα ααααΉα αααααααα ααααΎα±ααααΌαααΆαααααα·αα αααΆααααΆαα αα·ααααααααααΆααα ααααα·αααΎαα αααα’ααΆαα αααα ααΆαα ααΌαααΉαα αΆααααααΎαααααΎαααΆααα»αααααΆααΆαααααα»αα αα αααα»ααααα·ααααααααα»αααΆααΆααΆαααα’αααααΎαααΆααα»αααΎααααΈαααααα αααααααα.
Fragment 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-Studioα
- V655 [CWE-480] ααααααααΌαααΆαααααΆααααααΆ ααα»αααααα·αααααΌαααΆαααααΎααααΆααααα αα·α αΆαααΆαα·αα·αααααΎααααααα 'αααααα + Name.str()'α Symbol.cpp α£α’
- V655 [CWE-480] ααααααααΌαααΆαααααΆααααααΆ ααα»αααααα·αααααΌαααΆαααααΎααααΆααααα αα·α αΆαααΆαα·αα·αααααΎααααααα 'αααααα + "(ObjC Class)" + Name.str()'α Symbol.cpp α£α₯
- V655 [CWE-480] ααααααααΌαααΆαααααΆααααααΆ ααα»αααααα·αααααΌαααΆαααααΎααααΆααααα αα·α αΆαααΆαα·αα·αααααΎααααααα 'αααααα + "(ObjC Class EH)" + Name.str()' α Symbol.cpp α£α¨
- V655 [CWE-480] ααααααααΌαααΆαααααΆααααααΆ ααα»αααααα·αααααΌαααΆαααααΎααααΆααααα αα·α αΆαααΆαα·αα·αααααΎααααααα 'αααααα + "(ObjC IVar)" + Name.str()' α Symbol.cpp α€α‘
αααα ααααα ααααα·ααααα·αα + ααααΌαααΆαααααΎαααα½αα±αα += operator α ααααααααΊααΆααα ααΆααααα·αααΆαα’ααααααα
Fragment 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();
ααααα·αααΎααΆαα» 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. 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-Studioα 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-Studioα
ααΆααααα½ααα·αα·ααααα·αααα ααα»ααααα α’ααα αααααααΆαα ααααααα·αααααΎααΉαααααα 0x90αααααααααΈααΆααααα½ααα·αα·ααααα»αα αααααΊααΆααααααααααα α»αα‘αΌααΈαααα½αα ααα½αα
Fragment 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-Studioα
0xE αααααΊααΆααααα 14 αααα»αααααΆαα ααΆααααα‘α RegNo == 0xe αα·αααα ααα»αααααααααααααα·αααΎ αααα α»ααααααΈ > α‘α£αααααΆαααααα»αααΆαααΉααααα ααααΆαααααα·ααααα·ααααααΆα
ααΆαααΆααααααΆαααΆα
αααΎααααααααααααααΆαααααααααΆαα 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' ααΊααααααα·ααα·αα UnwrappedLineParser.cpp 1635
Fragment 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 ααααΆααα·αα·α
ααααα
αΆααααΊαααααααααΆααα αΎαα α₯α‘αΌααααααΌαααΎαα’αααΈααααα½αα±ααα
αΆααα’αΆααααααα’αΆα
ααααΌαααΆαααααΎαααΆαα½αααΉαααΆαααααΎααααα·αα·α
ααααααααΈαααααΆααααα αΆααααα½ααα
αααα»αα§ααααααα·ααΆααααααΆααααΈ
Fragment 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 αααα αααααααΆαα α αα ααΆααααααα·ααααα·αα αααα‘αααααα·α. ααΌα ααααα αΎααα»α CtorDtorsByPriority ααΉααα·ααααααααΌαααΆααααααα‘αΎαα
Fragment 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;
αα glance ααααΌα ααΆα αΆααααΌα ααΆαα·αααΆαααα α»ααα ααΈαααααα ααΆααΎααα ααΌα ααΆααααα·ααααα·αα ααααα ααΆαααΆααααααααα½ααα ααΈααα α αΎαα’αααα’αΆα αα»αααΆααΆααααΆαααΆααααα ααααααΆαααΆααααααα·ααααααΆααα’ααααΆααααααα
α’ααααα·ααΆαα ααααΆααααααΆααα ααΎαααααΆααα
Lex.setIgnoreColonInIdentifiers(false);
return false;
α αΎαααΆααΆααα·αααΆαα αααααΌαααααα·αα’αΆα αα αααααΆαααα ααααΈααΆααα’αααα αααα»α ααΆαααααΆααααααΌα αααα αααααααΆαα α ααΈααααα·ααααα·αα αααα‘αααααα·α. α αΎαβα₯α‘αΌαβαααβαα βααααΆααβα―αβααααΆαβαααβ ααααα ααΎαβαα βαα·αβαααααααααΆααβααα! αααα ααααΆααΆααΆαα½ααα½ααααααα ααααα ααααααα·αααααα ααΎαα αααα‘αααααα·α?
Fragment 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 αααααααααα‘αααααα·α αα·αααΆαα α»αα αααααααΆ. α αΌαααΎαααααΆααααααααααααα ααααααααααΆα’αα»αααααααα‘ααααααα α¨α
~(getStubAlignment() - 1)
~(8u-1)
0xFFFFFFFF8u
α₯α‘αΌααααααααΆααααΆα’ααα ααα ααα·αααααα ααΆααααααα 64 αααΈαααααα·αααΆαα α»αα αααααααΆα ααΆααααααΆαα αααα’αα»ααααααααα·ααααα·ααΆα DataSize & 0xFFFFFFFF8u ααΆαααααΈαααααΆαααααααααΆααα·αααΈαααΉαααααΌαααΆααααααα‘αΎααα·ααα ααΌαααα ααΆαα αααΎα ααααα·ααααααΆα’αααΈαααα’αααααααααααααα·ααΈα ααααΆααααααα αααα»αααααααααΆααΆααα ααααααΆα DataSize & 0xFFFFFFFFFFFFFF8u α
ααΎααααΈαα½ααα»αααα α»α α’ααααα½αααααααααααα
DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);
α¬α’ααα αΉαα
DataSize &= ~(getStubAlignment() - 1ULL);
Fragment 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;
}
....
}
ααΆααα·αα·α αααααα½αα±ααα αΆααα’αΆααααααααααΈααααααααααααΆαααΆαααααααααααααΌαααααΌαααΆαα αααα α αΎαααααααα½αα ααα½ααα αααα»αααΆααΆαα αΆααααααΎαααααΌαααΆαααααΆααααααΌα ααα»αααααα αααααααα½ααα½ααααα·αααΆαααααΆααα
ααΌαα αααΆαααΆαα αααα»ααααα»αααΈααΈααα½αααααΆαααααΆααααααΌα 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] α’ααα 'ααα α' ααααΌαααΆαα αΆααααΆαα ααα»αααααα·αααααΌαααΆαααααΎααααΆαααααα α»ααααα ααααα’αα»ααααααα Object.cpp α€α’α€
ααααΆαααΆαααΊααααααααΉαααααΈαα»αα ααΆαα½αααααααΌαααΆααααααααΆ:
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
α’ααα ααΈααΈ α’αΆα ααααΎααααΆ 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
ααΎααααΎααΌα ααααα ααΎααααΈααΆαααΆααααα½αα’αααααΈααα α»ααααααα? ααα α·ααααα»αααΆαααααααααααααΎ Code-Review α αΎαααααΎα§ααααααα·ααΆααα·αα·αααα PVS-Studio ααΎααααΈαα·αα·αααααΎαααΌαααααα’αααα±ααααΆααααααΆααα
αα·αααΆαα ααα»α ααΆαα½ααααα»αααΆαααααααααααααααΌααααααααααααααΆαααα α»ααααααααααααααα αααα»αααΉααα»ααααααααΈααααΆααααααΆααα αααα»αα’αααααα
- 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-Studioα
ααΎααααΈααααααααΆαα»αα½ααα α α»ααααα αααααα»αααΌα ααΆ std:: ααα·α ααα > α’αααβαα·αβα’αΆα βααααΆααβααβαααααβ 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] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»αααΊααα 'Passes' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα PassManager.h 546
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'AAs' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα AliasAnalysis.h α£α’α€
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'ααΆαα»' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα DWARFDebugFrame.cpp 519
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'AllEdges' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα CFGMST.h α’α¦α¨
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'VMaps' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα SimpleLoopUnswitch.cpp ααααΆα 2012
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'αααααααααΆ' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα FDRLogBuilder.h α£α
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»αααΊααα 'PendingSubmodules' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα ModuleMap.cpp 810
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Objects' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα DebugMap.cpp α¨α¨
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»αααΊααα 'αα»αααααΆααααα' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-isel-fuzzer.cpp α¦α
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Modifiers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα llvm-stress.cpp α¦α¨α₯
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»αααΊααα 'Operands' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα GlobalISelEmitter.cpp ααααΆα α‘α©α‘α‘
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»α 'Stash' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] ααααα·α αααααααΆαααα αΆααααααΌαααΆααααααααα αα»αααΊααα 'Matchers' ααααα·ααΈααΆααααα 'emplace_back' α ααΆαααα ααααΆαα’αααα αα αΆαααΉαααΎαα‘αΎααααα»αααααΈααΆαααααΈααΎααααα GlobalISelEmitter.cpp 2702
ααα ααααΈααααα·ααααΆα
αααα»αααΆαα ααααΆααααααΆαααα»αα ααα½α 60 α αΎααααααΆαααααααα ααΎααΆααα·ααΆαααΆααααααααααααα§ααααααα·ααΆα PVS-Studio ααααΎααα αααα»α LLVM αααα¬αα? ααΆαβα¬βα αΆαβαααα»αβααΆαα αααααΆαααΆαααΆααααα αα αααααααααα»ααααα»ααααααα ααααΌααααααααΌααααααΆααα’αααααααα ααΆααΆαααααααΆα α¬ααΌααααΈααααα α αΎααααα»αααΆααααααα α α·αααααΆααΆαααααααααααααΌαα α ααΆαα½αααααα
αααα»ααααααΉαααΆα’αααααΆαααααΎαααΆαα½αα±ααα αΆααα’αΆαααααα α αΎαααΉαα ααααΆαααααα§ααααααα·ααΆα PVS-Studio α
α’αααβα’αΆα
βααΆαβααβα§αααααβαα·ααΆαβαα·αβααα½αβααΆαβααααΆααβα
α»α
minesweeper αα
ααααΆαααααα»α ααααΎααΆααα·ααΆααα·αα·ααααααΆαααα αΆαα ααΆααααα½ααα·αα·αααααααααα’αα»ααααααααα½αααΎααααα»ααααααααααΎααααΈααααΎα±ααααααα·ααααΌααα·ααΈααΆαααααααααΆααα·ααΆααα·αα·αααα α αΎα PVS-Studio αα·ααααααΆααααΆααΈαααΌααααααΆαααααα
ααΌαααααΆαααα’αααα»αααΆααααααα’αα»αααΆα αα·αααΆαααΏααΆααααααΌαααααα’ααα!
ααααα·αααΎα’αααα
ααα
αααααααα’ααααααααααΆαα½ααααααα·αααααααα·ααΆαααΆααΆα’ααααααα ααΌαααααΎαααααααΆααααΆαααααααα Andrey Karpov α
ααααα: www.habr.com