เบซเบผเบฒเบเบเบงเปเบฒเบชเบญเบเบเบตเปเบเปเบเปเบฒเบเปเบเบเบฑเบเบเบฑเปเบเปเบเปเบเบฒเบเบเบงเบเบชเบญเบเบฅเบฐเบซเบฑเบเบชเบธเบเบเปเบฒเบเบเบญเบเปเบเบเบเบฒเบ LLVM เปเบเบเปเบเปเปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio เบเบญเบเบเบงเบเปเบฎเบปเบฒ. เปเบซเปเปเบเปเปเบเบงเปเบฒเปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio เบเบฑเบเปเบเบฑเบเปเบเบทเปเบญเบเบกเบทเบเบฑเปเบเบเปเบฒเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฒเบเบปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเปเบฅเบฐเบเบธเบเบญเปเบญเบเบเบตเปเปเบเบฑเบเปเบเปเบเป. เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบงเบเบชเบญเบเปเบฅเบฐเบเบญเบเบซเบฒเบเปเปเบเบดเบเบเบฒเบเปเบซเบกเปเปเบเบเบฒเบเบเปเบญเบ LLVM 8.0.0.
เบเบปเบเบเบงเบฒเบกเบเบตเปเบเบฐเบเบฝเบ
เบเปเบงเบเบเบงเบฒเบกเบเบทเปเบชเบฑเบ, เบเปเบญเบเบเปเปเบเปเบญเบเบเบฒเบเบเบฝเบเบเบปเบเบเบงเบฒเบกเบเบตเป. เบกเบฑเบเบเปเปเบซเบเปเบฒเบชเบปเบเปเบเบเบตเปเบเบฐเบเบฝเบเบเปเบฝเบงเบเบฑเบเปเบเบเบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบงเบเปเบเบดเปเบเบซเบผเบฒเบเบเบฑเปเบเปเบฅเปเบง (
เบเบธเบเบเบฑเปเบเบเบตเปเบชเบฐเบเบฑเบเปเปเปเบเบญเบ LLVM เบเบทเบเบเปเบญเบเบญเบญเบเบกเบฒ เบซเบผเบทเบญเบฑเบเปเบเบ
เปเบเบดเปเบ, เบฎเบธเปเบเปเบซเบกเปเบเบญเบ Clang Static Analyzer เปเบเปเบฎเบฝเบเบฎเบนเปเปเบเบทเปเบญเบเบญเบเบซเบฒเบเปเปเบเบดเบเบเบฒเบเปเบซเบกเป! เบกเบฑเบเปเบเบดเปเบเบเบทเบงเปเบฒเบเปเบญเบเบกเบตเบเบงเบฒเบกเบเปเบฝเบงเบเปเบญเบเบเบญเบเบเบฒเบเปเบเป PVS-Studio เปเบกเปเบเบซเบผเบธเบเบฅเบปเบ. Clang เบเบปเบเปเบซเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบซเบผเบฒเบเบเปเบงเบฒเบเปเบญเบเปเบฅเบฐเบเบฑเบเบเบฑเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบ PVS-Studio. เปเบเบปเปเบฒเบเบดเบเปเบเบงเปเบเบเปเบฝเบงเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเป?
เบเปเบฝเบงเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเป, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบชเบฐเปเบซเบกเบตเบเปเบญเบเบเบฒเบเบเบญเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเปเบเบฑเปเบ:
เบเบงเบโเปเบฎเบปเบฒโเบเปเปโเปเบเปโเบเบฑเปเบโเบขเบนเปโเบเปเปโเปเบเปโเบเบฑเบโเบซเบกเบปเบโ! เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบเบธเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบเปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio เบขเปเบฒเบเบซเบผเบงเบเบซเบผเบฒเบ. เบชเบฐเบเบฑเปเบเบขเปเบฒเบเบฑเบเบงเบปเบ, เบเบงเบเปเบฎเบปเบฒเบชเบทเบเบเปเปเบเปเบฒเบเบฒเบเบทเปเบเบปเปเบฒ.
เปเบเปเบซเบเปเบฒเปเบชเบเบเบฒเบ, เบเบตเปเปเบกเปเบเบเปเบฒเบเบญเบเบเบตเปเบเปเปเบเบต. เบเปเปเบกเบตเบซเบผเบฑเบเบเบฒเบเปเบเปเปเบเบกเบฑเบ. เปเบฅเบฐเบเบฑเปเบเปเบกเปเบเปเบซเบเบเบปเบเบเบตเปเบเปเบญเบเบเบฝเบเบเบปเบเบเบงเบฒเบกเบเบตเปเปเบเบเบฑเบเบเบธเบเบฑเบ. เบเบฑเปเบเบเบฑเปเบ, เปเบเบเบเบฒเบ LLVM เปเบเปเบเบทเบเบเบงเบเบชเบญเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเปเบฅเบฐเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเปเบฒเบเปเปเบเปเบเบทเบเบเบปเบเปเบซเบฑเบเบขเบนเปเปเบเบกเบฑเบ. เบเบญเบเบเบตเปเบเปเบญเบเบเบฐเบชเบฐเปเบเบเบชเบดเปเบเบเบตเปเปเบเบดเปเบเบเบทเบงเปเบฒเบซเบเปเบฒเบชเบปเบเปเบเบเบฑเบเบเปเบญเบ. Clang Static Analyzer เบเปเปเบชเบฒเบกเบฒเบเบเบญเบเบซเบฒเบเปเปเบเบดเบเบเบฒเบเปเบซเบผเบปเปเบฒเบเบตเป (เบซเบผเบทเบกเบฑเบเบเปเปเบชเบฐเบเบงเบเบเบตเปเบชเบธเบเบเบตเปเบเบฐเปเบฎเบฑเบเปเบเบงเบเบฑเปเบเบเปเบงเบเบเบฒเบเบเปเบงเบเปเบซเบผเบทเบญเบเบญเบเบกเบฑเบ). เปเบเปเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเป. เบเบดเปเบเปเบเบเบงเปเบฒเบเบฑเปเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบปเบเปเบซเบฑเบเปเบฅเบฐเบเบฝเบเบเปเปเบเบดเบเบเบฒเบเปเบซเบผเบปเปเบฒเบเบตเปเบเบฑเบเบซเบกเบปเบเปเบเบเบญเบเปเบฅเบเบซเบเบถเปเบ.
เปเบเปเบเบฒเบเบเบฝเบเบเบปเบเบเบงเบฒเบกเปเบเปเปเบงเบฅเบฒเบซเบผเบฒเบเบญเบฒเบเบดเบ. เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเบเบฝเบโเปเบเปโเบเปเปโเบชเบฒโเบกเบฒเบโเบเปเบฒโเบเบปเบโเปเบญเบโเปเบเบทเปเบญโเปเบญเบปเบฒโเบเบฑเบโเบซเบกเบปเบโเบเบตเปโเปเบเบปเปเบฒโเปเบโเปเบโเบเปเปโเบเบงเบฒเบก :).
เปเบเบเบงเบดเบเบตเบเบฒเบเบเบฒเบ, เบเปเบฒเบเปเบฒเบเบชเบปเบเปเบเปเบเบชเบดเปเบเบเบตเปเปเบเบฑเบเปเบเปเบฅเบขเบตเบเบตเปเปเบเปเปเบเปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio เปเบเบทเปเบญเบเปเบฒเบเบปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเปเบฅเบฐเบเบธเบเบญเปเบญเบเบเบตเปเบญเบฒเบเบเบฐเปเบเบตเบเบเบทเปเบ, เบเปเบญเบเบเปเปเบเบฐเบเปเบฒเปเบซเปเบฎเบนเปเบเบฑเบเบเบฑเบเปเบฅเบทเปเบญเบเบเบตเป.
เบเบฒเบเบงเบดเบเบดเบเปเบชเปเบซเบกเปเปเบฅเบฐเปเบเบปเปเบฒ
เบเบฑเปเบเบเบตเปเปเบเปเบฅเบฐเบเบธเปเบงเปเปเบฅเปเบง, เบเบฐเบกเบฒเบเบชเบญเบเบเบตเบเปเบญเบเบซเบเปเบฒเบเบตเปเปเบเบเบเบฒเบ LLVM เปเบเปเบเบทเบเบเบงเบเบชเบญเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ, เปเบฅเบฐเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเบเบปเบเปเบซเบฑเบเปเบเปเบเบทเบเปเบเปเปเบ. เปเบเบเบฑเบเบเบธเบเบฑเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเบฐเบเปเบฒเบชเบฐเปเบซเบเบต batch เปเบซเบกเปเบเบญเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ. เปเบเบฑเบเบซเบเบฑเบเบเบปเบเบเบฑเบเปเปเป? เบกเบต 3 เปเบซเบเบเบปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป:
- เปเบเบเบเบฒเบ LLVM เบเปเบฒเบฅเบฑเบเบเบฑเบเบเบฐเบเบฒ, เบเปเบฝเบเบฅเบฐเบซเบฑเบเปเบเบปเปเบฒเปเบฅเบฐเปเบเบตเปเบกเบฅเบฐเบซเบฑเบเปเบซเบกเป. เบเบฒเบกเบเปเบฒเบกเบฐเบเบฒเบ, เบกเบตเบเปเปเบเบดเบเบเบฒเบเปเบซเบกเปเปเบเบฅเบฐเบซเบฑเบเบเบฑเบเปเบเปเปเบฅเบฐเบฅเบฒเบเบฅเบฑเบเบญเบฑเบเบชเบญเบ. เบเบตเปเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเบขเปเบฒเบเบเบฑเบเปเบเบเบงเปเบฒเบเบฒเบเบงเบดเปเบเบฒเบฐ static เบเบงเบเบเบทเบเบเปเบฒเปเบเปเปเบเบฑเบเบเบปเบเบเบฐเบเบด, เปเบฅเบฐเบเปเปเปเบกเปเบเบเบฒเบเบเบฑเปเบเบเบฒเบง. เบเบปเบเบเบงเบฒเบกเบเบญเบเบเบงเบเปเบฎเบปเบฒเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเปเบเบดเบเบเบงเบฒเบกเบชเบฒเบกเบฒเบเบเบญเบเปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio, เปเบเปเบเบตเปเบเปเปเบกเบตเบซเบเบฑเบเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบเบฒเบเบเบฑเบเบเบธเบเบเบธเบเบเบฐเบเบฒเบเบเบญเบเบฅเบฐเบซเบฑเบเปเบฅเบฐเบเบฒเบเบซเบผเบธเบเบเปเบญเบเบเปเบฒเปเบเปเบเปเบฒเบเปเบเบเบฒเบเปเบเปเปเบเบเปเปเบเบดเบเบเบฒเบ. เปเบเปเบเบปเบงเบงเบดเปเบเบฒเบฐเบฅเบฐเบซเบฑเบเบชเบฐเบเบดเบเปเบเบฑเบเบเบฐเบเบณ!
- เบเบงเบโเปเบฎเบปเบฒโเบเปเบฒโเบฅเบฑเบโเบชเปเบฒโเปเบฅเบฑเบโเบฎเบนเบโเปเบฅเบฐโเบเบฑเบโเบเบธเบโเบเบฒเบโเบงเบดโเบเบดเบโเปเบชโเบเบตเปโเบกเบตโเบขเบนเปโเปเบฅเปเบงโ. เบเบฑเปเบเบเบฑเปเบ, เบเบฑเบเบงเบดเปเบเบฒเบฐเบชเบฒเบกเบฒเบเบเปเบฒเบเบปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเบกเบฑเบเบเปเปเปเบเปเบชเบฑเบเปเบเบเปเบซเบฑเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบชเบฐเปเบเบเบเบตเปเบเปเบฒเบเบกเบฒ.
- เบเบฒเบเบงเบดเบเบดเบเปเบชเปเปเปเปเบเปเบเบฐเบเบปเบเบขเบนเปเปเบ PVS-Studio เบเบตเปเบเปเปเบกเบตเบขเบนเป 2 เบเบตเบเปเบญเบ. เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบตเปเบเบฐเปเบเบฑเปเบเปเบซเปเบเบงเบเปเบเบปเบฒเบขเบนเปเปเบเบเบฒเบเปเบเบเบเปเบฒเบเบซเบฒเบเปเบเบทเปเบญเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเบขเปเบฒเบเบเบฑเบเปเบเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ 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: เบเบดเบกเบเบดเบ
enum CXNameRefFlags {
CXNameRange_WantQualifier = 0x1,
CXNameRange_WantTemplateArgs = 0x2,
CXNameRange_WantSinglePiece = 0x4
};
void AnnotateTokensWorker::HandlePostPonedChildCursor(
CXCursor Cursor, unsigned StartTokenIndex) {
const auto flags = CXNameRange_WantQualifier | CXNameRange_WantQualifier;
....
}
เบเบณเปเบเบทเบญเบ PVS-Studio: V501 เบกเบตเบชเปเบงเบเบเปเบญเบเบเบตเปเบเบทเบเบฑเบ 'CXNameRange_WantQualifier' เปเบเบเบฒเบเบเปเบฒเบ เปเบฅเบฐเบเบงเบฒเบเบญเบ '|' เบเบนเปเบเบฐเบเบญเบเบเบฒเบ. CIndex.cpp 7245
เปเบเบทเปเบญเบเบเบฒเบเบเบฒเบเบเบดเบกเบเบดเบ, เบเปเบฒเบเบปเบเบเบตเปเบเบตเปเบกเบตเบเบทเปเบเบฝเบงเบเบฑเบเบเบทเบเปเบเปเบชเบญเบเบเบฑเปเบ CXNameRange_WantQualifier.
Fragment N3: เบชเบฑเบเบชเบปเบเบเบฑเบเบเบณเบชเบฑเปเบเบเปเบญเบเปเปเบฒ
int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
....
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian() ? 1 : 0)
return 0;
....
}
เบเบณเปเบเบทเบญเบ PVS-Studio:
เปเบเบเบงเบฒเบกเบเบดเบเปเบซเบฑเบเบเบญเบเบเปเบญเบ, เบเบตเปเปเบกเปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเบชเบงเบเบเบฒเบกเบซเบผเบฒเบ. เปเบกเปเบเปเบฅเปเบง, เบเปเบญเบเบฎเบนเปเบงเปเบฒเบเปเบญเบเบกเบตเบเบงเบฒเบกเบเบดเบเบเบตเปเปเบเบเบเบฐเบซเบผเบฒเบเบเปเบฝเบงเบเบฑเบเบเบงเบฒเบกเบเบฒเบก :).
เปเบเบเบฑเบเบเบธเบเบฑเบ, เบญเบตเบเบเบฒเบก
(ISD == ISD::EXTRACT_VECTOR_ELT && (Index == ST->isLittleEndian())) ? 1 : 0
เบเบฒเบเบเบฑเบเบชเบฐเบเบฐเบเบฐเบเบดเบเบฑเบ, เปเบเบทเปเบญเบเปเบเบเบฑเปเบเบเปเบฒเบงเบเปเปเบกเบตเบเบงเบฒเบกเบซเบกเบฒเบ, เปเบเบฒเบฐเบงเปเบฒเบกเบฑเบเบชเบฒเบกเบฒเบเบซเบผเบธเบเบฅเบปเบเปเบเบฑเบ:
(ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian())
เบเบตเปเปเบกเปเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเบเบฑเบเปเบเบ. เบชเปเบงเบเบซเบผเบฒเบเบญเบฒเบเบเบฐ, เบเบงเบเปเบเบปเบฒเบเปเบญเบเบเบฒเบเบเบฝเบเบเบฝเบ 0/1 เบเบฑเบเบเบปเบงเปเบ เบเบฑเบเบเบฐเบเบต. เปเบเบทเปเบญเปเบเปเปเบเบฅเบฐเบซเบฑเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบกเบงเบปเบเปเบฅเบฑเบเบเบฐเบกเบฒเบเบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบ ternary:
if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))
เปเบเบเบงเบดเบเบตเบเบฒเบเบเบฒเบ, เบเบนเปเบเบฐเบเบญเบเบเบฒเบ ternary เปเบกเปเบเบญเบฑเบเบเบฐเบฅเบฒเบเบซเบผเบฒเบเปเบฅเบฐ provokes เบเบงเบฒเบกเบเบดเบเบเบฒเบเบขเปเบฒเบเบกเบตเปเบซเบเบเบปเบ. เบเบปเปเบเบฅเบฐเบกเบฑเบเบฅเบฐเบงเบฑเบเบเบฑเบเบกเบฑเบ เปเบฅเบฐเบขเปเบฒเปเบฅเบเบกเบฒเบเบเบฑเบเบงเบปเบเปเบฅเบฑเบ. เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบเบดเปเบเบซเบปเบงเบเปเปเบเบตเปเปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบก
Fragment N4, N5: เบเบปเบงเบเบตเป Null
Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
....
TypedInit *LHS = dyn_cast<TypedInit>(Result);
....
LHS = dyn_cast<TypedInit>(
UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get())
->Fold(CurRec));
if (!LHS) {
Error(PasteLoc, Twine("can't cast '") + LHS->getAsString() +
"' to string");
return nullptr;
}
....
}
เบเบณเปเบเบทเบญเบ PVS-Studio:
เบเปเบฒเบเบปเบงเบเบตเป LHS เปเบกเปเบ null, เบเบฒเบเปเบเบทเบญเบเปเบเบเบงเบเปเบเปเบฎเบฑเบเบเบฒเบเบญเบญเบ. เปเบเบงเปเบเบเปเปเบเบฒเบก, เปเบเบเบเบตเปเบเบฐ, เบเบปเบงเบเบตเป null เบเบฝเบงเบเบฑเบเบเบตเปเบเบฐเบเบทเบเบญเปเบฒเบเบญเบตเบ: LHS->getAsString().
เบเบตเปเปเบกเปเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบปเบเบเบฐเบเบดเบซเบผเบฒเบเปเบกเบทเปเบญเบเปเปเบเบดเบเบเบฒเบเบเบทเบเปเบเบทเปเบญเบเปเบงเปเปเบเบเบปเบงเบเบฑเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ, เปเบเบฒเบฐเบงเปเบฒเบเปเปเบกเบตเปเบเบเบปเบเบชเบญเบเบเบงเบเบกเบฑเบ. เบเบฒเบเบงเบดเปเบเบฒเบฐเบเบปเบเบเบตเปเบเบงเบเปเบเบดเปเบเบฅเบฐเบซเบฑเบเบเบตเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเปเบเบฑเบเบซเบกเบปเบ, เบเปเปเบงเปเบฒเบกเบฑเบเบเบทเบเปเบเปเปเบฅเบทเปเบญเบเปเปเบเบปเปเบฒเปเบ. เบเบตเปเปเบกเปเบเบเบปเบงเบขเปเบฒเบเบเบตเปเบเบตเบซเบผเบฒเบเบเบญเบเบงเบดเบเบตเบเบฒเบเบงเบดเปเบเบฒเบฐเบชเบฐเบเบดเบเปเบซเปเบชเบปเบกเบเบนเบเปเบเบเบญเบทเปเบเปเปเบเบเบฒเบเบเบปเบเบชเบญเบเปเบฅเบฐเปเบเบฑเบเบเบดเบเบเบฒเบเบเปเบญเบเบเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ.
เบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบฒเบเบเบฑเบเบเบฒเบเบเบปเบงเบเบตเปเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ เบฎเบฎ เบญเบฐเบเบธเบเบฒเบเปเบซเปเบขเบนเปเปเบเบฅเบฐเบซเบฑเบเบเปเบฒเบเบฅเบธเปเบกเบเบตเป: V522 [CWE-476] เบเบฒเบเบเบฐเบเบดเปเบชเบเบเบปเบงเบเบตเป null 'RHS' เบญเบฒเบเบเบฐเปเบเบตเบเบเบถเปเบ. TGParser.cpp 2186
Fragment N6: เบเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบเบตเปเบซเบผเบฑเบเบเบฒเบเบเบฒเบเปเบเบทเปเบญเบเบเปเบฒเบ
static Expected<bool>
ExtractBlocks(....)
{
....
std::unique_ptr<Module> ProgClone = CloneModule(BD.getProgram(), VMap);
....
BD.setNewProgram(std::move(ProgClone)); // <=
MiscompiledFunctions.clear();
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first); // <=
assert(NewF && "Function not found??");
MiscompiledFunctions.push_back(NewF);
}
....
}
เบเปเบฒเปเบเบทเบญเบ PVS-Studio: V522 [CWE-476] เบเบฒเบเบเบฐเบเบดเปเบชเบเบเบฒเบเบญเปเบฒเบเบญเบตเบเบเบญเบเบเบปเบงเบเบตเป null 'ProgClone' เบญเบฒเบเบเบฐเปเบเบตเบเบเบถเปเบ. Miscompilation.cpp 601
เปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบเบเบปเบงเบเบตเปเบเบตเปเบชเบฐเบซเบผเบฒเบ ProgClone เบขเบธเบเบเบฒเบเปเบเบฑเบเปเบเบปเปเบฒเบเบญเบเบงเบฑเบเบเบธ:
BD.setNewProgram(std::move(ProgClone));
เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เปเบเบเบฑเบเบเบธเบเบฑเบ ProgClone เปเบเบฑเบเบเบปเบงเบเบตเป null. เบเบฑเปเบเบเบฑเปเบ, เบเบฒเบเบญเปเบฒเบเบญเบตเบเบเบปเบงเบเบตเป null เบเบงเบเปเบเบตเบเบเบถเปเบเบขเบนเปเบเปเบฒเบเบฅเบธเปเบกเบเบตเป:
Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);
เปเบเป, เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เบเบตเปเบเบฐเบเปเปเปเบเบตเบเบเบถเปเบ! เปเบซเปเบชเบฑเบเปเบเบเบงเปเบฒ loop เบเปเปเปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบเบเบปเบงเบเบดเบ.
เปเบเบเบญเบเบเบปเปเบเบเบญเบเบเบฑเบ MiscompiledFunctions เบฅเบถเบเบฅเปเบฒเบ:
MiscompiledFunctions.clear();
เบเปเปเปเบ, เบเบฐเบซเบเบฒเบเบเบญเบเบเบฑเบเบเบตเปเบเบทเบเบเปเบฒเปเบเปเปเบเบชเบฐเบเบฒเบ loop:
for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
เบกเบฑเบเบเปเบฒเบเบเบตเปเบเบฐเปเบซเบฑเบเบงเปเบฒ loop เบเปเปเปเบเปเปเบฅเบตเปเบกเบเบปเปเบ. เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบดเบเบงเปเบฒเบเบตเปเบเบฑเบเปเบเบฑเบ 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 'เบเบฒเบเบเบปเบเบชเบญเบ' เบญเบฒเบเบเบฐเปเบเบตเบเบเบถเปเบ. Miscompilation.cpp 709
เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบฝเบงเบเบฑเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ. เปเบเบเบญเบเบเปเบฒเบญเบดเบ, เปเบเบทเปเบญเปเบเบเบญเบเบงเบฑเบเบเบธเปเบเปเบเบทเบเบเปเบฒเบ, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบกเบฑเบเบเบทเบเบเปเบฒเปเบเปเบเบทเบเบฑเบเบงเปเบฒเบเปเปเบกเบตเบซเบเบฑเบเปเบเบตเบเบเบถเปเบ. เบเปเบญเบเปเบซเบฑเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเปเบฅเบทเปเบญเบเปเปเบเบฅเบฐเบซเบฑเบเปเบเบผเปเบเบผเบกเบซเบผเบฑเบเบเบฒเบเบเบฒเบเปเบเบทเปเบญเบเปเบซเบง semantics เบเบฒเบเบปเบเบขเบนเปเปเบ C ++. เบเบตเปเปเบกเปเบเปเบซเบเบเบปเบเบเบตเปเบเปเบญเบเบฎเบฑเบเบเบฒเบชเบฒ C ++! เบกเบตเบงเบดเบเบตเปเปเปเปเบซเบผเบฒเบเบเบถเปเบเปเบเบทเปเบญเบเบดเบเบเบฒเบเบญเบเปเบเบปเปเบฒเปเบญเบ. เปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio เบชเบฐเปเบซเบกเบตเบเบฐเบกเบตเบเบฒเบเปเบฎเบฑเบเบงเบฝเบ :).
Fragment N8: เบเบปเบงเบเบตเป Null
void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol) {
uint32_t TypeId = Symbol.getTypeId();
auto Type = Symbol.getSession().getSymbolById(TypeId);
if (Type)
Printer << "<unknown-type>";
else
Type->dump(*this);
}
เบเบฒเบเปเบเบทเบญเบ PVS-Studio: V522 [CWE-476] เบเบฒเบเบเบฐเบเบดเปเบชเบเบเบฒเบเบญเปเบฒเบเบญเบตเบเบเบญเบเบเบปเบงเบเบตเป null 'เบเบฐเปเบเบ' เบญเบฒเบเบเบฐเปเบเบตเบเบเบถเปเบ. PrettyFunctionDumper.cpp 233
เบเบญเบเปเปเบทเบญเปเบเบเบฒเบเบเบปเบงเบเบฑเบเบเบฒเบเบเปเปเบเบดเบเบเบฒเบ, เบเบฒเบเปเบเปเบเบฑเบเบซเบฒเบเบฒเบเบเบดเบกเบญเบญเบเปเปเบฒเบเบปเบเบเบฐเบเบดเปเบกเปเบเบเปเปเปเบเปเบเบปเบเบชเบญเบ. เบเบงเบเปเบฎเบปเบฒเบกเบตเบเบฝเบเปเบเปเบเปเบฅเบฐเบเบตเบเบฑเปเบเบเปเบฒเบงเบเปเบญเบเบเบงเบเปเบฎเบปเบฒ. เบเบฑเบเบเบฑเบเปเบกเปเบเบฅเปเบเปเบฒเบเบนเปเปเบเป, เบเบนเปเบเบตเป, เปเบเบเบเบตเปเบเบฐเปเบเปเปเบเบเบฑเบเบซเบฒเบเบญเบเบฅเบฒเบง, เบเบฐเบเบทเบเบเบฑเบเบเบฑเบเปเบซเปเปเบเปเปเบ.
เบเบทเบเบเปเบญเบ:
if (Type)
Type->dump(*this);
else
Printer << "<unknown-type>";
Fragment N9: เบเบปเบงเบเบตเป Null
void SearchableTableEmitter::collectTableEntries(
GenericTable &Table, const std::vector<Record *> &Items) {
....
RecTy *Ty = resolveTypes(Field.RecType, TI->getType());
if (!Ty) // <=
PrintFatalError(Twine("Field '") + Field.Name + "' of table '" +
Table.Name + "' has incompatible type: " +
Ty->getAsString() + " vs. " + // <=
TI->getType()->getAsString());
....
}
เบเบฒเบเปเบเบทเบญเบ PVS-Studio: V522 [CWE-476] เบเบฒเบเบเบฐเบเบดเปเบชเบเบเบปเบงเบเบตเป null 'Ty' เบญเบฒเบเบเบฐเปเบเบตเบเบเบถเปเบ. SearchableTableEmitter.cpp 614
เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบดเบเบงเปเบฒเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบกเปเบเบเบฐเปเบเปเบเปเบฅเบฐเบเปเปเบฎเบฝเบเบฎเปเบญเบเปเบซเปเบกเบตเบเปเบฒเบญเบฐเบเบดเบเบฒเบ.
Fragment 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;
Fragment 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:
เบเบปเบงเบเบตเปเบงเบฑเบ เปเบ เปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบเปเบกเปเบ dereferenced เปเบเปเบงเบฅเบฒเปเบญเบตเปเบเบงเปเบฒเบซเบเปเบฒเบเบตเป เปเบเปเบฎเบฑเบTTI.
เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบกเบฑเบ turns เปเบซเปเปเบซเบฑเบเบงเปเบฒเบเบปเบงเบเบตเปเบเบตเปเบเบงเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบงเบเบชเบญเบเบเบงเบฒเบกเบชเบฐเปเบซเบกเบตเบเบฒเบ nullptr:
if (!Callee || Callee->isDeclaration())
เปเบเปเบกเบฑเบเบเปเบฒเปเบเบตเบเปเบโฆ
Fragment N13 - N...: เบเบฒเบเบเบงเบเบชเบญเบเบเบปเบงเบเบตเปเบซเบผเบฑเบเบเบฒเบเบเบฒเบเบญเปเบฒเบเบญเบดเบ
เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบชเบปเบเบเบฐเบเบฒเบขเบนเปเปเบเบเบดเปเบเบฅเบฐเบซเบฑเบเบเบตเปเบเปเบฒเบเบกเบฒเปเบกเปเบเบเปเปเปเบเบฑเบเปเบญเบเบฐเบฅเบฑเบ. เบกเบฑเบเบเบฒเบเบปเบเบขเบนเปเบเบตเป:
static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
bool isBinary, bool isPrecise = false) {
....
Function *CalleeFn = CI->getCalledFunction();
StringRef CalleeNm = CalleeFn->getName(); // <=
AttributeList CalleeAt = CalleeFn->getAttributes();
if (CalleeFn && !CalleeFn->isIntrinsic()) { // <=
....
}
เบเบณเปเบเบทเบญเบ PVS-Studio: V595 [CWE-476] เบเบปเบงเบเบตเป 'CalleeFn' เบเบทเบเบเบณเปเบเปเบเปเบญเบเบเบตเปเบกเบฑเบเบเบฐเบเบทเบเบขเบทเบเบขเบฑเบเบเปเปเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 1079, 1081. SimplifyLibCalls.cpp 1079
เปเบฅเบฐเบเบตเป:
void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
const Decl *Tmpl, Decl *New,
LateInstantiatedAttrVec *LateAttrs,
LocalInstantiationScope *OuterMostScope) {
....
NamedDecl *ND = dyn_cast<NamedDecl>(New);
CXXRecordDecl *ThisContext =
dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()); // <=
CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(),
ND && ND->isCXXInstanceMember()); // <=
....
}
เบเปเบฒเปเบเบทเบญเบ PVS-Studio: V595 [CWE-476] เบเบปเบงเบเบตเป 'ND' เบเบทเบเปเบเปเบเปเบญเบเบเบตเปเบกเบฑเบเบเบฐเบเบทเบเบขเบทเบเบขเบฑเบเบเปเปเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเปเบชเบฑเปเบ: 532, 534. SemaTemplateInstantiateDecl.cpp 532
เปเบฅเบฐเบเบตเป:
- V595 [CWE-476] เบเบปเบงเบเบตเป 'U' เบเบทเบเบเปเบฒเปเบเปเบเปเบญเบเบเบตเปเบเบฐเปเบเปเบฎเบฑเบเบเบฒเบเบขเบฑเปเบเบขเบทเบเบเปเปเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเปเบชเบฑเปเบ: 404, 407. DWARFormValue.cpp 404
- V595 [CWE-476] เบเบปเบงเบเบตเป 'ND' เบเบทเบเบเบณเปเบเปเบเปเบญเบเบเบตเปเบกเบฑเบเบเบฐเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเปเบชเบฑเปเบ: 2149, 2151. SemaTemplateInstantiate.cpp 2149
เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบญเบเบเปเปเบเปเปเบชเบปเบเปเบเปเบเบเบฒเบเบชเบถเบเบชเบฒเบเปเบฒเปเบเบทเบญเบเบเบตเปเบกเบตเบซเบกเบฒเบเปเบฅเบ V595. เบชเบฐเบเบฑเปเบเบเปเบญเบเบเปเปเบฎเบนเปเบงเปเบฒเบกเบตเบเปเปเบเบดเบเบเบฒเบเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเบซเบผเบฒเบเบเบงเปเบฒเบเบตเปเบฅเบฐเบเบธเปเบงเปเบขเบนเปเบเบตเปเบเบตเป. เบชเปเบงเบเบซเบผเบฒเบเบญเบฒเบเบเบฐเปเบเบฑเบ.
Fragment 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:
เบกเบฑเบเบญเบฒเบเบเบฐเบเปเปเปเบเบฑเบ bug เปเบฅเบฐเบฅเบฐเบซเบฑเบเปเบฎเบฑเบเบงเบฝเบเปเบเปเบเบญเบเบเบฒเบกเบเบธเบเบเบฐเบชเบปเบ. เปเบเปเบเบตเปเบขเปเบฒเบเบเบฑเบเปเบเบเปเบเบฑเบเบชเบฐเบเบฒเบเบเบตเปเบเบตเปเบซเบเปเบฒเบชเบปเบเปเบชเบซเบผเบฒเบเปเบฅเบฐเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบงเบเบเบฒ.
เปเบซเปเปเบงเบปเปเบฒเบงเปเบฒเบเบปเบงเปเบ เปเบฅเบทเบญเบเบเบฐเบซเบเบฒเบ เปเบกเปเบเปเบเบปเปเบฒเบเบฑเบ 16, เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบนเปเบเบฝเบเบฅเบฐเบซเบฑเบเบเบตเปเบงเบฒเบเปเบเบเบเบตเปเบเบฐเปเบเปเบฎเบฑเบเบกเบฑเบเบขเบนเปเปเบเบเบปเบงเปเบ NImms เบเบงเบฒเบกโเบซเบกเบฒเบ:
1111111111111111111111111111111111111111111111111111111111100000
เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เบเบปเบเปเบเปเบฎเบฑเบเบเบฐเปเบเบฑเบ:
0000000000000000000000000000000011111111111111111111111111100000
เบเบงเบฒเบกเบเบดเบเปเบฅเปเบงเปเบกเปเบเบงเปเบฒเบเบฒเบเบเบดเบเปเบฅเปเบเบฑเบเบซเบกเบปเบเปเบเบตเบเบเบถเปเบเปเบเบเปเบเปเบเบฐเปเบเบ 32-bit unsigned. เปเบฅเบฐเบเบฝเบเปเบเปเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบฐเปเบเบ 32-bit unsigned เบเบตเปเบเบฐเปเบเปเบฎเบฑเบเบเบฒเบเบเบฐเบซเบเบฒเบ implicitly เบเบฑเบ uint64_t. เปเบเบเปเบฅเบฐเบเบตเบเบตเป, bits เบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบเบเบฐเปเบเบฑเบเบชเบนเบ.
เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเปเปเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเปเบเบฑเปเบเบเบตเป:
uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;
เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ: V629 [CWE-190] เบเบดเบเบฒเบฅเบฐเบเบฒเบเบงเบเบชเบญเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบ 'Immr << 6'. เบเบฒเบเบเปเบฝเบเบเบดเบเบเบญเบเบเปเบฒ 32-bit เบเปเบงเบเบเบฒเบเบเบฐเบซเบเบฒเบเบเปเปเปเบเปเบเบฑเบเบเบฐเปเบเบ 64-bit. AArch64AddressingModes.h 269
Fragment 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: เบชเบตเป typos เบเบญเบเบเบฐเปเบเบเบเบฝเบงเบเบฑเบ
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] เบชเบฒเบเบเบทเบเปเบเบทเปเบญเบกเปเบเบปเปเบฒเบเบฑเบเปเบเปเบเปเปเปเบเปเปเบเป. เบเบดเบเบฒเบฅเบฐเบเบฒเบเบงเบเบชเบญเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบ 'Result + "(ObjC Class)" + Name.str()'. Symbol.cpp 35
- V655 [CWE-480] เบชเบฒเบเบเบทเบเปเบเบทเปเบญเบกเปเบเบปเปเบฒเบเบฑเบเปเบเปเบเปเปเปเบเปเปเบเป. เบเบดเบเบฒเบฅเบฐเบเบฒเบเบงเบเบชเบญเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบ 'Result + "(ObjC Class EH)" + Name.str()'. Symbol.cpp 38
- V655 [CWE-480] เบชเบฒเบเบเบทเบเปเบเบทเปเบญเบกเปเบเบปเปเบฒเบเบฑเบเปเบเปเบเปเปเปเบเปเปเบเป. เบเบดเบเบฒเบฅเบฐเบเบฒเบเบงเบเบชเบญเบเบเบฒเบเบชเบฐเปเบเบเบญเบญเบ 'Result + "(ObjC IVar)" + Name.str()'. Symbol.cpp 41
เปเบเบเบเบฑเบเปเบญเบตเบ, เบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบ + เบเบทเบเปเบเปเปเบเบเบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบ +=. เบเบปเบเปเบเปเบฎเบฑเบเปเบกเปเบเบเบฒเบเบญเบญเบเปเบเบเบเบตเปเบเปเปเบกเบตเบเบงเบฒเบกเบซเบกเบฒเบ.
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
เบเบตเปเปเบกเปเบเบฅเบฐเบซเบฑเบเบเบตเปเปเบเบเบเบฐเบซเบผเบฒเบเบซเบผเบฒเบเบเบตเปเบเบฒเบเบปเบเบงเปเบฒเบกเบตเบเบงเบฒเบกเบเบดเบเบเบฒเบเบขเปเบฒเบเบกเบตเปเบซเบเบเบปเบ. เปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบ, เบกเบตเบเบฒเบเบเปเบฝเบเปเบเบ เบเบฒเบเบเบฑเบเบเปเบฒเปเบซเบเปเบ เบเปเบฒเบเบทเบเบกเบญเบเปเบฒเบเบเบถเปเบเบเบฑเบเปเบเบทเปเบญเบเปเบ. เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฒเบเบกเบญเบเบซเบกเบฒเบเปเบเบตเบเบเบถเปเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ, เปเบเปเปเบเบเบฑเบเบเบธเบเบฑเบเปเบเบเบเปเปเบกเบตเบเบฒเบเบเบงเบเบเบฒเปเบเป.
เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเปเบเปเบเบตเปเบเบตเป:
- 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 เบเปเปเบกเบตเบเบงเบฒเบกเบซเบกเบฒเบเปเบเบฒเบฐเบงเปเบฒเบเปเบฒ เปเบฅเบเบเบฐเบเบฝเบ > 13, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฑเบเบเบฑเบเบเบฐเบชเปเบฒเปเบฅเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบกเบฑเบ.
เบกเบตเบเบฒเบเปเบเบทเบญเบเปเบเบญเบทเปเบเปเบเปเบฒเบเบงเบเบซเบผเบฒเบเบเบตเปเบกเบต 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] เบเบงเบเบเบปเบเบฅเบฐเบซเบฑเบเบเบตเปเบเปเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเป. เบกเบฑเบเปเบเบฑเบเปเบเปเบเปเบงเปเบฒเบกเบตเบเปเปเบเบดเบเบเบฒเบเปเบเบตเบเบเบถเปเบ. LLParser.cpp 835
เบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบซเบเปเบฒเบชเบปเบเปเบ. เบกเบฒเปเบเบดเปเบเบชเบฐเบเบฒเบเบเบตเปเบเบตเปเบเปเบญเบ:
return ParseTypeIdEntry(SummaryID);
break;
เบขเบนเป glance เบเปเบฒเบญเบดเบ, เบกเบฑเบเปเบเบดเปเบเบเบทเบงเปเบฒเบเปเปเบกเบตเบเปเปเบเบดเบเบเบฒเบเบขเบนเปเบเบตเปเบเบตเป. เปเบเบดเปเบเบเบทเบงเปเบฒเบเบนเปเบเบฐเบเบดเบเบฑเบเบเบฒเบ เบเบฑเบเบเปเบญเบ เบกเบตเบญเบฑเบเบเบดเปเบชเบเบขเบนเปเบเบตเปเบเบตเป, เปเบฅเบฐเบเปเบฒเบเบเบฝเบเปเบเปเบชเบฒเบกเบฒเบเบฅเบถเบเบกเบฑเบเปเบเป. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเปเปเปเบกเปเบเบเบฑเบเบซเบกเบปเบเบเปเบฒเบเบเบฒเบเบเบฑเปเบเบเบฑเปเบ.
เบเบฑเบเบงเบดเปเบเบฒเบฐเบญเบญเบเบเปเบฒเปเบเบทเบญเบเบเปเบฝเบงเบเบฑเบเบชเบฒเบ:
Lex.setIgnoreColonInIdentifiers(false);
return false;
เปเบฅเบฐเปเบเปเบเบดเบเปเบฅเปเบง, เบฅเบฐเบซเบฑเบเบเบตเปเปเบกเปเบเบเปเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเบซเบฒเปเบเป. เบเบธเบเปเบเปเบฅเบฐเบเบตเปเบ เบชเบฐเบซเบผเบฑเบ เบชเบดเปเบเบชเบธเบเบเปเบงเบเบเบฒเบเปเบเบเบฒเบเบเบนเปเบเบฐเบเบญเบเบเบฒเบ เบเบฒเบเบเบฑเบเบเบทเบเบกเบฒ. เปเบฅเบฐเบเบฝเบงเบเบตเปเบฎเบนเปเบชเบถเบเปเบเบเบเปเบฝเบง เบเบฑเบเบเปเบญเบ เปเบเบดเปเบโเบเบทโเบงเปเบฒโเบเปเปโเปเบเบฑเบโเบญเบฑเบโเบเบฐโเบฅเบฒเบโ! เบเบฒเบเบเบตเบซเบเบถเปเบเบเบญเบเบชเบฒเบเบฒเบเบงเบเบเบฐเบชเบดเปเบเบชเบธเบเบเปเบงเบ เบเบฑเบเบเปเบญเบ, เบเปเปเปเบกเปเบ เบเบฒเบเบเบฑเบเบเบทเบเบกเบฒ?
Fragment N33: เบฃเบตเปเบเบฑเบเปเบเบเบชเบธเปเบกเบเบญเบเบเบดเบเบชเบนเบ
unsigned getStubAlignment() override {
if (Arch == Triple::systemz)
return 8;
else
return 1;
}
Expected<unsigned>
RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
const SectionRef &Section,
bool IsCode) {
....
uint64_t DataSize = Section.getSize();
....
if (StubBufSize > 0)
DataSize &= ~(getStubAlignment() - 1);
....
}
เบเบณเปเบเบทเบญเบ PVS-Studio:
เบเบฐเบฅเบธเบเบฒเบชเบฑเบเปเบเบเบงเปเบฒเบซเบเปเบฒเบเบตเป getStubAlignment เบเบฐเปเบเบเบเบปเบเบเบญเบเปเบเบ เบฅเบปเบเบเบฒเบก. เปเบซเปเบเบดเบเปเบฅเปเบเปเบฒเบเบญเบ expression เปเบเบเบชเบปเบกเบกเบธเบเบงเปเบฒ function เปเบซเปเบเปเบฒ 8:
~(getStubAlignment() - 1)
~(8u-1)
0xFFFFFFFF8u
เปเบเบเบฑเบเบเบธเบเบฑเบเบชเบฑเบเปเบเบเปเบซเบฑเบเบงเปเบฒเบเบปเบงเปเบ เบเบฐเปเบฒเบเบเปเปเบกเบนเบ เบกเบตเบเบฐเปเบเบ 64-bit unsigned. เบกเบฑเบเบเบฐเบเบปเบเบงเปเบฒเปเบกเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ DataSize & 0xFFFFFFFF8u, เบเบฑเบเบชเบฒเบกเบชเบดเบเบชเบญเบเบเบดเบเบเปเบฒเบชเบฑเปเบเบชเบนเบเบเบฐเบเบทเบเบเบฑเปเบเปเบซเบกเปเปเบเบฑเบเบชเบนเบ. เบชเปเบงเบเบซเบผเบฒเบเบญเบฒเบเบเบฐ, เบเบตเปเบเปเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบเบฑเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบเปเบญเบเบเบฒเบ. เบเปเบญเบเบชเบปเบเปเบชเบงเปเบฒเบฅเบฒเบงเบเปเบญเบเบเบฒเบเบเบดเบเปเบฅเป: DataSize & 0xFFFFFFFFFFFFFF8u.
เปเบเบทเปเบญเปเบเปเปเบเบเปเปเบเบดเบเบเบฒเบ, เบเปเบฒเบเบเบงเบเบเบฝเบเบเบตเป:
DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);
เบซเบผเบทเบเบฑเปเบเบเบฑเปเบ:
DataSize &= ~(getStubAlignment() - 1ULL);
Fragment N34: เบเบฒเบเบชเบปเปเบเบชเบฑเบเบเบฒเบเบเบฐเปเบเบเบเบตเปเบเบฑเบเปเบเบเบเปเปเบชเบณเปเบฅเบฑเบ
template <typename T>
void scaleShuffleMask(int Scale, ArrayRef<T> Mask,
SmallVectorImpl<T> &ScaledMask) {
assert(0 < Scale && "Unexpected scaling factor");
int NumElts = Mask.size();
ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
....
}
เบเบณเปเบเบทเบญเบ PVS-Studio:
เบเบฒเบเปเบเบเบเบฐเปเบเบเบเบตเปเบเบฑเบเปเบเบเบเบทเบเบเปเบฒเปเบเปเปเบเบทเปเบญเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบ overflow เปเบกเบทเปเบญเบเบนเบเบเบปเบงเปเบเบเบฐเปเบเบ 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;
เบญเบฒเบเบดเบงเปเบกเบฑเบเบเบฑเบเบเบฑเบเบเปเบฝเบเปเบเบ. เบซเบกเบปเบโเปเบเบปเปเบฒโเบเบตเป. เบเบฒเบเปเบเปเบเบฝเบเบเบตเปเบเปเปเปเบเปเปเบเปเบญเบตเบเบเปเปเปเบ. เบชเปเบงเบเบซเบผเบฒเบเปเบฅเปเบง เปเบเบปเปเบฒเบเบงเบเบเบฝเบเปเบเบเบเบตเป:
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 424
เบชเบฐเบเบฒเบเบฐเบเบฒเบเปเบกเปเบเบเปเบฒเบเบเบทเบเบฑเบเบเบฑเบเบเบตเปเบเปเบฒเบเบกเบฒ. เบกเบฑเบเบเบงเบเบเบฐเบเบฝเบเบงเปเบฒ:
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] เบเบปเบงเบเบตเป 'Ptr' เบเบทเบเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 729, 738. TargetTransformInfoImpl.h 738
เบเบปเบงเบเปเบฝเบเปเบเบ Ptr เบญเบฒเบเบเบฐเปเบเบปเปเบฒเบเบฝเบกเบเบฑเบ nullptrเบเบฑเปเบเบเบตเปเบเบดเบชเบนเบเปเบเปเบงเปเบฒ:
if (Ptr != nullptr)
เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเปเบฒเบเบฅเบธเปเบกเบเบตเปเบเบปเบงเบเบตเปเบเบตเปเปเบกเปเบ dereferenceed เปเบเบเบเปเปเบกเบตเบเบฒเบเบเบงเบเบชเบญเบเปเบเบทเปเบญเบเบเบปเปเบ:
auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());
เปเบซเปเบเบดเบเบฒเบฅเบฐเบเบฒเบเปเบฅเบฐเบเบตเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเบญเบทเปเบ.
llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
bool Stub) {
....
auto *FD = dyn_cast<FunctionDecl>(GD.getDecl());
SmallVector<QualType, 16> ArgTypes;
if (FD) // <=
for (const ParmVarDecl *Parm : FD->parameters())
ArgTypes.push_back(Parm->getType());
CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); // <=
....
}
เบเปเบฒเปเบเบทเบญเบ PVS-Studio: V1004 [CWE-476] เบเบปเบงเบเบตเป 'FD' เบเบทเบเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 3228, 3231. CGDebugInfo.cpp 3231
เปเบญเบปเบฒเปเบเปเบชเปเบเบฑเบเปเบเบทเปเบญเบเบซเบกเบฒเบ FD. เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบเบงเปเบฒเบเบฑเบเบซเบฒเปเบกเปเบเปเบซเบฑเบเปเบเปเบเบฑเบเปเบเบเปเบฅเบฐเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบกเบตเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบเบดเปเบชเบ.
เปเบฅเบฐเปเบเบตเปเบกเปเบเบตเบก:
static void computePolynomialFromPointer(Value &Ptr, Polynomial &Result,
Value *&BasePtr,
const DataLayout &DL) {
PointerType *PtrTy = dyn_cast<PointerType>(Ptr.getType());
if (!PtrTy) { // <=
Result = Polynomial();
BasePtr = nullptr;
}
unsigned PointerBits =
DL.getIndexSizeInBits(PtrTy->getPointerAddressSpace()); // <=
....
}
เบเปเบฒเปเบเบทเบญเบ PVS-Studio: V1004 [CWE-476] เบเบปเบงเบเบตเป 'PtrTy' เบเบทเบเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเปเบชเบฑเปเบ: 960, 965. InterleavedLoadCombinePass.cpp 965
เบงเบดเบเบตเบเปเบญเบเบเบฑเบเบเบปเบงเปเบญเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบง? เปเบญเบปเบฒเปเบเปเบชเปเบซเบผเบฒเบเบเบถเปเบเบเปเบฝเบงเบเบฑเบ Code-Review เปเบฅเบฐเปเบเปเบเบปเบงเบงเบดเปเบเบฒเบฐเบชเบฐเบเบดเบ PVS-Studio เปเบเบทเปเบญเบเบงเบเปเบเบดเปเบเบฅเบฐเบซเบฑเบเบเบญเบเบเปเบฒเบเบขเปเบฒเบเปเบเบฑเบเบเบปเบเบเบฐเบเบด.
เบเปเปเบกเบตเบเบธเบเปเบเปเบเบเบฒเบเบญเปเบฒเบเปเบเบดเบเบเบดเปเบเบชเปเบงเบเบฅเบฐเบซเบฑเบเบญเบทเปเบเปเบเบตเปเบกเบตเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบญเบเบเบฐเปเบเบเบเบตเป. เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเบเบฐโเบเบฐโเปเบงเปโเบเบฝเบโเปเบเปโเบเบฑเบโเบเบตโเบฅเบฒเบโเบเบฒเบโเบเบญเบโเบเปเบฒโเปเบเบทเบญเบโเปเบโเบเบปเบโเบเบงเบฒเบกโ:
- V1004 [CWE-476] เบเบปเบงเบเบตเป 'Expr' เบเบทเบเบเปเบฒเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเปเบชเบฑเปเบ: 1049, 1078. DebugInfoMetadata.cpp 1078
- V1004 [CWE-476] เบเบปเบงเบเบตเป 'PI' เบเบทเบเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 733, 753. LegacyPassManager.cpp 753
- V1004 [CWE-476] เบเบปเบงเบเบตเป 'StatepointCall' เบเบทเบเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 4371, 4379. Verifier.cpp 4379
- V1004 [CWE-476] เบเบปเบงเบเบตเป 'RV' เบเบทเบเบเปเบฒเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 2263, 2268. TGParser.cpp 2268
- V1004 [CWE-476] เบเบปเบงเบเบตเป 'CalleeFn' เบเบทเบเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 1081, 1096. SimplifyLibCalls.cpp 1096
- V1004 [CWE-476] เบเบปเบงเบเบตเป 'TC' เบเบทเบเปเบเปเบขเปเบฒเบเบเปเปเบเบญเบเปเบเบซเบผเบฑเบเบเบฒเบเบกเบฑเบเบเบทเบเบเบงเบเบชเบญเบเบเบฑเบ nullptr. เบเบงเบเบชเบญเบเบชเบฒเบ: 1819, 1824. Driver.cpp 1824
เบเบดเปเบ N48-N60: เบเปเปเบชเปเบฒเบเบฑเบ, เปเบเปเบกเบตเบเปเปเบเบปเบเบเปเบญเบ (เบเบงเบฒเบกเบเบปเบเบเปเบฒเบเบตเปเบญเบฒเบเบเบฐเบฎเบปเปเบงเปเบซเบผ)
std::unique_ptr<IRMutator> createISelMutator() {
....
std::vector<std::unique_ptr<IRMutationStrategy>> Strategies;
Strategies.emplace_back(
new InjectorIRStrategy(InjectorIRStrategy::getDefaultOps()));
....
}
เบเบณเปเบเบทเบญเบ PVS-Studio:
เปเบเบทเปเบญเปเบเบตเปเบกเบญเบปเบเบเบฐเบเบญเบเปเบชเปเบเปเบฒเบเบเบญเบเบเบฑเบเบเบธเปเบเบฑเปเบ std:: vector > เบเปเบฒเบเบเปเปเบชเบฒเบกเบฒเบเบเบฝเบเปเบเปเบเบฝเบ xxx.push_back(X เปเปเป), เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเปเปเบกเบตเบเบฒเบเบเปเบฝเบเปเบเปเบซเบฅเบทเปเบญเบกเปเบช implicit เบเบฒเบ X* ะฒ std::unique_ptr.
เบเบฒเบเปเบเปเปเบเบเบปเปเบงเปเบเปเบกเปเบเบเบฒเบเบเบฝเบ xxx.emplace_back(X เปเปเป)เบเบฑเบเบเบฑเปเบเปเบเปเบกเบฑเบเบฅเบงเบเบฅเบงเบก: เบงเบดเบเบตเบเบฒเบ emplace_back เบเปเปเบชเปเบฒเบเบญเบปเบเบเบฐเบเบญเบเปเบเบเบเบปเบเบเบฒเบเบเบฒเบเปเบเปเบเบฝเบเบเบญเบเบกเบฑเบเปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบเบถเปเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเบเบปเบงเบชเปเบฒเบเบเบตเปเบเบฑเบเปเบเบ.
เบกเบฑเบเบเปเปเบเบญเบเปเบ. เบเปเบฒ vector เปเบกเปเบเปเบเบฑเบก, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเปเบเปเบเบทเบเบเบฑเบเบชเบฑเบเบเบทเบเปเบซเบกเป. เบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบฑเบเบชเบฑเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบญเบฒเบเบเบฐเบฅเบปเปเบกเปเบซเบฅเบง, เบชเบปเปเบเบเบปเบเปเบซเปเบเปเปเบเบปเบเปเบงเบฑเปเบเบเบทเบเบเบดเปเบก std::bad_alloc. เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบปเบงเบเบตเปเบเบฐเบชเบนเบเปเบชเบเปเบเปเบฅเบฐเบงเบฑเบเบเบธเบเบตเปเบชเปเบฒเบเบเบถเปเบเบเบฐเบเปเปเบเบทเบเบฅเบถเบ.
เบเบฒเบเปเบเปเปเบเบเบตเปเบเบญเบเปเบเปเบกเปเบเบเบฒเบเบชเปเบฒเบ unique_ptrเปเบเบดเปเบเบเบฐเปเบเบฑเบเปเบเบปเปเบฒเบเบญเบเบเบปเบงเบเบตเปเบเปเบญเบเบเบตเป vector เบเบฐเบเบฒเบเบฒเบกเบเบฑเบเบชเบฑเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ:
xxx.push_back(std::unique_ptr<X>(new X))
เบเบฑเปเบเปเบเป C++14, เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเป 'std::make_unique':
xxx.push_back(std::make_unique<X>())
เบเบฐเปเบเบเบเบญเบเบเปเปเบเบปเบเบเปเบญเบเบเบตเปเบเปเปเบชเปเบฒเบเบฑเบเบชเปเบฒเบฅเบฑเบ LLVM. เบเปเบฒเบเปเปเบชเบฒเบกเบฒเบเบเบฑเบเบชเบฑเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเปเบเป, compiler เบเบฐเบขเบธเบเบเบฝเบเปเบเป. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบชเปเบฒเบฅเบฑเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบตเปเบกเบตเบเบงเบฒเบกเบเบฒเบง
เบเบฑเปเบเบเบฑเปเบ, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบฅเบฐเบซเบฑเบเบเบตเปเบเปเปเปเบเปเปเบฎเบฑเบเปเบซเปเปเบเบตเบเปเบเบเบปเปเบกเบเบนเปเบเปเปเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเปเป LLVM, เบเปเบญเบเบเบปเบเบงเปเบฒเบกเบฑเบเปเบเบฑเบเบเบฐเปเบซเบเบเบเบตเปเบเบฐเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบฎเบนเบเปเบเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเปเบฅเบฐเบเบนเปเบงเบดเปเบเบฒเบฐ PVS-Studio เปเบเปเบฎเบฝเบเบฎเบนเปเปเบเบทเปเบญเบเปเบฒเบเบปเบเบกเบฑเบ.
เบเบฒเบเปเบเบทเบญเบเปเบเบญเบทเปเบเปเบเบญเบเบเบฐเปเบเบเบเบตเป:
- V1023 [CWE-460] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเบฑเบ 'Passes' เปเบเบเบงเบดเบเบต 'emplace_back'. เบเบฒเบเบฎเบปเปเบงเปเบซเบผเบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบ. PassManager.h 546
- V1023 [CWE-460] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเบฑเบ 'AAs' เปเบเบเบงเบดเบเบต 'emplace_back'. เบเบฒเบเบฎเบปเปเบงเปเบซเบผเบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบ. AliasAnalysis.h 324
- V1023 [CWE-460] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเบฑเบ 'Entry' เปเบเบเบงเบดเบเบต '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] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเบฑเบ 'Records' เปเบเบเบงเบดเบเบต 'emplace_back'. เบเบฒเบเบฎเบปเปเบงเปเบซเบผเบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบ. FDRlogBuilder.h 30
- V1023 [CWE-460] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเปเบญเบเบเบฑเบเบเบธ 'PendingSubmodules' เปเบเบเบงเบดเบเบต 'emplace_back'. เบเบฒเบเบฎเบปเปเบงเปเบซเบผเบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบ. ModuleMap.cpp 810
- V1023 [CWE-460] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเบฑเบ 'Objects' เปเบเบเบงเบดเบเบต '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] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเปเบญเบเบเบฑเบเบเบธ 'Operands' เปเบเบเบงเบดเบเบต 'emplace_back'. เบเบฒเบเบฎเบปเปเบงเปเบซเบผเบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบ. GlobalISelEmitter.cpp 1911
- V1023 [CWE-460] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเบฑเบ 'Stash' เปเบเบเบงเบดเบเบต 'emplace_back'. เบเบฒเบเบฎเบปเปเบงเปเบซเบผเบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบ. GlobalISelEmitter.cpp 2100
- V1023 [CWE-460] เบเบปเบงเบเบตเปเบเบตเปเบเปเปเบกเบตเปเบเบปเปเบฒเบเบญเบเบเบทเบเปเบเบตเปเบกเปเบชเปเบเบฑเบ 'Matchers' เปเบเบเบงเบดเบเบต 'emplace_back'. เบเบฒเบเบฎเบปเปเบงเปเบซเบผเบเบญเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบเบฐเปเบเบตเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเบฒเบเบเบปเบเปเบงเบฑเปเบ. GlobalISelEmitter.cpp 2702
เบชเบฐเบซเบฅเบธเบ
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบญเบญเบเบเปเบฒเปเบเบทเบญเบเบเบฑเบเบซเบกเบปเบ 60 เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบขเบธเบเปเบเบปเบฒ. เบกเบตเบเปเปเบเบปเบเบเปเบญเบเบญเบทเปเบเบเบตเปเปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio เบเบงเบเบเบปเบเปเบ LLVM เบเป? เปเบกเปเบเปเบฅเปเบง, เบเปเบญเบเบกเบต. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฝเบเบญเบญเบเบเบดเปเบเบชเปเบงเบเบฅเบฐเบซเบฑเบเบชเปเบฒเบฅเบฑเบเบเบปเบเบเบงเบฒเบก, เบกเบฑเบเปเบกเปเบเบเบญเบเปเบฅเบ, เบซเบผเบทเปเบกเปเบเบฐเบเบฑเปเบเบเบฒเบเบเบทเบ, เปเบฅเบฐเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบงเปเบฒเบกเบฑเบเปเบกเปเบเปเบงเบฅเบฒเบเบตเปเบเบฐเปเบเบซเบฒเบกเบฑเบเบเปเปเบกเบทเป.
เบเปเบญเบเบซเบงเบฑเบเบงเปเบฒเปเบเบปเปเบฒเบเบปเบเบงเปเบฒเบกเบฑเบเบซเบเปเบฒเบชเบปเบเปเบเปเบฅเบฐเบขเบฒเบเบฅเบญเบเปเบเบทเปเบญเบเบงเบดเปเบเบฒเบฐ PVS-Studio.
เบเปเบฒเบโเบชเบฒโเบกเบฒเบโเบเบฒเบงโเบโเปโเปเบซเบฅเบโเปเบเบทเปเบญเบโเบงเบดโเปเบเบฒเบฐโเปเบฅเบฐโเปเบเปโเบฎเบฑเบโเบเบตเปโเบชเปเบฒโเบเบฑเบ minesweeper เปเบเปโเบเบตเปโ
เบชเบดเปเบเบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบ, เปเบเปเบเบฒเบเบงเบดเปเบเบฒเบฐเบชเบฐเบเบดเบเปเบเบฑเบเบเบปเบเบเบฐเบเบด. เบเบงเบเบเบฑเปเบเบเบฝเบง, เบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบเบเบงเบเปเบฎเบปเบฒเปเบเบทเปเบญเบเบดเบเบปเบกเบงเบดเบเบตเบเบฒเบเบเบญเบเบเบฒเบเบงเบดเปเบเบฒเบฐ static เปเบฅเบฐ PVS-Studio เบเปเปเปเบกเปเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบปเบเบเบฐเบเบด.
เปเบเบเบเบตเปเบเบเบฒเบเบเบฑเบเบเบธเบเบเบธเบเบเบฐเบเบฒเบเปเบฅเบฐเบเบงเบฒเบกเบซเบเปเบฒเปเบเบทเปเบญเบเบทเบเบญเบเบฅเบฐเบซเบฑเบเบเบญเบเบเปเบฒเบ!
เบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบเปเบเปเบเบเบฑเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเบฑเบเบเบนเปเบเบปเบกเบเบตเปเปเบงเบปเปเบฒเบเบฒเบชเบฒเบญเบฑเบเบเบดเบ, เบเบฐเบฅเบธเบเบฒเปเบเปเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฒเบเปเบเบเบฒเบชเบฒ: Andrey Karpov.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com