ืืขืจ ืืื ืฆืืืื ืืึธืจ ืืึธืื ืืืจืืืขืืื ืืขื ืืื ื ืื ืืขืฆืืข ืงืึธื ืืฉืขืง ืคืื ืื LLVM ืคึผืจืืืขืงื ืืื ืืื ืืืขืจ PVS-ืกืืืืืึธ ืึทื ืึทืืืืขืจ. ืืึธืืืจ ืืึทืื ืืืืขืจ ืึทื ืื PVS-Studio ืึทื ืึทืืืืขืจ ืืื ื ืึธื ืึท ืืืืื ื ืืขืฆืืึทื ืฆื ืืืขื ืืืคืืฆืืจื ืขืจืจืึธืจืก ืืื ืคึผืึธืืขื ืฆืืขื ืืืึทืื ืขืจืึทืืืืืืื. ืฆื ืืึธื ืืึธืก, ืืืจ ืืืขืื ืงืึธื ืืจืึธืืืจื ืืื ืืขืคึฟืื ืขื ื ืืึทืข ืขืจืจืึธืจืก ืืื ืื LLVM 8.0.0 ืืขืืืื ื.
ืึทืจืืืงื ืฆื ืืืื ืืขืฉืจืืื
ืฆื ืืืื ืขืจืืขื, ืืื ืืื ื ืืฉื ืืืขืื ืฆื ืฉืจืืึทืื ืืขื ืึทืจืืืงื. ืขืก ืืื ื ืืฉื ืืฉืืงืึทืืืข ืฆื ืฉืจืืึทืื ืืืขืื ืึท ืคึผืจืืืขืงื ืืืึธืก ืืืจ ืืึธืื ืฉืืื ืึธืคึผืืขืฉืืขืื ืขืืืขืืข ืืึธื (
ืืขืืขืจ ืืึธื ืึท ื ืืึทืข ืืืขืจืกืืข ืคืื โโLLVM ืืื ืืืคืจืืื ืึธืืขืจ ืืขืจืืืึทื ืืืงื
ืงืืง, ืื ื ืืึทืข ืืืขืจืกืืข ืคืื โโโโClang Static Analyzer ืืื ืืขืืขืจื ื ืฆื ืืขืคึฟืื ืขื ื ืืึทืข ืขืจืจืึธืจืก! ืขืก ืืืื ื ืฆื ืืืจ ืึทื ืื ืฉืืืืืช ืคืื ื ืืฆื PVS-Studio ืืื ืืืงืจืืกืื ื. ืงืืึทื ื ืืขืคืื ื ืืขืจ ืขืจืจืึธืจืก ืืื ืคืจืืขืจ ืืื ืืึทืคึผื ืืื ืืื ืื ืงืืืคึผืึทืืืืึทืืื ืคืื PVS-Studio. ืืืึธืก ืืึธื ืืืจ ืืจืึทืืื ืืืขืื ืืขื?
ืืืืฃ ืืขื ืืืื ืืื ืฉืืขื ืืืง ืขื ืืคึฟืขืจื ืขืคึผืขืก ืืื:
ืืืจ ืืืฆื ืืืื ื ืืฉื ืืืืืืง! ืืืจ ืืึธืื ืืืืืืืืง ืืืคึผืจืืืื ืื ืงืืืคึผืึทืืืืึทืืื ืคืื ืื PVS-Studio ืึทื ืึทืืืืขืจ. ืึทืืื ืืึธื ื ืื ืืึธืจื, ืืืจ ืคืึธืจืืขืฆื ืฆื ืคืืจื ืืื ืคืจืืขืจ.
ืฆืื ืืึทืืืืขืจื, ืืึธืก ืืื ืึท ืฉืืขืื ืขื ืืคืขืจ. ื ืืฉืื ืงืืื ืืืืืืช ืืื ืืขื. ืืื ืืขืจืคึฟืึทืจ ืฉืจืฒึทื ืืื ืืืฆื ืืขื ืึทืจืืืงื. ืึทืืื, ืื LLVM ืคึผืจืืืขืงื ืืื ืืืืืขืจ ืึธืคึผืืขืฉืืขืื ืืื ืึท ืคืึทืจืฉืืืื ืงืืึทื ืคืื ืขืจืจืึธืจืก ืืขื ืขื ืืขืคึฟืื ืขื ืืื ืขืก. ืืื ืืืขื ืืืฆื ืืขืืึธื ืกืืจืืจื ืื ืืืึธืก ืืขื ืขื ืืขืืืขื ืืฉืืงืึทืืืข ืฆื ืืืจ. ืงืืึทื ื ืกืืึทืืืง ืึทื ืึทืืืืขืจ ืงืขื ื ืืฉื ืืขืคึฟืื ืขื ืื ืขืจืจืึธืจืก (ืึธืืขืจ ืขืก ืืื ืืึธืจ ืืืืึทืงืืืขื ืฆื ืืึธื ืืึธืก ืืื ืืืื ืืืืฃ). ืืืขืจ ืืืจ ืงืขื ืขื. ืืขืจืฆื, ืืื ืืขืคึฟืื ืขื ืืื ืืขืฉืจืืื ืึทืืข ืื ืขืจืจืึธืจืก ืืื ืืืื ืึธืืื ื.
ืืืขืจ ืฉืจืืืื ืืขื ืืจืืืงื ืืื ืืขืืืืขืจื ืขืืืืืข ืืืืื. ืืื ื ืึธืจ ืงืขื ื ืืฉื ืืจืขื ืืขื ืืื ืฆื ืฉืืขืื ืึทืืข ืืขื ืืื ืืขืงืกื :).
ืืืจื ืืขื ืืืขื, ืืืื ืืืจ ืืขื ื ืืื ืืขืจืขืกืืจื ืืื ืืืึธืก ืืขืงื ืึทืืึทืืืฉืื ืืขื ืขื ืืขื ืืฆื ืืื ืื PVS-Studio ืึทื ืึทืืืืขืจ ืฆื ืืืขื ืืืคืืฆืืจื ืขืจืจืึธืจืก ืืื ืคึผืึธืืขื ืฆืืขื ืืืึทืื ืขืจืึทืืืืืืื, ืืื ืคึฟืึธืจืฉืืึธืื ืืืจ ืืึทืงืืืขื ืืึทืงืึทื ื ืืื ืืขื
ื ืื ืืื ืึทืื ืืืึทืื ืึธืกืืืงืก
ืืื ืฉืืื ืืืืขืจืงื, ืืื ืืืขืื ืฆืืืื ืืึธืจ ืฆืืจืืง ืื LLVM ืคึผืจืืืขืงื ืืื ืืืืืขืจ ืึธืคึผืืขืฉืืขืื, ืืื ืื ืืขืคึฟืื ืขื ืขืจืจืึธืจืก ืืขื ืขื ืงืขืจืขืงืืึทื. ืืืฆื ืืขืจ ืึทืจืืืงื ืืืขื ืคืึธืจืฉืืขืื ืึท ื ืืึทืข ืคึผืขืงื ืคืื ืขืจืจืึธืจืก. ืคืืจืืืืก ืืขื ืขื ื ืืึท ืืึทืื ืืขืคึฟืื ืขื? ืขืก ืืขื ืขื 3 ืกืืืืช ืคึฟืึทืจ ืืขื:
- ืื LLVM ืคึผืจืืืขืงื ืืื ืืืืึทืืืืื ื, ืืฉืึทื ืืื ื ืึทืื ืงืึธื ืืื ืึทืืื ื ื ืืึท ืงืึธื. ืืขืืืืื ืืืขื, ืขืก ืืขื ืขื ื ืืึทืข ืขืจืจืึธืจืก ืืื ืื ืืึทืืึทืคืืื ืืื ืืขืฉืจืืื ืงืึธื. ืืึธืก ืงืืืจ ืืขืืึทื ืกืืจืืืฅ ืึทื ืกืืึทืืืง ืึทื ืึทืืืกืืก ืืึธื ืืืื ืืขืืืืื ื ืงืขืกืืืืขืจ ืืื ื ืืฉื ืืืื ืืึธื. ืืื ืืืขืจ ืึทืจืืืงืืขื ืืืืึทืื ืืื ืื ืงืืืคึผืึทืืืืึทืืื ืคืื ืื PVS-Studio ืึทื ืึทืืืืขืจ, ืึธืืขืจ ืืึธืก ืืื ืืึธืจื ืืฉื ืฆื ืืึธื ืืื ืืืคึผืจืืืืื ื ืงืึธื ืงืืืึทืืืืขื ืืื ืจืืืืกืื ื ืื ืงืึธืก ืคืื ืคืืงืกืืจ ืขืจืจืึธืจืก. ื ืืฆื ืึท ืกืืึทืืืง ืงืึธื ืึทื ืึทืืืืขืจ ืงืขืกืืืืขืจ!
- ืืืจ ืืขื ืขื ืคืืื ืึทืืืืืื ื ืืื ืืืคึผืจืืืืื ื ืืืืืกืืื ื ืืืึทืื ืึธืกืืืงืก. ืืขืจืืืขืจ, ืืขืจ ืึทื ืึทืืืืขืจ ืงืขื ืขื ืืืขื ืืืคืืฆืืจื ืขืจืจืึธืจืก ืึทื ืขืก ืืื ื ืืฉื ืืืืขืจืงื ืืขืฉืึทืก ืคืจืืึทืขืจืืืง ืกืงืึทื ื.
- ื ืื ืืืึทืื ืึธืกืืืงืก ืืึธืื ืืจืืืก ืืื PVS-Studio ืืืึธืก ืืื ื ืืฉื ืขืงืกืืกืืืจื 2 ืืึธืจ ืฆืืจืืง. ืืื ืืึทืฉืืึธืกื ืฆื ืืืืืคึผืื ืงื ืืื ืืื ืึท ืืึทืืื ืืขืจ ืึธืคึผืืืืืื ื ืฆื ืงืืืจ ืืืืึทืื ืื ืึทื ืืืืืงืืื ื ืคืื PVS-Studio.
ืืกืจืื ืืช ืืืืขื ืึทืคืืื ืืืจื ืืืึทืื ืึธืกืืืงืก ืืืึธืก ืืื ืืขืืืขื 2 ืืึธืจ ืฆืืจืืง
ืคืจืึทืืืขื ื N1: ืงืึธืคึผื-ืคึผืึทืกืืข
static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
if (Name == "addcarryx.u32" || // Added in 8.0
....
Name == "avx512.mask.cvtps2pd.128" || // Added in 7.0
Name == "avx512.mask.cvtps2pd.256" || // Added in 7.0
Name == "avx512.cvtusi2sd" || // Added in 7.0
Name.startswith("avx512.mask.permvar.") || // Added in 7.0 // <=
Name.startswith("avx512.mask.permvar.") || // Added in 7.0 // <=
Name == "sse2.pmulu.dq" || // Added in 7.0
Name == "sse41.pmuldq" || // Added in 7.0
Name == "avx2.pmulu.dq" || // Added in 7.0
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืขืก ืืื ืืึธืคึผื ืึธืคึผืืขืฉืืขืื ืึทื ืืขืจ ื ืึธืืขื ืืืืื ืืื ืื ืกืืืกืืจืื ื "ืึทืืืงืก512.ืืึทืกืง.ืคึผืขืจืืืืึทืจ.". ืืฒึทื ืฆืืืืืื ืืฉืขืง ืืึธืื ืืื ืืึธื ืืขืืืึธืื ืฉืจืฒึทืื ืขืคึผืขืก ืึทื ืืขืจืฉ, ืึธืืขืจ ืืึธืื ืคึฟืึทืจืืขืกื ืฆื ืคึฟืึทืจืจืืืื ืืขื ื ืึธืืืึทืื ืืขืงืกื.
ืคืจืึทืืืขื ื 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.
ืคืจืึทืืืขื ื N3: ืฆืขืืืฉืื ื ืืื ืึธืคึผืขืจืึทืืึธืจ ืคึผืจืืืืึทื ืก
int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
....
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian() ? 1 : 0)
return 0;
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืืื ืืืื ืืืื ืื ื, ืืึธืก ืืื ืึท ืืืืขืจ ืฉืืื ืืขืืช. ืืึธ, ืืื ืืืืกื ืืื ืืึธืื ืืึธืื ืข ืืขืืื ืงืขื ืืืขืื ืฉืืื ืงืืื :).
ืืืฆื, ืืืื ืฆื
(ISD == ISD::EXTRACT_VECTOR_ELT && (Index == ST->isLittleEndian())) ? 1 : 0
ืคึฟืื ืึท ืคึผืจืึทืงืืืฉ ืคืื ื ืคืื ืืืื ืื ื, ืึทืืึท ืึท ืฆืืฉืืึทื ื ืืื ื ืืฉื ืืื ืขื, ืืืืึทื ืขืก ืงืขื ืขื ืืืื ืจืืืืกื ืฆื:
(ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian())
ืืึธืก ืืื ืึท ืงืืึธืจ ืืขืืช. ืจืืึฟ ืืกืชึผืื, ืืื ืืขืืืืื ืฆื ืคืึทืจืืืืึทืื 0/1 ืืื ืึท ืืืึทืืขืืืืืง ืื ืืขืงืก. ืฆื ืคืึทืจืจืืืื ืืขื ืงืึธื ืืืจ ืืึทืจืคึฟื ืฆื ืืืืื ืงืืึทืืขืจื ืึทืจืื ืื ืืขืจื ืขืจื ืึธืคึผืขืจืึทืืึธืจ:
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))
ืืืจื ืืขื ืืืขื, ืื ืืขืจื ืขืจื ืึธืคึผืขืจืึทืืึธืจ ืืื ืืืืขืจ ืืขืคืขืจืืขื ืืื ืคึผืจืึทืืืึธืืงืก ืืึทืืืฉืืงืึทื ืขืจืจืึธืจืก. ืืืื ืืืืขืจ ืคืืจืืืืืื ืืขืจืืื ืืื ืืืื ื ืืฉื ืืฉืขืื ืข ืืื ืงืืึทืืขืจื. ืืื ืืขืงืืงื ืืืืฃ ืืขื ืืขืืข ืืื ืืขืจ ืืขืืึทื
ืคืจืึทืืืขื ื N4, N5: ื ืึทื ืืืึทืื
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 ืืื ื ืื, ืืืจืฃ ืืขื ืืจืืืกืืขืื ื ืืืืจืขื ืื ื. ืึธืืขืจ, ืึทื ืฉืืึธื, ืืขืจ ืืขืืืืงืขืจ ื ืึทื ืืืึทืื ืืืขื ืืืื ืืขืจืคืขืจืึทื ืกื: 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-Studio ืืืืจืขื ืื ื: V522 [CWE-476] ืื ืจืขืคืขืจืขื ืกืื ื ืคืื ืื ื ืึทื ืืืึทืื 'ืคึผืจืึธืืงืืึธื ืข' ืงืขื ืคึผืึทืกืืจื. Miscompilation.cpp 601
ืืื ืื ืึธื ืืืื ืึท ืงืืื ืืืึทืื ืคึผืจืึธืืงืืึธื ืข ืืขืจื ืืืืฃ ืฆื ืคืึทืจืืึธืื ืืขื ืืืืคืขืฅ:
BD.setNewProgram(std::move(ProgClone));
ืืื ืคืึทืงื, ืืืฆื ืคึผืจืึธืืงืืึธื ืข ืืื ืึท ื ืึทื ืืืึทืื. ืืขืจืืืขืจ, ืึท ื ืึทื ืืืึทืื ืืขืจืืืคืขืจ ืืึธื ืคึผืึทืกืืจื ืคึผืื ืงื ืืื ืื:
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
ืึธืืขืจ, ืืื ืคืึทืงื, ืืึธืก ืืืขื ื ืืฉื ืคึผืึทืกืืจื! ืืึทืืขืจืงืื ื ืึทื ืื ืฉืืืืฃ ืืื ื ืืฉื ืึทืงืฉืื ืขืงืกืึทืงืืืืึทื.
ืืื ืื ืึธื ืืืื ืคืื ืืขื ืงืึทื ืืืื ืขืจ ืืืกืงืึธืืคึผืืืขื ืคืึทื ืืงืฉืึทื ื ืงืืึธืจ:
MiscompiledFunctions.clear();
ืืขืจื ืึธื, ืื ืืจืืืก ืคืื ืืขื ืงืึทื ืืืื ืขืจ ืืื ืืขื ืืฆื ืืื ืื ืฉืืืืฃ ืฆืืฉืืึทื ื:
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
ืขืก ืืื ืืจืื ื ืฆื ืืขื ืึทื ืื ืฉืืืืฃ ืืื ื ืืฉื ืึธื ืืืืื. ืืื ืืจืึทืืื ืืึธืก ืืื ืืืื ืึท ืืฉืืง ืืื ืื ืงืึธื ืืึธื ืืืื ืืขืฉืจืืื ืึทื ืืขืจืฉ.
ืขืก ืืืื ื ืึทื ืืืจ ืืึธืื ืืขืคึผืืึธื ืืขืจื ืึทื ืืึทืจืืื ืคึผืึทืจืืืขื ืคืื ืขืจืจืึธืจืก! ืืืื ืืจืืึทื ืืึทืกืงืก ืื ืืขืจื :).
ืคืจืึทืืืขื ื N7: ื ืืฆื ืื ืืืึทืื ื ืึธื ืืึธืืืื ื
static Expected<bool> TestOptimizer(BugDriver &BD, std::unique_ptr<Module> Test,
std::unique_ptr<Module> Safe) {
outs() << " Optimizing functions being tested: ";
std::unique_ptr<Module> Optimized =
BD.runPassesOn(Test.get(), BD.getPassesToRun());
if (!Optimized) {
errs() << " Error running this sequence of passes"
<< " on the input program!n";
BD.setNewProgram(std::move(Test)); // <=
BD.EmitProgressBitcode(*Test, "pass-error", false); // <=
if (Error E = BD.debugOptimizerCrash())
return std::move(E);
return false;
}
....
}
PVS-Studio ืืืืจืขื ืื ื: V522 [CWE-476] ืื ืจืขืคืขืจืขื ืกืื ื ืคืื ืื ื ืึทื ืืืึทืื 'ืืขืกื' ืงืขื ืคึผืึทืกืืจื. Miscompilation.cpp 709
ืืขืจ ืืขืืืืงืขืจ ืกืืืืึทืฆืืข ืืืืืขืจ. ืืื ืขืจืฉืืขืจ, ืื ืืื ืืึทืื ืคืื ืื ืืืืคืขืฅ ืืื ืืจืืืขืจืืขืคืืจื, ืืื ืืขืืึธืื ืขืก ืืื ืืขื ืืฆื ืืื ืืืื ืืึธืจื ืืฉื ืืขืืจืืคื. ืืื ืืขื ืืขื ืกืืืืึทืฆืืข ืืขืจ ืืื ืืขืจ ืึธืคื ืืื ืคึผืจืึธืืจืึทื ืงืึธื ื ืึธื ืืึทืืืขืืื ื ืกืขืืึทื ืืืงืก ืืจืืืก ืืื C ++. ืืึธืก ืืื ืืืึธืก ืืื ืืืืข ืื C ++ ืฉืคึผืจืึทื! ืขืก ืืขื ืขื ืืขืจ ืืื ืืขืจ ื ืืึทืข ืืืขืื ืฆื ืืจืืืขื ืืืื ืคืืก ืึทืืืขืง. ืื PVS-Studio ืึทื ืึทืืืืขืจ ืืืขื ืฉืืขื ืืืง ืืึธืื ืึทืจืืขื :).
ืคืจืึทืืืขื ื N8: ื ืึทื ืืืึทืื
void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol) {
uint32_t TypeId = Symbol.getTypeId();
auto Type = Symbol.getSession().getSymbolById(TypeId);
if (Type)
Printer << "<unknown-type>";
else
Type->dump(*this);
}
PVS-Studio ืืืืจืขื ืื ื: V522 [CWE-476] ืื ืจืขืคืขืจืขื ืกืื ื ืคืื ืื ื ืึทื ืืืึทืื 'ืืืคึผ' ืงืขื ืคึผืึทืกืืจื. PrettyFunctionDumper.cpp 233
ืืื ืึทืืืฉืึทื ืฆื ืืขืืช ืืึทื ืืืขืจืก, ืืืืึทืืื ื ืคึผืจืื ืืึทืื ืคืึทื ืืงืฉืึทื ื ืืขื ืขื ืืืืฉืึทืืืึทืื ื ืืฉื ืืขืกืืขื. ืืืจ ืืึธืื ืคึผืื ืงื ืึทืืึท ืคืึทื ืคึฟืึทืจ ืืื ืื. ืื ืคึฟืื ืงืฆืืข ืืื ืืืืจืื ืคึฟืึทืจ ืืขืจ ืืึทื ืืฆืขืจ, ืืืึธืก, ืึทื ืฉืืึธื ืคืื ืกืึทืืืืื ื ืืืื ืคึผืจืึธืืืขืืก, ืืืขื ืืืื ืืขืฆืืืื ืืขื ืฆื ืคืึทืจืจืืืื ืขืก.
ืจืืืืื:
if (Type)
Type->dump(*this);
else
Printer << "<unknown-type>";
ืคืจืึทืืืขื ื N9: ื ืึทื ืืืึทืื
void SearchableTableEmitter::collectTableEntries(
GenericTable &Table, const std::vector<Record *> &Items) {
....
RecTy *Ty = resolveTypes(Field.RecType, TI->getType());
if (!Ty) // <=
PrintFatalError(Twine("Field '") + Field.Name + "' of table '" +
Table.Name + "' has incompatible type: " +
Ty->getAsString() + " vs. " + // <=
TI->getType()->getAsString());
....
}
PVS-Studio ืืืืจืขื ืื ื: V522 [CWE-476] ืื ืจืขืคืขืจืขื ืกืื ื ืคืื ืื ื ืึทื ืืืึทืื 'ืื' ืงืขื ืคึผืึทืกืืจื. 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 ืืืืจืขื ืื ื:
ืขืก ืืื ืึท ืืืืขืจ ืกืึทืกืคึผืืฉืึทืก ืึธืคึผืขืจืึทืืึธืจ ืืื ืื ืึธื ืืืื ืืจืขืื. ืืืกื ืคืืจืืขืกื ืื ืขืคืขืก ืื ืืขืจืฉ ืฆื ืฉืจืืืื?
ืคืจืึทืืืขื ื N12: ืงืึธื ืืจืึธืืืจืื ื ืึท ืืืึทืื ื ืึธื ืืขืจืขืคืขืจืขื ืกืื ื
InlineCost AMDGPUInliner::getInlineCost(CallSite CS) {
Function *Callee = CS.getCalledFunction();
Function *Caller = CS.getCaller();
TargetTransformInfo &TTI = TTIWP->getTTI(*Callee);
if (!Callee || Callee->isDeclaration())
return llvm::InlineCost::getNever("undefined callee");
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืืืึทืื ืงืึทืื ืืื ืื ืึธื ืืืื ืืื ืืขืจืขืคืขืจืึทื ืกื ืืื ืืขืจ ืฆืืึทื ืื ืคึฟืื ืงืฆืืข ืืื ืืขืจืืคื getTTI.
ืืื ืืขืจื ืึธื ืงืืื ืืืืก, ืึทื ืืขื ืืึทืจืฃ ืงืึธื ืืจืึธืืืจื ืืขื ืึธื ืืืฒึทื ืืืืฃ ืืืืืืงืืื nullptr:
if (!Callee || Callee->isDeclaration())
ืืืขืจ ืก'ืืื ืฆื ืฉืคืขื...
ืคืจืึทืืืขื ื N13 - N...: ืงืึธื ืืจืึธืืืจืื ื ืึท ืืืึทืื ื ืึธื ืืขืจืขืคืขืจืขื ืกืื ื
ืื ืกืืืืึทืฆืืข ืืืกืงืึทืกื ืืื ืื ืคืจืืขืจืืืงืข ืงืึธื ืคืจืึทืืืขื ื ืืื ื ืืฉื ืืื ืฆืืง. ืขืก ืื ืืคืืขืงื ืืึธ:
static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
bool isBinary, bool isPrecise = false) {
....
Function *CalleeFn = CI->getCalledFunction();
StringRef CalleeNm = CalleeFn->getName(); // <=
AttributeList CalleeAt = CalleeFn->getAttributes();
if (CalleeFn && !CalleeFn->isIntrinsic()) { // <=
....
}
PVS-Studio ืืืืจืขื ืื ื: V595 [CWE-476] ืื 'CalleeFn' ืืืึทืื ืืื ืืขืืืขื ืืืืึทืืืืื ืืืืืขืจ ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื Nullptr. ืืฉืขืง ืฉืืจืืช: 1079, 1081. SimplifyLibCalls.cpp 1079
ืืื ืื:
void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
const Decl *Tmpl, Decl *New,
LateInstantiatedAttrVec *LateAttrs,
LocalInstantiationScope *OuterMostScope) {
....
NamedDecl *ND = dyn_cast<NamedDecl>(New);
CXXRecordDecl *ThisContext =
dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()); // <=
CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(),
ND && ND->isCXXInstanceMember()); // <=
....
}
PVS-Studio ืืืืจืขื ืื ื: V595 [CWE-476] ืื '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
ืืื ืืขืืึธืื ืืื ืืขืืืืจื ื ืื ืืื ืืขืจืขืกืืจื ืืื ืืขืจื ืขื ืื ืืืึธืจื ืื ืื ืืื ื ืืืขืจ ืื595. ืึทืืื ืืื ืืึธื ื ืื ืืืืกื ืืืื ืขืก ืืขื ืขื ืืขืจ ืขื ืืขื ืขืจืจืึธืจืก ืึทืืืฅ ืื ืืืึธืก ืืขื ืขื ืืืกืืขื ืืึธ. ืจืืึฟ ืืกืชึผืื ืขืก ืืื.
ืคืจืึทืืืขื ื N17, N18: ืกืึทืกืคึผืืฉืึทืก ืืืขืจืจืืง
static inline bool processLogicalImmediate(uint64_t Imm, unsigned RegSize,
uint64_t &Encoding) {
....
unsigned Size = RegSize;
....
uint64_t NImms = ~(Size-1) << 1;
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืขืก ืงืขื ื ืืฉื ืืืื ืึท ืืฉืืง ืืื ืืขืจ ืงืึธื ืึทืจืืขื ืคึผืื ืงื ืืื ืืืขื. ืืืขืจ ืืึธืก ืืื ืงืืืจ ืึท ืืืืขืจ ืกืึทืกืคึผืืฉืึทืก ืึธืจื ืืื ืืึทืจืฃ ืืืื ืึธืคึผืืขืฉืืขืื.
ืืื ืก ืืึธืื ืื ืืืึทืืขืืืืืง ืืจืืืก ืืื ืืืืึทื ืฆื 16, ืืื ืืขืจ ืืืืจ ืคืื ืื ืงืึธื ืคึผืืึทื ื ืขื ืฆื ืืึทืงืืืขื ืขืก ืืื ืึท ืืืึทืืขืืืืืง NImms ืืืขืจื:
1111111111111111111111111111111111111111111111111111111111100000
ืึธืืขืจ, ืืื ืคืึทืงื, ืืขืจ ืจืขืืืืืึทื ืืืขื ืืืื:
0000000000000000000000000000000011111111111111111111111111100000
ืืขืจ ืคืึทืงื ืืื ืึทื ืึทืืข ืืฉืืื ืืช ืคืึทืื ืืื ืื 32-ืืืกื ืึทื ืกืืื ื ืืืคึผ. ืืื ืืืืื ืืขืืึธืื ืืขื 32-ืืืกื ืึทื ืกืืื ื ืืืคึผ ืืืขื ืืืื ืืืคึผืืืกืึทืืื ืืงืกืคึผืึทื ืืื ืฆื uint64_t. ืืื ืืขื ืคืึทื, ืื ืืขืจืกื ืืืืืืืง ืืืื ืืืขื ืืืื ื ืื.
ืืืจ ืงืขื ืขื ืคืึทืจืจืืืื ืื ืกืืืืึทืฆืืข ืืื ืืึธืก:
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
ืขื ืืขื ืกืืืืึทืฆืืข: V629 [CWE-190] ืืึทืืจืึทืืื ืืืจืืงืืงื ืื 'Immr <<6' ืืืืกืืจืืง. ืืืกื ืฉืืคืืื ื ืคืื ืื 32-ืืืกื ืืืขืจื ืืื ืึท ืกืึทืืกืึทืงืืืึทื ื ืืงืกืคึผืึทื ืฉืึทื ืฆื ืื 64-ืืืกื ืืืคึผ. AArch64AddressingModes.h 269
ืคืจืึทืืืขื ื N19: ืคืขืื ืืืง ืงืืืืขืจื ืึทื ืืขืจืฉ?
void AMDGPUAsmParser::cvtDPP(MCInst &Inst, const OperandVector &Operands) {
....
if (Op.isReg() && Op.Reg.RegNo == AMDGPU::VCC) {
// VOP2b (v_add_u32, v_sub_u32 ...) dpp use "vcc" token.
// Skip it.
continue;
} if (isRegOrImmWithInputMods(Desc, Inst.getNumOperands())) { // <=
Op.addRegWithFPInputModsOperands(Inst, 2);
} else if (Op.isDPPCtrl()) {
Op.addImmOperands(Inst, 1);
} else if (Op.isImm()) {
// Handle optional arguments
OptionalIdx[Op.getImmTy()] = I;
} else {
llvm_unreachable("Invalid operand type");
}
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืขืก ืืื ืงืืื ืืขืืช ืืึธ. ืืื ื ืื ืืขืืึธืื ืืืึธืง ืคืื ืืขืจ ืขืจืฉืืขืจ 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-Studio ืืืึธืจื ืื ืื:
- V655 [CWE-480] ืื ืกืืจืื ืืก ืืขื ืขื ืงืึทื ืงืึทืืึทื ืืืืึทื ืึธืืขืจ ืืขื ืขื ื ืืฉื ืืขืืืืื ื. ืืึทืืจืึทืืื ืืืจืืงืืงื ืื ืืืืกืืจืืง 'Result + Name.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-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] ืื ืืืขืจืืึทืืึทื 'ืืคืขืงืฅ' ืืื ืึทืกืืื ื ืืืึทืืืขืก ืฆืืืื ืืึธื ืกืึทืงืกืขืกืืืืื. ืืคืฉืจ ืืื ืืืก ื ืืขืืช. ืืฉืขืง ืฉืืจืืช: 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 ืืืืจืขื ืื ื:
ืงืึธื ืืจืึธืืืจืื ื ืืื ื ืืฉื ืืึทืื ืืื ืขื. ืืืึทืจืืึทืืืข NextByte ืฉืืขื ืืืง ื ืื ืืืืึทื ืฆื ืื ืืืขืจื 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-Studio ืืืืจืขื ืื ื:
ืืขืจ ืงืขืกืืืืขืจืืืง 0xE ืืื ืื ืืืขืจื 14 ืืื ืืขืฆืืืึทื. ืืืจืืงืืง RegNo == 0xe ืืื ื ืืฉื ืืึทืื ืืื ืขื ืืืืึทื ืืืื ืจืขืื ืึธ > 13, ืืขืืึธืื ืืขืจ ืคืื ืงืฆืืข ืืืขื ืคืึทืจืขื ืืืงื ืืืึทื ืืืจืืคืืจืื ื.
ืขืก ืืขื ืขื ืืขืืืขื ืคืืืข ืื ืืขืจืข ืืืึธืจื ืื ืื ืืื ID V547 ืืื V560, ืึธืืขืจ ืืื ืืื
ืืื ืืืขื ืืขืื ืืืจ ืึท ืืืืฉืคึผืื ืคืื ืืืึธืก ืืขืจื ืขื ืื ืืจืืืขืจื ืืื ื ืืื ืข. ืืขืจ ืึทื ืึทืืืืขืจ ืืื ืืขืืึทืืจืข ืจืขืื ืฆื ืึทืจืืืกืืขืื ืึท ืืืืจืขื ืื ื ืคึฟืึทืจ ืื ืคืืืืขื ืืข ืงืึธื. ืืืขืจ ืืืก ืืื ื ืืฉื ืงืืื ืืขืืช.
bool UnwrappedLineParser::parseBracedList(bool ContinueOnSemicolons,
tok::TokenKind ClosingBraceKind) {
bool HasError = false;
....
HasError = true;
if (!ContinueOnSemicolons)
return !HasError;
....
}
PVS-Studio ืืืืจืขื ืื ื: V547 [CWE-570] ืืืืกืืจืืง '!HasError' ืืื ืฉืืขื ืืืง ืคืึทืืฉ. UnwrappedLineParser.cpp 1635
ืคืจืึทืืืขื ื N30: โโืกืึทืกืคึผืืฉืึทืก ืฆืืจืืงืงืืืขื
static bool
isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) {
for (MachineRegisterInfo::def_instr_iterator It = MRI.def_instr_begin(Reg),
E = MRI.def_instr_end(); It != E; ++It) {
return (*It).isImplicitDef();
}
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืืึธืก ืืื ืึธืืขืจ ืึท ืืขืืช ืึธืืขืจ ืึท ืกืคึผืขืฆืืคืืฉ ืืขืื ืืง ืืืึธืก ืืื ืืืขื ืฆื ืืขืจืงืืขืจื ืขืคึผืขืก ืฆื ืคึผืจืึธืืืจืึทืืขืจื ืืืืขื ืขื ืืขื ืงืึธื. ืืขืจ ืคึผืืึทื ืืื ื ืืฉื ืืขืจืงืืขืจื ืขืคึผืขืก ืฆื ืืืจ ืืื ืงืืงื ืืืืขืจ ืกืึทืกืคึผืืฉืึทืก. ืขืก ืืื ืืขืกืขืจ ื ืืฉื ืฆื ืฉืจืืึทืื ืึทืืื :).
ืืื? ืืขืจื ืึธื ืขืก ืืื ืฆืืื ืฆื ืืึทืื ืืื ืึธืืขืจ ืงืึทืืืข.
ืืกืจืื ืืช ืืืืขื ืึทืคืืื ืืืจื ื ืืึท ืืืึทืื ืึธืกืืืงืก
ืืื ืืจืึทืืื 30 ืึทืงืืึทืืืืืฉืึทื ื ืคืื ืึทืื ืืืึทืื ืึธืกืืืงืก ืืื ืืขื ืื. ืืึธืืืจ ืืืฆื ืืขื ืืืึธืก ืืฉืืงืึทืืืข ืืืื ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื ืืื ืื ื ืืึทืข ืืืึทืื ืึธืกืืืงืก ืืืึธืก ืืื ืืจืืืก ืืื ืื ืึทื ืึทืืืืขืจ ื ืึธื
ืคืจืึทืืืขื ื N31: ืื ืจืขืึทืืฉืึทืืืข ืงืึธื
Error CtorDtorRunner::run() {
....
if (auto CtorDtorMap =
ES.lookup(JITDylibSearchList({{&JD, true}}), std::move(Names),
NoDependenciesToRegister, true))
{
....
return Error::success();
} else
return CtorDtorMap.takeError();
CtorDtorsByPriority.clear();
return Error::success();
}
PVS-Studio ืืืืจืขื ืื ื:
ืืื ืืืจ ืงืขื ืขื ืืขื, ืืืืืข ืฆืืืืืื ืคืื ืืขืจ ืึธืคึผืขืจืึทืืึธืจ if ืขื ืืก ืืื ืึท ืจืืคื ืฆื ืืขืจ ืึธืคึผืขืจืึทืืึธืจ ืฆืืจืืงืงืืืขื. ืึทืงืงืึธืจืืื ืืื, ืืขืจ ืงืึทื ืืืื ืขืจ CtorDtorsByPriority ืืืขื ืงืืื ืืึธื ืืืื ืงืืืจื.
ืคืจืึทืืืขื ื N32: ืื ืจืขืึทืืฉืึทืืืข ืงืึธื
bool LLParser::ParseSummaryEntry() {
....
switch (Lex.getKind()) {
case lltok::kw_gv:
return ParseGVEntry(SummaryID);
case lltok::kw_module:
return ParseModuleEntry(SummaryID);
case lltok::kw_typeid:
return ParseTypeIdEntry(SummaryID); // <=
break; // <=
default:
return Error(Lex.getLoc(), "unexpected summary kind");
}
Lex.setIgnoreColonInIdentifiers(false); // <=
return false;
}
PVS-Studio ืืืืจืขื ืื ื: V779 [CWE-561] ืึทื ืจืืึทืืฉืึทืืึทื ืงืึธื ืืืืขืงืืึทื. ืขืก ืืื ืืขืืืขื ืึทื ืึท ืืขืืช ืืื ืคืึธืจืฉืืขืื. LLParser.cpp 835
ืืฉืืงืึทืืืข ืกืืืืึทืฆืืข. ืืึธืืืจ ืงืืื ืงืืงื ืืืืฃ ืืขื ืึธืจื:
return ParseTypeIdEntry(SummaryID);
break;
ืืื ืขืจืฉืืขืจ ืืืืง, ืขืก ืืืื ื ืึทื ืขืก ืืื ืงืืื ืืขืืช ืืึธ. ืขืก ืงืืงื ืืื ืืขืจ ืึธืคึผืขืจืึทืืึธืจ ืืจืขืื ืขืก ืืื ืึทื ืขืงืกืืจืข ืืืื ืขืจ ืืึธ, ืืื ืืืจ ืงืขื ืขื ืคืฉืื ืืืกืืขืงื ืขืก. ืึธืืขืจ, ื ืื ืึทืืข ืึทืืื ืคึผืฉืื.
ืืขืจ ืึทื ืึทืืืืขืจ ืืื ืึท ืืืืจืขื ืื ื ืืืืฃ ืื ืฉืืจืืช:
Lex.setIgnoreColonInIdentifiers(false);
return false;
ืืื ืืึทืงืข, ืืขื ืงืึธื ืืื ืึทื ืจืืืฉืึทืืึทื. ืึทืืข ืงืึทืกืขืก ืืื ืืืขืจืืืึทื ืขื ืืก ืืื ืึท ืจืืคื ืคืื ืืขืจ ืึธืคึผืขืจืึทืืึธืจ ืฆืืจืืงืงืืืขื. ืืื ืืืฆื ืืืืืื ืืง ืึทืืืื ืืจืขืื ืืขื ื ืืฉื ืืืืก ืืืื ืืืฉืขืืืขื! ืืคืฉืจ ืืืื ืขืจ ืคืื ืื ืฆืืืืืื ืืึธื ืขื ืืืงื ืืื ืืจืขืืื ืื ืืืืฃ ืฆืืจืืงืงืืืขื?
ืคืจืึทืืืขื ื N33: ืจืึทื ืืึธื ืืึทืฉืืขืืืง ืคืื ืืืื ืืืื
unsigned getStubAlignment() override {
if (Arch == Triple::systemz)
return 8;
else
return 1;
}
Expected<unsigned>
RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
const SectionRef &Section,
bool IsCode) {
....
uint64_t DataSize = Section.getSize();
....
if (StubBufSize > 0)
DataSize &= ~(getStubAlignment() - 1);
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืืืืข ืืึธื ืึทื ืื ืคึฟืื ืงืฆืืข getStubAlignment ืงืขืจื ืืืคึผ ืื ืกืืื ืขื. ืืึธืืืจ ืจืขืืขื ืขื ืื ืืืขืจื ืคืื ืื ืืืืกืืจืืง, ืึทืกืืืื ื ืึทื ืื ืคึฟืื ืงืฆืืข ืงืขืจื ืื ืืืขืจื 8:
~(getStubAlignment() - 1)
~(8ื-1)
0xFFFFFFFF8u
ืืืฆื ืืึทืืขืจืงื ืึทื ืื ืืืึทืืขืืืืืง ืืึทืืึทืกืืื ืืื ืึท 64-ืืืกื ืึทื ืกืืื ื ืืืคึผ. ืขืก ืืืจื ืก ืืืืก ืึทื ืืืขื ืคึผืขืจืคืึธืจืืื ื ืื DataSize & 0xFFFFFFF8u ืึธืคึผืขืจืึทืฆืืข, ืึทืืข 0 ืืืื-ืกืืจ ืืืื ืืืขื ืืืื ืืึทืฉืืขืืืง ืฆื ื ืื. ืจืืึฟ ืืกืชึผืื, ืืึธืก ืืื ื ืืฉื ืืืึธืก ืืขืจ ืคึผืจืึธืืจืึทืืืกื ืืขืืืืื. ืืื ืืึธืฉืขื ืึทื ืขืจ ืืขืืืืื ืฆื ืจืขืืขื ืขื: DataSize & 8xFFFFFFFFFFFFFFFXNUMXu.
ืฆื ืคืึทืจืจืืืื ืืขื ืืขืืช, ืืืจ ืืึธื ืฉืจืืึทืื ืืขื:
DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);
ืึธืืขืจ ืึทืืื:
DataSize &= ~(getStubAlignment() - 1ULL);
ืคืจืึทืืืขื ื N34: ืืืจืืคืึทื ืืงืกืคึผืืืกืึทื ืืืคึผ ืืืึทืจืคื
template <typename T>
void scaleShuffleMask(int Scale, ArrayRef<T> Mask,
SmallVectorImpl<T> &ScaledMask) {
assert(0 < Scale && "Unexpected scaling factor");
int NumElts = Mask.size();
ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
....
}
PVS-Studio ืืืืจืขื ืื ื:
ืืงืกืคึผืืืกืึทื ืืืคึผ ืงืึทืกืืื ื ืืื ืืขื ืืฆื ืฆื ืืืกืืืืื ืืืืคื ืืืขื ืืึทืืืึทืคึผืืืืื ื ืืืคึผ ืืืขืจืืึทืืึทืื ืื ื. ืึธืืขืจ, ืืงืกืคึผืืืกืึทื ืืืคึผ ืงืึทืกืืื ื ืืึธ ืืื ื ืืฉื ืืึทืฉืืฆื ืงืขืื ืึธืืืืขืจืคืืึธื. ืขืจืฉืืขืจ, ืื ืืืขืจืืึทืืึทืื ืืืขื ืืืื ืืขืืขืจื, ืืื ืืืืื ืืขืืึธืื ืื 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;
}
....
}
ืื ื ืืืข ืืื ืืขืจืขืกืื ืืข ืืืืื ืืกืืืง ืืืืขื ืืืคืืฆืืจื ืกืืืืืฆืืขืก ืืืื ืืขื ืืื ืงืืคืืจื ื ืฉืืืง ืงืืื ืืื ืืขื ืืื ืื ืืขืืืืื ืืืืฉื ืขืืืืืข ื ืขืืขื ืืื ืืื, ืืืขืจ ืืืืฃ ืืืื ืืจื ืืืื ืืื ืขืก ื ืืฉื ืคืืจืจืืืืืื.
ืืืืข ืืึธื ืึทื ืืื ืื ืจืืข ืืืึธืง ืืื ืืขืืืื ืึธืคึผืงืกื ืืืงืก ืืืืฃ ืึธืคึผืงืกื ืืืงืก. ืืืขืจ ืืื ืืืื ืึธืจื ืืื ืืึธืื ื ืืฉื ืคืึทืจืจืืืื ืขืก. ืจืืึฟ ืืกืชึผืื ืขืก ืืึธื ืืืื ืืขืฉืจืืื ืืื ืืึธืก:
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 424
ืื ืกืืืืึทืฆืืข ืืื ืขื ืืขื ืฆื ืื ืคืจืืขืจืืืงืข. ืขืก ืืึธื ืืืื ืืขืฉืจืืื:
this->Size += this->EntrySize;
ืคืจืึทืืืขื ื N38-N47: ืืื ืคืืจืืขืกื ืฆื ืงืึธื ืืจืึธืืืจื ืื ืืื ืืขืงืก
ืืื ืึทืืขืจ, ืืืจ ืืขืงืืงื ืืื ืืืืฉืคืืื ืคืื ืืืึทืื ืึธืกืืืง ืืจืืืขืจืื ื
int getGEPCost(Type *PointeeType, const Value *Ptr,
ArrayRef<const Value *> Operands) {
....
if (Ptr != nullptr) { // <=
assert(....);
BaseGV = dyn_cast<GlobalValue>(Ptr->stripPointerCasts());
}
bool HasBaseReg = (BaseGV == nullptr);
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType()); // <=
....
}
PVS-Studio ืืืืจืขื ืื ื: V1004 [CWE-476] ืื 'Ptr' ืืืึทืื ืืื ืืขื ืืฆื ืึทื ืกืืืฃ ื ืึธื ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื Nullptr. ืืฉืขืง ืฉืืจืืช: 729, 738. TargetTransformInfoImpl.h 738
ืืืึทืืขืืืืืง Ptr ืงืขื ืืืื ืืืืึทื nullptr, ืืื ืขืืืืืึทื ืกื ืืืจื ืื ืืฉืขืง:
if (Ptr != nullptr)
ืึธืืขืจ, ืืื ืืขืจ ืืขื ืืืึทืื ืืื ืืขืจืขืคืขืจืึทื ืกื ืึธื ืคึผืจืืืืืึทื ืขืจื ืงืึธื ืืจืึธืืืจืื ื:
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());
ืืื ืก ืืึทืืจืึทืืื ืื ืื ืืขืจ ืขื ืืขื ืคืึทื.
llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
bool Stub) {
....
auto *FD = dyn_cast<FunctionDecl>(GD.getDecl());
SmallVector<QualType, 16> ArgTypes;
if (FD) // <=
for (const ParmVarDecl *Parm : FD->parameters())
ArgTypes.push_back(Parm->getType());
CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); // <=
....
}
PVS-Studio ืืืืจืขื ืื ื: V1004 [CWE-476] ืื 'FD' ืืืึทืื ืืื ืืขื ืืฆื ืึทื ืกืืืฃ ื ืึธื ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื Nullptr. ืืฉืขืง ืฉืืจืืช: 3228, 3231. CGDebugInfo.cpp 3231
ืืึทืฆืึธืื ืืคืืขืจืงืืึทืืงืืึทื ืฆื ืื ืฆืืืื FD. ืืื ืืื ืืืืขืจ ืึทื ืื ืคึผืจืึธืืืขื ืืื ืงืืืจ ืงืขื ืืืง ืืื ืงืืื ืกืคึผืขืฆืืขืืข ืืขืจืงืืขืจืื ื ืืื ืคืืจืืื ืื.
ืืื ืืืืืืขืจ:
static void computePolynomialFromPointer(Value &Ptr, Polynomial &Result,
Value *&BasePtr,
const DataLayout &DL) {
PointerType *PtrTy = dyn_cast<PointerType>(Ptr.getType());
if (!PtrTy) { // <=
Result = Polynomial();
BasePtr = nullptr;
}
unsigned PointerBits =
DL.getIndexSizeInBits(PtrTy->getPointerAddressSpace()); // <=
....
}
PVS-Studio ืืืืจืขื ืื ื: V1004 [CWE-476] ืื 'PtrTy' ืืืึทืื ืืื ืืขื ืืฆื ืึทื ืกืืืฃ ื ืึธื ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื Nullptr. ืงืืง ืฉืืจืืช: 960, 965. InterleavedLoadCombinePass.cpp 965
ืืื ืฆื ืืึทืฉืืฆื ืืื ืคืื ืึทืืึท ืขืจืจืึธืจืก? ืืืื ืืขืจ ืึทืืขื ืืืื ืืืืฃ ืงืึธื-ืจืขืืืืข ืืื ื ืืฆื ืื PVS-Studio ืกืืึทืืืง ืึทื ืึทืืืืขืจ ืฆื ืงืขืกืืืืขืจ ืงืึธื ืืจืึธืืืจื ืืืื ืงืึธื.
ืขืก ืืื ืงืืื ืคืื ื ืฆื ืฆืืืืจื ืื ืืขืจืข ืงืึธื ืคืจืึทืืืึทื ืฅ ืืื ืขืจืจืึธืจืก ืคืื ืืขื ืืืคึผ. ืืื ืืืขื ืืึธืื ืืืืื ืึท ืจืฉืืื ืคืื ืืืึธืจื ืื ืื ืืื ืืขื ืึทืจืืืงื:
- V1004 [CWE-476] ืื 'ืขืงืกืคึผืจ' ืืืึทืื ืืื ืืขื ืืฆื ืึทื ืกืืืฃ ื ืึธื ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื nullptr. ืืฉืขืง ืฉืืจืืช: 1049, 1078. DebugInfoMetadata.cpp 1078
- V1004 [CWE-476] ืื 'ืคึผื' ืืืึทืื ืืื ืืขื ืืฆื ืึทื ืกืืืฃ ื ืึธื ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื nullptr. ืืฉืขืง ืฉืืจืืช: 733, 753. LegacyPassManager.cpp 753
- V1004 [CWE-476] ืื 'StatepointCall' ืืืึทืื ืืื ืืขื ืืฆื ืึทื ืกืืืฃ ื ืึธื ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื nullptr. ืืฉืขืง ืฉืืจืืช: 4371, 4379. Verifier.cpp 4379
- V1004 [CWE-476] ืื 'ืจืื' ืืืึทืื ืืื ืืขื ืืฆื ืึทื ืกืืืฃ ื ืึธื ืขืก ืืื ืืขืืืขื ืืืขืจืึทืคืืื ืงืขืื 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. ืืื ืืขื ืคืึทื, ืืขืจ ืืืึทืื ืืืขื ืืืื ืคืึทืจืคืึทืื ืืื ืื ืืืฉืืคื ืืืืคืขืฅ ืืืขื ืงืืื ืืึธื ืืืื ืืืืกืืขืืขืงื.
ื ืืืืขืจ ืืืืืื ื ืืื ืฆื ืฉืึทืคึฟื ืืื ืฆืืง_ืคึผืืจืืืึธืก ืืืขื ืคืึทืจืืึธืื ืื ืืืึทืื ืืืืืขืจ ืืขืจ ืืืขืงืืึธืจ ืคืจืืืื ืฆื ืจืืึทืืึธืงืืื ืืึผืจืื:
xxx.push_back(std::unique_ptr<X>(new X))
ืืื ื C ++14, ืืืจ ืงืขื ืขื ื ืืฆื 'std::make_unique':
xxx.push_back(std::make_unique<X>())
ืืขืจ ืืืคึผ ืคืื ืืืกืึธืจื ืืื ื ืืฉื ืงืจืืืืฉ ืคึฟืึทืจ LLVM. ืืืื ืืขืืึธืจื ืงืขื ืขื ื ืื ืืืื ืึทืืึทืงืืืืื, ืืขืจ ืงืึทืืคึผืืืืขืจ ืืืขื ืคืฉืื ืืึทืืื. ืึธืืขืจ, ืคึฟืึทืจ ืึทืคึผืืึทืงืืืฉืึทื ื ืืื ืืึทื ื
ืืึธืืฉ ืืขืจ ืงืึธื ืืื ื ืืฉื ืึท ืคึผืจืึทืงืืืฉ ืกืึทืงืึธื ืข ืฆื LLVM, ืืื ืืขืคึฟืื ืขื ืขืก ื ืืฆืืง ืฆื ืจืขืื ืืืขืื ืืขื ืืขืืช ืืืกืืขืจ ืืื ืึทื ืื PVS-Studio ืึทื ืึทืืืืขืจ ืืื ืืขืืขืจื ื ืฆื ืืืขื ืืืคืืฆืืจื ืขืก.
ืื ืืขืจืข ืืืึธืจื ืื ืื ืคืื ืืขื ืืืคึผ:
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืคึผืึทืกืึทื' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. PassManager.h 546
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'AAs' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. AliasAnalysis.h 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] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'PendingSubmodules' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. ModuleMap.cpp 810
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืึธืืืืฉืขืงืฅ' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. DebugMap.cpp 88
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืกืืจืึทืืขืืืขืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-isel-fuzzer.cpp 60
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 685
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 686
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 688
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 689
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 690
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 691
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 692
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 693
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึธืืืคืืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. llvm-stress.cpp 694
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืึธืคึผืขืจืึทื ืืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'Stash' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] ื ืืืึทืื ืึธื ืืึทืืืฆืขืจ ืืื ืืืกืืฃ ืฆื ืื 'ืืึทืืืฉืขืจืก' ืงืึทื ืืืื ืขืจ ืืืจื ืื 'emplace_back' ืืืคึฟื. ื ืืึผืจืื ืจืื ืขื ืืืขื ืคืึทืื ืืื ืคืึทื ืคืื ืึท ืืืกื ืขื. GlobalISelEmitter.cpp 2702
ืกืึธืฃ
ืืื ืืจืืืก 60 ืืืึธืจื ืื ืื ืืื ืืึทื ืฅ ืืื ืืขืืึธืื ืคืืจืฉืืืคื. ืืขื ืขื ืขืก ืื ืืขืจืข ืืกืจืื ืืช ืืืึธืก ืื PVS-Studio ืึทื ืึทืืืืขืจ ืืืืขืงืฅ ืืื LLVM? ืื ืืื ืืื. ืึธืืขืจ, ืืืขื ืืื ืืึธื ืืขืฉืจืืื ืงืึธื ืคืจืึทืืืึทื ืฅ ืคึฟืึทืจ ืืขื ืึทืจืืืงื, ืขืก ืืื ืืขืืืขื ืฉืคึผืขื ืึธืืื ื, ืึธืืขืจ ืืึทื ืฅ ื ืึทืื, ืืื ืืื ืืึทืฉืืึธืกื ืึทื ืขืก ืืื ืฆืืึทื ืฆื ืจืืคื ืขืก ืึท ืืึธื.
ืืื ืืึธืคึฟื ืืืจ ืืขืคึฟืื ืขื ืขืก ืืฉืืงืึทืืืข ืืื ืืืจ ืืืืื ืฆื ืคึผืจืืืืจื ืื PVS-Studio ืึทื ืึทืืืืขืจ.
ืืืจ ืงืขื ื ืืจืืคืงืืคืืข ืื ืึทื ืึทืืืืขืจ ืืื ืืึทืงืืืขื ืื ืืื ืขืกืืืขืขืคึผืขืจ ืฉืืืกื ืืื
ืจืืึฟ ืืืคึผืึธืจืืึทื ืืื, ื ืืฆื ืกืืึทืืืง ืึทื ืึทืืืกืืก ืงืขืกืืืืขืจ. ืืืื-ืฆืืึทื ืืฉืขืงืก, ืืขืคืืจื ืืืจื ืืื ืื ืืื ืกืืจ ืฆื ืคึผืึธืคึผืืืึทืจืืืืจื ืื ืืขืืึทืืึทืืึทืืืฉื ืคืื ืกืืึทืืืง ืึทื ืึทืืืกืืก ืืื ืคึผืืืก-ืกืืืืืึธ ืืขื ืขื ื ืืฉื ืึท ื ืึธืจืืึทื ืกืฆืขื ืึทืจ.
ืืื ืืืืง ืืื ืืืคึผืจืืืืื ื ืื ืงืืืึทืืืืขื ืืื ืจืืืืืึทืืืืึทืื ืคืื ืืืื ืงืึธื!
ืืืื ืืืจ ืืืืื ืืืืื ืืขื ืึทืจืืืงื ืืื ืึทื ืขื ืืืืฉ-ืืขืจืขืื ืืืืขื, ืืืืข ื ืืฆื ืื ืืืืขืจืืขืฆืื ื ืืื ืง: Andrey Karpov.
ืืงืืจ: www.habr.com