áá»áœááºá¯ááºááá¯á·á PVS-Studio ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯á LLVM ááá±á¬áá»ááºá áá±á¬ááºáá¯á¶ážáá¯ááºá
á
áºáá±ážááŒááºážá០ááŸá
áºááŸá
áºáá»á±á¬áºááœá¬ážááŒá®ááŒá
áºáááºá 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 ááœáẠáá±á¬áá«ááŸá¬ááœá±ááŸá¯á¡áá áºáá»á¬áž áá±á«áºáá¬áá²á·áááºá PVS-Studio á ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠááŸááºážááŸááºážáááºážáááºážááŒáááẠáá®ážááŒá¬ážááá¹ááá áºáá¯ááœáẠáááºážááá¯á·ááᯠáá®ážáá±á¬ááºážááá¯ážááŒááẠáá¯á¶ážááŒááºáá²á·áááºá
ááœááºáá²á·áá±á¬ 2 ááŸá áºá áááºááŸááá²á·áá±á¬ áá±á¬áá«ááŸá¬ááœá±ááŸá¯á០áá±á¬áºáá¯ááºáá¬ážáá±á¬ áá»áá¯á·ááœááºážáá»ááºáá»á¬áž
Fragment 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" ááŒáá·áº á¡á ááŒá¯ááŒá±á¬ááºáž ááŸá áºáá»ááºá á áºáá±ážáá¬ážáááºá áá¯áááá á áºáá±ážááŸá¯ááœááºá áá°ááá¯á·ááẠá¡ááŒá¬ážáá áºáá¯áá¯ááᯠáá±ážáá»ááºáá±á¬áºáááºáž áá°ážáá°áá¬ážáá±á¬ á á¬áá¬ážááá¯ááŒááºááẠáá±á·ááœá¬ážááŒáááºá
Fragment 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-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 ááᯠááááºážááŸááºáá áºáá¯ááŸáá·áº ááŸáá¯ááºážááŸááºáá»ááºááŒáááºá á¡ááœáŸááºážááááºáž. áá¯ááºááá¯ááŒááºáááºá¡ááœáẠáá¬ááá®á¡á±á¬áºááá±áá¬áá áºááá¯ááºááœáẠááœááºážá á¥áºáá»á¬ážááá·áºááẠááá¯á¡ááºáááº-
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))
á
áá¬ážáá
ááºá ternary operator ááẠá¡ááœááºá¡áá¹ááá¬ááºáá»á¬ážááŒá®áž áá¯áá¹ááá¡ááŸá¬ážáá»á¬ážááᯠááŸáá¯ážáá±á¬áºáá«áááºá áááºážááᯠá¡ááœááºááááá¬ážáá«á ááœááºážááœááºážááŒáá·áº áá±á¬ááááŒá®ážáá«ááŸáá·áºá áá®á¡ááŒá±á¬ááºážá¡áá¬ááᯠá¡áá±ážá
áááºááŒáá·áºáá²á·áááºá
Fragment N4á N5- Null pointer
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 pointer ááᯠáááºááœáŸááºážáááº- LHS->getAsString().
á¡áááºáá°áá»áŸáá ááºážáááºáá±á¬ááŒá±á¬áá·áº error ááẠerror handler ááœááºááŸááºáá¬ážáá±á¬á¡áá«á€áááºá¡ááœááºáá¯á¶ááŸááºá¡ááŒá±á¡áá±ááŒá áºáááºá Static ááœá²ááŒááºážá áááºááŒá¬áá°áá»á¬ážááẠáááºáá»áŸáá¯á¶ážáááºááŒá áºá á± áááºááŸááºážáá®ááá¯ááºáá±á¬ áá¯ááºá¡á¬ážáá¯á¶ážááᯠá á áºáá±ážáá«á á€áááºááŸá¬ static analysis ááẠá¡ááŒá¬ážáá±á¬ á ááºážáááºááŒááºážááŸáá·áº á¡ááŸá¬ážá¡ááœááºáž áá¬ááœááºááŒááºážáááºážááá¬áá»á¬ážááᯠáááºáá²á·ááá¯á· ááŒáá·áºá áœááºážáá±ážááá·áº á¡ááœááºáá±á¬ááºážáá±á¬ á¥ááá¬áá áºáá¯ááŒá áºáááºá
á¡áá¬ážáá° ááœáŸááºááŒáá»áẠááá¯ááºááœááºááŸá¯ á¡ááŸá¬ážá¡ááœááºáž RHS á¡á±á¬ááºáá±á¬áºááŒáá« áá¯ááºááœáẠááœáá·áºááŒá¯áá¬ážáááº- V522 [CWE-476] null pointer 'RHS' ááᯠááá¯ážáá¬ážááŒááºáž ááŒá áºáá±á«áºáá¬ááá¯ááºáááºá TGParser.cpp áááá
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-á áá°áá®ááá¯ááááá±ážáá»ááº- V522 [CWE-476] null pointer 'ProgClone' ááᯠááá¯ážáá¬ážááŒááºážááŸá¬ ááŒá áºááá¯ááºáá«áááºá Miscompilation.cpp 601
á¡á ááŸá¬ á áááºáá»áá²á· ááœáŸááºááŒáá»áẠProgClone á¡áá¬ááá¹áá¯ááᯠááá¯ááºááá¯ááºááŒááºážá០áááºá á²áááº
BD.setNewProgram(std::move(ProgClone));
á¡ááŸááºáá±á¬á· á¡áᯠProgClone null pointer áá áºáá¯ááŒá áºáááºá ááá¯á·ááŒá±á¬áá·áºá null pointer dereference ááẠá¡á±á¬ááºáá«á¡ááá¯ááºáž ááŒá áºááá·áºáááº-
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
áá«áá±ááá·áº áááºááœá±á·ááŸá¬áá±á¬á· áá®ááá¯ááŒá áºáá¬ááŸá¬ ááá¯ááºáá«áá°ážá ááœááºážáááºááᯠá¡ááŸááºáááẠáá¯ááºáá±á¬ááºááŒááºážáááŸáááŒá±á¬ááºáž áááááŒá¯áá«á
ááœááºááááºáá¬áá²á·á¡á ááŸá¬ ááœá²ááŸá¬ážáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž ááŸááºážáááºážáá¬ážáááº-
MiscompiledFunctions.clear();
ááá¯á·áá±á¬ááºá á€ááœááºááááºáá¬áá¡ááœááºá¡á á¬ážááᯠááœááºážáááºá¡ááŒá±á¡áá±ááœáẠá¡áá¯á¶ážááŒá¯áááº-
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
ááœááºážáááºáá áááºáá±á¬á·áá°ážááá¯áᬠááááá¯á·ááœááºáá«áááºá áá«á bug áá áºáá¯áááºážááŒá áºááŒá®áž áá¯ááºááᯠááœá²ááŒá¬ážá áœá¬áá±ážááá·áºáááºááá¯á· áá»áœááºáá±á¬áºáááºáá«áááºá
á€áá¬áááºááŒá®ážáá±á¬ á¡ááŸá¬ážáá»á¬ážá áá°áá®ááŸá¯ááᯠáá»áœááºá¯ááºááá¯á· ááŒá¯á¶ááœá±á·áá²á·ááá¯á¶ááááºá á¡ááŸá¬ážáá áºáá¯á áá±á¬ááºáá áºáá¯á áá¯á¶ážááœááºáá¬ážááá¯á· :)á
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] null pointer 'Test' ááᯠááá¯ážáá¬ážááŒááºáž ááŒá áºáá±á«áºáá¬ááá¯ááºáááºá Miscompilation.cpp ááá
áá°áá®áá²á·á¡ááŒá±á¡áá±ááŸáááŒááºáááºá á¡á ááá¯ááºážááœáẠá¡áá¬ááá¹áá¯á á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááœá±á·áá»á¬ážááœá¬ážááŒá®ážáá±á¬áẠáááºážááᯠáá¬ááŸáááŒá áºáá²á·áᯠá¡áá¯á¶ážááŒá¯áááºá C++ ááœáẠááŸá¯ááºááŸá¬ážááŸá¯ semantics áá±á«áºáá¬ááŒá®ážáá±á¬áẠáááá¯ááááºáá¯ááºááœáẠá€á¡ááŒá±á¡áá±ááᯠááá¯áááá¯á áááŒá¬ááááŒááºááááºá á¡á²áá«ááŒá±á¬áá·áº áá»áœááºáá±á¬áº C++ áá¬áá¬á áá¬ážááᯠááŸá áºáááºáááºá ááá·áºááŒá±áá±á¬ááºááᯠáá áºáááºááẠáááºážáááºážáá áºáá»á¬áž ááá¯áá»á¬ážáá¬áá«áááºá PVS-Studio ááœá²ááŒááºážá áááºááŒá¬áá°ááẠá¡ááŒá²áááºáž á¡áá¯ááºááŸááááá·áºááẠ:)
Fragment N8- Null pointer
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 pointer 'Type' ááᯠááá¯ážáá¬ážááŒááºáž ááŒá áºáá±á«áºáá¬ááá¯ááºáááºá PrettyFunctionDumper.cpp ááá
error handlers áá»á¬ážá¡ááŒááºá debugging printout function áá»á¬ážááᯠá¡áá»á¬ážá¡á¬ážááŒáá·áº á ááºážáááºáá±á·áááŸááá«á áá«ááá¯á·ááŸá±á·ááŸá¬ áá®ááá¯ááá á¹á áá»áá¯ážááŸááá±ážáááºá á¡ááá¯áá«áá¯ááºáá±á¬ááºáá»ááºááẠáááºážáááŒá¿áá¬áá»á¬ážááá¯ááŒá±ááŸááºážááá·áºá¡á á¬áž áááºážááá¯ááŒááºááá¯ááºážááá·áºá¡áá¯á¶ážááŒá¯áá°ááá¯á á±á¬áá·áºááá¯ááºážáá±áááºá
ááŸááºáááºáá±á¬:
if (Type)
Type->dump(*this);
else
Printer << "<unknown-type>";
Fragment N9- Null pointer
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 pointer 'Ty' ááᯠááá¯ážáá¬ážááŒááºáž ááŒá áºáá±á«áºáá¬ááá¯ááºáááºá ááŸá¬ááœá±ááá¯ááºáá±á¬TableEmitter.cpp 614
á¡áá¬á¡á¬ážáá¯á¶ážá ááŸááºážáááºážááŒááºáá¬ážááŒá®áž ááŸááºážááŒááá¯á·áááá¯áá°ážáááºáá«áááºá
Fragment 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-Studio ááááá±ážáá»ááº-
variable ááᯠáá°á·áá¬áá¬áá° áááºááŸááºáá±ážáá¬ááŸá¬ á¡áá±ážáááŒá®ážáá«áá°ážá á¡áá»á¬ážá á¯ááá±á¬á· áá±ážáá»ááºáá±ááŒáááº-
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 ááááá±ážáá»ááº-
pointer Callee áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá·áºá¡áá»áááºááœáẠá¡á ááœáẠáááºááœáŸááºážáá¬ážáááºá GetTTI.
ááá¯á·áá±á¬ááºááœáẠá€ááœáŸááºááŒáá»ááºááᯠáááºážáá°áá®áá»áŸááŸá¯á¡ááœáẠá á áºáá±ážááá·áºáááºáᯠááœááºáá±á«áºáá¬áááºá 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] nullptr ááᯠáá á áºáá±ážáá® 'CalleeFn' ááœáŸááºááŒáá»ááºááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 1079á 1081á SimplifyLibCalls.cpp 1079
á€áá±áá¬ááœááº-
void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
const Decl *Tmpl, Decl *New,
LateInstantiatedAttrVec *LateAttrs,
LocalInstantiationScope *OuterMostScope) {
....
NamedDecl *ND = dyn_cast<NamedDecl>(New);
CXXRecordDecl *ThisContext =
dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()); // <=
CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(),
ND && ND->isCXXInstanceMember()); // <=
....
}
PVS-Studio ááááá±ážáá»ááº- V595 [CWE-476] nullptr ááᯠáá á áºáá±ážáá® 'ND' ááœáŸááºááŒáá»ááºááᯠá¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 532á 534á SemaTemplateInstantiateDecl.cpp 532
á€áá±áá¬ááœááº-
- V595 [CWE-476] nullptr ááᯠáá á áºáá±ážáá® 'U' ááœáŸááºáá¶ááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 404á 407á 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 ááááá±ážáá»ááº-
áááºážááẠáá»áœááºááœááºážáá»ááºááá¯ááºáá±á¬áºáááºáž áá¯ááºááẠáááºááœááºáá¬ážááá·áºá¡ááá¯ááºáž á¡ááá¡áá»á¡áá¯ááºáá¯ááºáááºá áá«áá±ááá·áº áá®áá±áá¬áᬠáá¶ááááŒá áºá áá¬áá±á¬ááºážáá²á· áá±áá¬áá áºáá¯ááŒá áºááŒá®áž á á áºáá±ážááá¯á· ááá¯á¡ááºáá±áááºááá¯áᬠáááºááŸá¬ážáá«áááºá
variable ááá¯ááŒáá«á áá¯á· á¡ááœáẠ16 ááŸáá·áº áá®áá»áŸáááºá ááá¯á·áá±á¬áẠáááºážááᯠvariable áá áºáá¯á¡ááŒá Ạááá°ááẠá á®á ááºáá¬ážáá±á¬ áá¯ááºáá±ážáá¬ážáá° NImms áááºááá¯áž -
1111111111111111111111111111111111111111111111111111111111100000
ááá¯á·áá±á¬áº áááºááœá±á·ááœáẠááááºáááº-
0000000000000000000000000000000011111111111111111111111111100000
á¡ááŸááºááŸá¬ ááœááºáá»ááºááŸá¯á¡á¬ážáá¯á¶ážááẠ32-bit áááºááŸááºáááá¯ážáá¬ážáá±á¬ á¡áá»áá¯ážá¡á á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŒá áºáá±á«áºáá«áááºá ááá¯ááŸáá¬áá»áŸááºá ဠ32-bit áááºááŸááºáááá¯ážáá¬ážáá±á¬ á¡áá»áá¯ážá¡á á¬ážááá¯á· ááœááºááá¯ááºá áœá¬ áá»á²á·ááœááºáá«áááºá uint64_t. á€ááá á¹á ááœááºá á¡áááºááŸá¬ážáá¯á¶áž bit áá»á¬ážááẠáá¯áááŒá áºáááá·áºáááºá
á€áá²á·ááá¯á·áá±á¬ á¡ááŒá±á¡áá±ááᯠááẠááŒááºááá¯ááºáááºá
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
á¡áá¬ážáá°á¡ááŒá±á¡áá±- V629 [CWE-190] 'Immr << 6' á áá¬ážáááºááᯠá á áºáá±ážáá¯á¶ážáááºááŒáá·áºáá«á 32-bit á¡áá»áá¯ážá¡á á¬ážááá¯á· áá±á¬ááºáááºááœá² ááá¯ážáá»á²á·ááŸá¯ááŒáá·áº 64-bit áááºááá¯ážá áá áºááŒá±á¬ááºážááŒááºážá 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 á¡áááºážá¡á á¬áž EH)" + Name.str()' á áá¬ážáááºááᯠá á áºáá±ážááẠá ááºážá á¬ážáá«á Symbol.cpp áá
- V655 [CWE-480] ááŒáá¯ážáá»á¬ážááᯠáá±á«ááºážá ááºáá¬ážáá±á¬áºáááºáž á¡áá¯á¶ážáááŒá¯áá«á 'áááẠ+ "(ObjC IVar)" + Name.str()' á áá¬ážáááºááᯠá á áºáá±ážááẠá ááºážá á¬ážáá«á Symbol.cpp áá
ááá±á¬áºáá += á¡á±á¬áºááá±áá¬á¡á á¬áž + á¡á±á¬áºááá±áá¬ááᯠá¡áá¯á¶ážááŒá¯áááºá ááááºááŸá¬ á¡áááá¹áá«ááºáááŸááá±á¬ áá®ááá¯ááºážáá»á¬ážááŒá áºáááºá
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 ááŸá¬áááœá±á·áá«á ááŒá±áá¯á¶ááœáẠááŒááºá ááºá¡áá áºáá áºáá¯ááᯠáááºáá®ážááŒá®áž á€ááŒá±áá¯á¶ááŸá ááŒááºá ááºá¡áá±á¡ááœááºááᯠááá¯áá±áá¬ááœáẠáá±ážáá¬ážáááºá áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááŒááºážááŸááááŸá áááááá±ážáá«á á¡ááœáẠááŒááºá ááºá¡áá áºáááá·áºáá® ááá¯á·ááá¯áẠááŒá®ážáá±á¬ááºá
Fragment 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
Fragment 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á LoadStoreVectorizer.cpp 1160
á€áááºááŸá¬ áá¯áá¹ááá¡ááŸá¬ážáá áºáá¯áá«ááŸááááºáá°áá±á¬ á¡ááœááºáá°ážáááºážáá±á¬áá¯ááºááŒá áºáááºá á¡á ááá¯ááºážááŸá¬áá±á¬á· ááŒá±á¬ááºážáá²ááá¯ááºáá«áááºá alignment á¡ááŒá±á¡áá±áá±á«áºáá°áááºá áááºááá¯ážáááºááŸááºáá±ážáááºá ááá¯á·áá±á¬áẠáá¬áááºááŒááºáááºáá¬áá±á¬áºáááºáž ááá¯ááœáẠáááºááá·áºá á áºáá±ážááŸá¯á០áááŸááá² ááŒá áºáá±áááºá
á¡áá¬ážáá° á¡ááŒá±á¡áá±áá»á¬ážááᯠá€áá±áá¬ááœáẠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
- V519 [CWE-563] 'á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯áá»á¬áž' ááááºážááŸááºááẠáááºááá¯ážáá»á¬ážááᯠááŸá áºááŒáááºáááºááá¯áẠáááºááŸááºáá±ážáááºá áá«á á¡ááŸá¬ážáá áºáá¯ááá¯á· ááŒá±á¬áá¬ážáá¬á ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 152á 165á WebAssemblyRegStackify.cpp 165
- V519 [CWE-563] 'ExpectNoDerefChunk' ááááºážááŸááºááẠáááºááá¯ážáá»á¬ážááᯠááŸá áºááŒáááºáááºááá¯áẠáááºááŸááºáá±ážáááºá áá«á á¡ááŸá¬ážáá áºáá¯ááá¯á· ááŒá±á¬áá¬ážáá¬á ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 4970á 4973á SemaType.cpp 4973
Fragment 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 ááááá±ážáá»ááº-
á á áºáá±ážááŒááºážááẠá¡áááá¹áá¬ááºáááŸááá±á ááŒá±á¬ááºážáá²ááá¯ááºáá±á¬ nextByte á¡ááŒá²áááºážáááºááá¯ážáá²á· ááá®áá»áŸáá«áá°ážá 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 á¡áááºááá¯á· á¡áááá¹áá«ááºáááŸááá«áá°ážá ááŸááºáá¯á¶áááºá¡ááŸáẠ> ááááá¯á·áá±á¬áẠfunction ááẠáááºážááá¯ááºáá±á¬ááºááŸá¯ááᯠá¡ááŒá®ážáááºáááºááŒá áºáááºá
IDs 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] áááºááœááºááááá±á¬áá¯ááºááᯠááœá±á·ááŸááá²á·áááºá error ááŸááá±áᬠááŒá áºááá¯ááºáááºá LLParser.cpp 835
á áááºáááºá á¬ážá áá¬á¡ááŒá±á¡áá±á áá®áá±áá¬ááᯠá¡áááºááŒáá·áºáá¡á±á¬ááºá
return ParseTypeIdEntry(SummaryID);
break;
ááááá áºáá»ááºááœááºá á€áá±áá¬ááœáẠerror áááŸááá¯áááºááááºá á¡á±á¬áºááŒáá·áºááᬠáá»áá¯áž á€áá±áá¬ááœáẠá¡ááá¯áá áºáá¯ááŸáá áááºážááᯠááá¯ážááŸááºážá áœá¬ áá»ááºááá¯ááºáááºá ááá¯á·áá±á¬áºá á€áá»áŸáá±á¬ááºáááá¯ážááŸááºážáá«á
ááœá²ááŒááºážá áááºááŒá¬áá°ááẠááá¯ááºážáá»á¬ážáá±á«áºááœáẠááááá±ážáá»ááºáá¯ááºáááº-
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 ááááá±ážáá»ááº-
function ááá¯áááááŒá¯áá«á getStubAlignment returns á¡áá»áá¯ážá¡á á¬áž áááºááŸááºáááá¯áž. function á value 8 ááᯠááŒááºáá±ážáááºááá¯á· áá°áááá¯á· expression áá²á·áááºááá¯ážááᯠááœááºááŒáá·áºáá¡á±á¬ááºá
~(getStubAlignment() - á)
~(8u-1)
0xFFFFFFFF8u
ááᯠááááºážááŸááºááᯠáááááŒá¯áá«á áá±áá¬á¡ááœááºá¡á á¬áž 64-bit áááºááŸááºáááá¯ážáá¬ážáá±á¬ á¡áá»áá¯ážá¡á á¬áž ááŸááááºá DataSize & 0xFFFFFFFF8u áá¯ááºáá±á¬ááºáá»ááºááᯠáá¯ááºáá±á¬ááºáá±á¬á¡áá«á ááŸá¬áá°ááŸá¯á¡ááá·áºááŒáá·áºáá Ạáá¯á¶ážááá·áºááŸá áºáá¯á áá¯á¶ážááᯠáá¯áááá¯á· ááŒááºáááºáááºááŸááºááœá¬ážáááºááŒá áºááŒá±á¬ááºáž ááœá±á·ááŸáááá«áááºá ááŒá áºááá¯ááºáááºááŸá¬á á€áááºááŸá¬ áááá¯ááááºáᬠááá¯áá»ááºááá·áºá¡áᬠááá¯ááºáá±á áá°ááœááºáá»ááºááá¯áááºáᯠáá¶ááááŒá áºáááá«áááº- DataSize & 0xFFFFFFFFFFFFFF8uá
error ááá¯ááŒááºáááºá á€á¡áá¬ááá¯áá±ážááá·áºáááº-
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 ááááá±ážáá»ááº-
á¡áá»áá¯ážá¡á
á¬áž variable áá»á¬ážááᯠááŒáŸá±á¬ááºáá¬ááœáẠá¡áá»á¯á¶ážáááºááŒááºážááᯠááŸá±á¬ááºááŸá¬ážááẠáááá»áá±á¬ á¡áá»áá¯ážá¡á
á¬ážáá¬á
áºááᯠá¡áá¯á¶ážááŒá¯áááºá int. ááá¯á·áá±á¬áº á€áá±áá¬ááœáẠáááá»ááŒááºáá¬ážáá±á¬ á¡áá»áá¯ážá¡á
á¬áž áá¬á
áºáá
áºááẠáá»áŸá¶áá»ááŒááºážááᯠááá¬ááœááºááá¯ááºáá«á ááááŠážá
áœá¬á ááááºážááŸááºáá»á¬ážááᯠááŒáŸá±á¬ááºáá±ážáááºááŒá
áºááŒá®áž ááá¯ááŸáᬠááœá¬ážááŒááºážá 32-bit ááááºááᯠá¡áá»áá¯ážá¡á
á¬ážááá¯á· áá»á²á·ááœááºáááá·áºáááº
Fragment 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;
}
Fragment 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;
function argument ááẠááŒá±á¬ááºážáá²ááœá¬ážáááºá áá«áá«áá²á á€á¡ááŒááºážá¡áá¯á¶ááᯠá¡áá¯á¶ážáááŒá¯áá±á¬á·áá«á ááŒá áºááá¯ááºáááºááŸá¬ á€áá²á·ááá¯á· áá±ážáá¬ážááá·áºáááº-
Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
this->Mode &= Mask;
};
Fragment 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;
Fragment 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] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'Ptr' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 729á 738á TargetTransformInfoImpl.h 738
Variable Ptr áááºážáá°ááŒá áºááá¯ááºáááºá nullptráá»ááºáááºááŸááºááŒáá·áº áááºáá±ááŒáá¬ážááá·áºá¡ááá¯ááºážá
if (Ptr != nullptr)
ááá¯á·áá¬ááœááºá á€ááœáŸááºááŒáá»ááºá¡á±á¬ááºááœáẠááá¬áá á áºáá±ážááŒááºážáááŸááá² ááá¯ážáá¬ážáá¬ážáááº-
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());
áá±á¬ááºááẠá¡áá¬ážáá°ááá á¹á áá áºáá¯ááᯠáá¯á¶ážáááºááŒáá·áºáá¡á±á¬ááºá
llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
bool Stub) {
....
auto *FD = dyn_cast<FunctionDecl>(GD.getDecl());
SmallVector<QualType, 16> ArgTypes;
if (FD) // <=
for (const ParmVarDecl *Parm : FD->parameters())
ArgTypes.push_back(Parm->getType());
CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); // <=
....
}
PVS-Studio ááááá±ážáá»ááº- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'FD' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáááº- 3228á 3231á CGDebugInfo.cpp 3231
ááá¯ááºážáá¯ááºááᯠá¡á¬áá¯á¶á áá¯ááºáá«á FD. ááŒá¿áá¬ááᯠááŸááºážááŸááºážáááºážáááºážááŒááºáááŒá®áž á¡áá°ážááŸááºážááŒáááºáááá¯á¡ááºáá«á
áá±á¬ááºáááº-
static void computePolynomialFromPointer(Value &Ptr, Polynomial &Result,
Value *&BasePtr,
const DataLayout &DL) {
PointerType *PtrTy = dyn_cast<PointerType>(Ptr.getType());
if (!PtrTy) { // <=
Result = Polynomial();
BasePtr = nullptr;
}
unsigned PointerBits =
DL.getIndexSizeInBits(PtrTy->getPointerAddressSpace()); // <=
....
}
PVS-Studio ááááá±ážáá»ááº- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'PtrTy' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 960á 965á InterleavedLoadCombinePass.cpp 965
áá®ááá¯á¡ááŸá¬ážááœá±ááá± ááá¯áá·áºááá¯ááºááᯠáááºááá¯áá¬ááœááºááá²á Code-Review ááᯠááá¯ááá¯á¡á¬áá¯á¶á áá¯ááºááŒá®áž ááá·áºáá¯ááºááᯠáá¯á¶ááŸááºá á áºáá±ážááẠPVS-Studio static analyzer ááᯠá¡áá¯á¶ážááŒá¯áá«á
á€á¡áá»áá¯ážá¡á á¬ážá á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŒáá·áº á¡ááŒá¬ážáá¯ááºá¡ááá¯ááºážá¡á áá»á¬ážááᯠááá¯ážáá¬ážááẠá¡ááŒá±á¬ááºážáááŸááá«á áá±á¬ááºážáá«ážááœáẠááááá±ážáá»ááºáá»á¬ážá á¬áááºážááá¯áᬠáá»áœááºá¯ááºáá»ááºáá¬ážáá«áááºá
- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'Expr' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 1049á 1078á DebugInfoMetadata.cpp 1078
- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'PI' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 733, 753á LegacyPassManager.cpp 753
- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'StatepointCall' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 4371á 4379á Verifier.cpp 4379
- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'RV' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 2263, 2268. TGParser.cpp 2268
- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'CalleeFn' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 1081á 1096á SimplifyLibCalls.cpp 1096
- V1004 [CWE-476] nullptr ááᯠá á áºáá±ážááŒá®ážáá±á¬áẠ'TC' ááœáŸááºááŒáá»ááºááᯠáá±ážáááºážá áœá¬ á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯ááºážáá»á¬ážááᯠá á áºáá±ážáá«- 1819á 1824á Driver.cpp 1824
Fragment 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 á¡áá áº)since it compiles: method emplace_back ááŒááºá ááºáá áºáá¯ááᯠáááºážá á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá០ááá¯ááºááá¯ááºáááºáá±á¬ááºááŒá®áž ááá¯á·ááŒá±á¬áá·áº ááŸááºážáááºážááŒááºáá¬ážáá±á¬ áááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
ááá¯á¶ááŒá¯á¶áá°ážá vector ááẠááŒáá·áºáá±áá«á memory ááᯠááŒááºáááºááœá²áá±áá±ážáá«áááºá áááºááá¯áá®áá±áá¬áá»áá¬ážááŒááºáž áá¯ááºáá±á¬ááºáá»ááºááẠáá»ááºááœá¬ážááá¯ááºááŒá®áž ááŒáœááºážáá»ááºáá áºáá¯á¡á¬áž ááŒá¯ááºáá»ááá¯ááºáááºá std::bad_alloc. á€ááá á¹á ááœááºá ááœáŸááºááŒáá»ááºáá»á±á¬ááºáá¯á¶ážááœá¬ážáááºááŒá áºááŒá®áž áááºáá®ážáá¬ážááá·áºá¡áá¬ááá¹áá¯ááᯠáááºáá±á¬á·á០áá»ááºáááºááá¯ááºáá«á
áá¯á¶ááŒá¯á¶áá±á¬ááŒá±ááŸááºážáá»ááºáááºáá®ážáááºááŒá áºáááºá unique_ptrvector ááẠmemory áá±áá¬áá»áá¬ážáááºáááŒáá¯ážá á¬ážáá® pointer ááá¯ááá¯ááºááá¯ááºáááá·áºáááº-
xxx.push_back(std::unique_ptr<X>(new X))
C++ 14 ááŸá áááºá áááºááẠ'std::make_unique': ááá¯áá¯á¶ážááá¯ááºáááºá
xxx.push_back(std::make_unique<X>())
á€áá»áá¯á·ááœááºážáá»ááºá¡áá»áá¯ážá¡á
á¬ážááẠLLVM á¡ááœáẠá¡áá±ážáááŒá®ážáá«á Memory ááᯠááœá²áá±ááá±ážááá¯ááºáá«á compiler ááẠáááºááá·áºááœá¬ážáááºááŒá
áºáááºá ááá¯á·áá±á¬áº á¡áá¯á¶ážáá»ááŸá¯á¡ááœáẠááŸááºáá»á¬ážáááºá
ááá¯á·ááŒá±á¬áá·áºá á€áá¯ááºááẠLLVM á¡ááœáẠáááºááœá±á·áá»áá±á¬ ááŒáááºážááŒá±á¬ááºááŸá¯áá áºáá¯ááá¯ááºáá±á¬áºáááºážá á€á¡ááŸá¬ážáá¯á¶á á¶á¡ááŒá±á¬ááºážááŒá±á¬ááẠá¡áá¯á¶ážáááºááŒá±á¬ááºážááŸáá·áº PVS-Studio ááœá²ááŒááºážá áááºááŒá¬áá°ááẠáááºážááá¯ááááŸáááá¯ááºá á±ááẠáááºáá°áá²á·ááŒá±á¬ááºáž áá»áœááºá¯ááºááœá±á·ááŸááá²á·áááºá
á€á¡áá»áá¯ážá¡á á¬ážá á¡ááŒá¬ážááááá±ážáá»ááºáá»á¬áž-
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'Passes' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá PassManager.h á áá
- V1023 [CWE-460] 'emplace_back' áááºážáááºážááŒáá·áº ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'AAs' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá AliasAnalysis.h ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááá·áºááœááºážááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá DWARFDebugFrame.cpp á áá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'AllEdges' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá CFGMST.h ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'VMaps' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá SimpleLoopUnswitch.cpp 2012
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááŸááºáááºážáá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá FDRLogBuilder.h áá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'PendingSubmodules' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá ModuleMap.cpp 810
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'Objects' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá DebugMap.cpp áá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááá¬áá»á°áá¬áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-isel-fuzzer.cpp áá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'ááœááºážáá¶ááŸá¯áá»á¬áž' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá llvm-stress.cpp ááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'Operands' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'Stash' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá GlobalISelEmitter.cpp áááá
- V1023 [CWE-460] ááá¯ááºááŸááºáááŸááá±á¬ ááœáŸááºááŒáá»ááºááᯠ'emplace_back' áááºážáááºážááŒáá·áº 'Matchers' ááœááºááááºáá¬ááá¯á· áá±á«ááºážááá·áºáááºá ááŒáœááºážáá»ááºáá áºáá¯á¡ááœáẠááŸááºáá¬ááºááá¯á ááá·áºááŸá¯ ááŒá áºáá±á«áºáááá·áºáááºá GlobalISelEmitter.cpp 2702
áá±á¬ááºáá»ááº
á á¯á á¯áá±á«ááºážááááá±ážáá»áẠ60 ááá¯áá¯ááºááŒááºááŒá®ážáá±á¬ááºáááºááá·áºáá²á·áááºá PVS-Studio ááœá²ááŒááºážá áááºááŒá¬áá°ááẠLLVM ááœáẠááœá±á·ááŸáááá·áº á¡ááŒá¬ážáá»áá¯á·ááœááºážáá»ááºáá»á¬áž ááŸááá«ááá¬ážá áá¯ááºáá²á·á áá«áá±ááá·áº áá»áœááºáá±á¬áº áá±á¬ááºážáá«ážá¡ááœáẠáá¯ááºá¡ááá¯ááºážá¡á ááœá±ááᯠáá±ážáá±áá»ááẠááá±á á±á¬ááºáž áá«ááŸááá¯áẠááá±á¬áẠáá±á¬ááºáá»áá±ááŒá®á áá áºáá±á·áá±á· áá¯ááºážáá±á«áºááá¯á· á¡áá»áááºáá±á¬ááºááŒá®ááá¯á· áá¯á¶ážááŒááºááá¯ááºáááºá
áááºá áááºáááºá á¬ážá áá¬áá±á¬ááºážááŒá®áž PVS-Studio ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠá ááºážááŒáá·áºáá»ááºáááá·áºáááºááá¯á· áá»áŸá±á¬áºááá·áºáá«áááºá
ááœá²ááŒááºážá
áááºááŒá¬áá°á¡á¬áž áá±á«ááºážáá¯ááºáá¯ááºááŒá®áž ááá¯ááºážá
áœá±áá«áá±á¬á·ááᯠááá°ááá¯ááºáá«áááºá
á¡áá±ážááŒá®ážáá¯á¶ážááá±á¬á· static analysis ááᯠáá¯á¶ááŸááºáá¯á¶ážáá«á áá áºááŒáááºá á áºáá±ážááŸá¯áá»á¬ážáááºááŒáááºáá±á¬ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ áááºážá áá áºááᯠáá°ááŒáá¯ááºáá»á¬ážáá¬á á±áááºá¡ááœáẠáá»áœááºá¯ááºááá¯á·á០áá¯ááºáá±á¬ááºáá²á·ááŒááºážááŒá áºááŒá®áž PVS-Studio ááẠáá¯á¶ááŸááºá¡ááŒá±á¡áá±ááá¯ááºáá±á
ááá·áºáá¯ááºá á¡áááºá¡ááœá±ážááŸáá·áº áá¯á¶ááŒááºá áááºáá»áááŸá¯ááᯠááá¯ážáááºá á±ááŒááºážááŒáá·áº áá¶áá±á¬ááºážáá«á á±á
á€áá±á¬ááºážáá«ážááᯠá¡ááºá¹áááááºá
áá¬ážááŒá±á¬ ááááááºááŸáá·áº áá»áŸáá±ááá¯áá«áá áá¬áá¬ááŒááºááá·áºááº- Andrey Karpov ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com