ืžืฆื™ืืช ื‘ืื’ื™ื ื‘-LLVM 8 ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio

ืžืฆื™ืืช ื‘ืื’ื™ื ื‘-LLVM 8 ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio
ื™ื•ืชืจ ืžืฉื ืชื™ื™ื ื—ืœืคื• ืžืื– ื‘ื“ื™ืงืช ื”ืงื•ื“ ื”ืื—ืจื•ื ื” ืฉืœ ืคืจื•ื™ืงื˜ LLVM ื‘ืืžืฆืขื•ืช ืžื ืชื— ื”-PVS-Studio ืฉืœื ื•. ื‘ื•ืื• ื ื•ื•ื“ื ืฉื”ื ืชื— PVS-Studio ื”ื•ื ืขื“ื™ื™ืŸ ื›ืœื™ ืžื•ื‘ื™ืœ ืœื–ื™ื”ื•ื™ ืฉื’ื™ืื•ืช ื•ืคื’ื™ืขื•ื™ื•ืช ืคื•ื˜ื ืฆื™ืืœื™ื•ืช. ืœืฉื ื›ืš, ื ื‘ื“ื•ืง ื•ื ืžืฆื ืฉื’ื™ืื•ืช ื—ื“ืฉื•ืช ื‘ืžื”ื“ื•ืจืช LLVM 8.0.0.

ืžืืžืจ ืฉื™ื™ื›ืชื‘

ืœืžืขืŸ ื”ืืžืช, ืœื ืจืฆื™ืชื™ ืœื›ืชื•ื‘ ืืช ื”ืžืืžืจ ื”ื–ื”. ืœื ืžืขื ื™ื™ืŸ ืœื›ืชื•ื‘ ืขืœ ืคืจื•ื™ืงื˜ ืฉื›ื‘ืจ ื‘ื“ืงื ื• ื›ืžื” ืคืขืžื™ื (1, 2, 3). ืขื“ื™ืฃ ืœื›ืชื•ื‘ ืขืœ ืžืฉื”ื• ื—ื“ืฉ, ืื‘ืœ ืื™ืŸ ืœื™ ื‘ืจื™ืจื”.

ื‘ื›ืœ ืคืขื ืฉืžืชืคืจืกืžืช ืื• ืžืชืขื“ื›ื ืช ื’ืจืกื” ื—ื“ืฉื” ืฉืœ LLVM ืžื ืชื— ืกื˜ื˜ื™ ืงืœืื ื’, ืื ื• ืžืงื‘ืœื™ื ื‘ื“ื•ืืจ ืฉืœื ื• ืฉืืœื•ืช ืžื”ืกื•ื’ ื”ื‘ื:

ืชืจืื”, ื”ื’ืจืกื” ื”ื—ื“ืฉื” ืฉืœ Clang Static Analyzer ืœืžื“ื” ืœืžืฆื•ื ืฉื’ื™ืื•ืช ื—ื“ืฉื•ืช! ื ืจืื” ืœื™ ืฉื”ืจืœื•ื•ื ื˜ื™ื•ืช ืฉืœ ื”ืฉื™ืžื•ืฉ ื‘-PVS-Studio ื”ื•ืœื›ืช ื•ืคื•ื—ืชืช. ืงืœืื ื’ ืžื•ืฆื ื™ื•ืชืจ ืฉื’ื™ืื•ืช ืžื‘ืขื‘ืจ ื•ืžืฉื™ื’ ืืช ื”ื™ื›ื•ืœื•ืช ืฉืœ PVS-Studio. ืžื” ืืชื” ื—ื•ืฉื‘ ืขืœ ื–ื”?

ืขืœ ื–ื” ืื ื™ ืชืžื™ื“ ืจื•ืฆื” ืœืขื ื•ืช ืžืฉื”ื• ื›ืžื•:

ื’ื ืื ื—ื ื• ืœื ื™ื•ืฉื‘ื™ื ื‘ื—ื•ืกืจ ืžืขืฉ! ืฉื™ืคืจื ื• ืžืฉืžืขื•ืชื™ืช ืืช ื”ื™ื›ื•ืœื•ืช ืฉืœ ืžื ืชื— ื”-PVS-Studio. ืื– ืืœ ื“ืื’ื”, ืื ื—ื ื• ืžืžืฉื™ื›ื™ื ืœื”ื•ื‘ื™ืœ ื›ืžื• ืคืขื.

ืœืžืจื‘ื” ื”ืฆืขืจ, ื–ื• ืชืฉื•ื‘ื” ื’ืจื•ืขื”. ืื™ืŸ ื‘ื• ื”ื•ื›ื—ื•ืช. ื•ื–ื• ื”ืกื™ื‘ื” ืฉืื ื™ ื›ื•ืชื‘ ืืช ื”ืžืืžืจ ื”ื–ื” ืขื›ืฉื™ื•. ืื–, ืคืจื•ื™ืงื˜ LLVM ื ื‘ื“ืง ืฉื•ื‘ ื•ื ืžืฆืื• ื‘ื• ืžื’ื•ื•ืŸ ืฉื’ื™ืื•ืช. ื›ืขืช ืื“ื’ื™ื ืืช ืืœื” ืฉื ืจืื• ืœื™ ืžืขื ื™ื™ื ื™ื. Clang Static Analyzer ืœื ื™ื›ื•ืœ ืœืžืฆื•ื ืืช ื”ืฉื’ื™ืื•ืช ื”ืœืœื• (ืื• ืฉื–ื” ืžืื•ื“ ืœื ื ื•ื— ืœืขืฉื•ืช ื–ืืช ื‘ืขื–ืจืชื•). ืื‘ืœ ืื ื—ื ื• ื™ื›ื•ืœื™ื. ื™ืชืจ ืขืœ ื›ืŸ, ืžืฆืืชื™ ื•ืจืฉืžืชื™ ืืช ื›ืœ ื”ืฉื’ื™ืื•ืช ื”ืœืœื• ื‘ืขืจื‘ ืื—ื“.

ืื‘ืœ ื›ืชื™ื‘ืช ื”ืžืืžืจ ืืจื›ื” ืžืกืคืจ ืฉื‘ื•ืขื•ืช. ืคืฉื•ื˜ ืœื ื”ืฆืœื—ืชื™ ืœื”ื›ื ื™ืก ืืช ื›ืœ ื–ื” ืœื˜ืงืกื˜ :).

ืื’ื‘, ืื ืืชื” ืžืขื•ื ื™ื™ืŸ ื‘ืื™ืœื• ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ื ื™ืชื•ื— PVS-Studio ืœื–ื™ื”ื•ื™ ืฉื’ื™ืื•ืช ื•ืคื’ื™ืขื•ื™ื•ืช ืคื•ื˜ื ืฆื™ืืœื™ื•ืช, ืื– ืื ื™ ืžืฆื™ืข ืœื”ื›ื™ืจ ืืช ื–ื” ื”ืขืจื”.

ืื‘ื—ื•ืŸ ื—ื“ืฉ ื•ื™ืฉืŸ

ื›ืคื™ ืฉื›ื‘ืจ ืฆื•ื™ืŸ, ืœืคื ื™ ื›ืฉื ืชื™ื™ื ื ื‘ื“ืง ืฉื•ื‘ ืคืจื•ื™ืงื˜ LLVM, ื•ื”ื˜ืขื•ื™ื•ืช ืฉื ืžืฆืื• ืชื•ืงื ื•. ื›ืขืช ืžืืžืจ ื–ื” ื™ืฆื™ื’ ืงื‘ื•ืฆื” ื—ื“ืฉื” ืฉืœ ืฉื’ื™ืื•ืช. ืžื“ื•ืข ื ืžืฆืื• ื‘ืื’ื™ื ื—ื“ืฉื™ื? ื™ืฉ ืœื›ืš 3 ืกื™ื‘ื•ืช:

  1. ืคืจื•ื™ืงื˜ LLVM ืžืชืคืชื—, ืžืฉื ื” ืงื•ื“ ื™ืฉืŸ ื•ืžื•ืกื™ืฃ ืงื•ื“ ื—ื“ืฉ. ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ื™ืฉ ืฉื’ื™ืื•ืช ื—ื“ืฉื•ืช ื‘ืงื•ื“ ื”ืžืฉืชื ื” ื•ื”ื›ืชื•ื‘. ื–ื” ืžื“ื’ื™ื ื‘ื‘ื™ืจื•ืจ ืฉื™ืฉ ืœื”ืฉืชืžืฉ ื‘ื ื™ืชื•ื— ืกื˜ื˜ื™ ื‘ืื•ืคืŸ ืงื‘ื•ืข, ื•ืœื ืžื“ื™ ืคืขื. ื”ืžืืžืจื™ื ืฉืœื ื• ืžืฆื™ื’ื™ื ื”ื™ื˜ื‘ ืืช ื”ื™ื›ื•ืœื•ืช ืฉืœ ืžื ืชื— PVS-Studio, ืื‘ืœ ืื™ืŸ ืœื–ื” ืฉื•ื ืงืฉืจ ืœืฉื™ืคื•ืจ ืื™ื›ื•ืช ื”ืงื•ื“ ื•ื”ืคื—ืชืช ืขืœื•ืช ืชื™ืงื•ืŸ ื”ืฉื’ื™ืื•ืช. ื”ืฉืชืžืฉ ื‘ืžื ืชื— ืงื•ื“ ืกื˜ื˜ื™ ื‘ืื•ืคืŸ ืงื‘ื•ืข!
  2. ืื ื• ืžืกื™ื™ืžื™ื ื•ืžืฉืคืจื™ื ืืช ื”ืื‘ื—ื•ืŸ ื”ืงื™ื™ื. ืœื›ืŸ, ื”ืžื ืชื— ื™ื›ื•ืœ ืœื–ื”ื•ืช ืฉื’ื™ืื•ืช ืฉืœื ื”ื‘ื—ื™ืŸ ื‘ื”ืŸ ื‘ืžื”ืœืš ืกืจื™ืงื•ืช ืงื•ื“ืžื•ืช.
  3. ื‘-PVS-Studio ื”ื•ืคื™ืขื• ืื‘ื—ื•ื ื™ื ื—ื“ืฉื™ื ืฉืœื ื”ื™ื• ืงื™ื™ืžื™ื ืœืคื ื™ ืฉื ืชื™ื™ื. ื”ื—ืœื˜ืชื™ ืœื”ื“ื’ื™ืฉ ืื•ืชื ื‘ืกืขื™ืฃ ื ืคืจื“ ื›ื“ื™ ืœื”ืจืื•ืช ื‘ื‘ื™ืจื•ืจ ืืช ื”ืคื™ืชื•ื— ืฉืœ PVS-Studio.

ืœื™ืงื•ื™ื™ื ืฉื–ื•ื”ื• ืขืœ ื™ื“ื™ ืื‘ื—ื•ืŸ ืฉื”ื™ื• ืงื™ื™ืžื™ื ืœืคื ื™ ืฉื ืชื™ื™ื

ืงื˜ืข 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: V501 [CWE-570] ื™ืฉื ื ืชืชื™-ื‘ื™ื˜ื•ื™ื™ื ื–ื”ื™ื 'Name.startswith("avx512.mask.permvar.")' ืžืฉืžืืœ ื•ืžื™ืžื™ืŸ ืœ-'||' ืžึทืคืขึดื™ืœ. AutoUpgrade.cpp 73

ื ื‘ื“ืง ืคืขืžื™ื™ื ืฉื”ืฉื ืžืชื—ื™ืœ ื‘ืžื—ืจื•ื–ืช ื”ืžืฉื ื” "avx512.mask.permvar.". ื‘ื‘ื“ื™ืงื” ื”ืฉื ื™ื™ื”, ื‘ืจื•ืจ ืฉื”ื ืจืฆื• ืœื›ืชื•ื‘ ืžืฉื”ื• ืื—ืจ, ืื‘ืœ ืฉื›ื—ื• ืœืชืงืŸ ืืช ื”ื˜ืงืกื˜ ืฉื”ื•ืขืชืง.

ืงื˜ืข N2: ืฉื’ื™ืืช ื”ืงืœื“ื”

enum CXNameRefFlags {
  CXNameRange_WantQualifier = 0x1,
  CXNameRange_WantTemplateArgs = 0x2,
  CXNameRange_WantSinglePiece = 0x4
};

void AnnotateTokensWorker::HandlePostPonedChildCursor(
    CXCursor Cursor, unsigned StartTokenIndex) {
  const auto flags = CXNameRange_WantQualifier | CXNameRange_WantQualifier;
  ....
}

ืื–ื”ืจื” PVS-Studio: V501 ื™ืฉื ื ืชืชื™ ื‘ื™ื˜ื•ื™ื™ื ื–ื”ื™ื 'CXNameRange_WantQualifier' ืžืฉืžืืœ ื•ืžื™ืžื™ืŸ ืœ'|' ืžึทืคืขึดื™ืœ. CIndex.cpp 7245

ืขืงื‘ ืฉื’ื™ืืช ื”ืงืœื“ื”, ืื•ืชื• ืงื‘ื•ืข ื‘ืฉื ืžืฉืžืฉ ืคืขืžื™ื™ื CXNameRange_WantQualifier.

ืงื˜ืข 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: V502 [CWE-783] ืื•ืœื™ ื”ืžืคืขื™ืœ '?:' ืคื•ืขืœ ื‘ืฆื•ืจื” ืฉื•ื ื” ืžืžื” ืฉื”ื™ื” ืฆืคื•ื™. ืœืื•ืคืจื˜ื•ืจ '?:' ื™ืฉ ืขื“ื™ืคื•ืช ื ืžื•ื›ื” ื™ื•ืชืจ ืžืื•ืคืจื˜ื•ืจ '=='. PPCTargetTransformInfo.cpp 404

ืœื“ืขืชื™ ื–ื• ื˜ืขื•ืช ืžืื•ื“ ื™ืคื”. ื›ืŸ, ืื ื™ ื™ื•ื“ืข ืฉื™ืฉ ืœื™ ืจืขื™ื•ื ื•ืช ืžื•ื–ืจื™ื ืขืœ ื™ื•ืคื™ :).

ืขื›ืฉื™ื•, ืœืคื™ ืกื“ืจื™ ืขื“ื™ืคื•ื™ื•ืช ืฉืœ ื”ืžืคืขื™ืœ, ื”ื‘ื™ื˜ื•ื™ ืžื•ืขืจืš ื‘ืื•ืคืŸ ื”ื‘ื:

(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: V522 [CWE-476] ื ื™ืชื•ืง ืžืฆื‘ื™ืข ื”ืืคืก 'LHS' ืขืฉื•ื™ ืœื”ืชื‘ืฆืข. TGParser.cpp 2152

ืื ื”ืžืฆื‘ื™ืข LHS ื‘ื˜ืœ, ื™ืฉ ืœืชืช ืื–ื”ืจื”. ืขื ื–ืืช, ื‘ืžืงื•ื ื–ืืช, ืื•ืชื• ืžืฆื‘ื™ืข ืจื™ืง ื™ืงื‘ืœ ืืช ื”ื”ืคื ื™ื”: LHS->getAsString().

ื–ื”ื• ืžืฆื‘ ืื•ืคื™ื™ื ื™ ืžืื•ื“ ื›ืืฉืจ ืฉื’ื™ืื” ืžื•ืกืชืจืช ื‘ืžื˜ืคืœ ื‘ืฉื’ื™ืื•ืช, ืžื›ื™ื•ื•ืŸ ืฉืืฃ ืื—ื“ ืœื ื‘ื•ื“ืง ืื•ืชืŸ. ืžื ืชื—ื™ื ืกื˜ื˜ื™ื™ื ื‘ื•ื“ืงื™ื ืืช ื›ืœ ื”ืงื•ื“ ืฉื ื™ืชืŸ ืœื”ื’ื™ืข ืืœื™ื•, ืœื ืžืฉื ื” ื‘ืื™ื–ื• ืชื“ื™ืจื•ืช ื ืขืฉื” ื‘ื• ืฉื™ืžื•ืฉ. ื–ื•ื”ื™ ื“ื•ื’ืžื” ื˜ื•ื‘ื” ืžืื•ื“ ืœืื•ืคืŸ ืฉื‘ื• ื ื™ืชื•ื— ืกื˜ื˜ื™ ืžืฉืœื™ื ื˜ื›ื ื™ืงื•ืช ืื—ืจื•ืช ืฉืœ ื‘ื“ื™ืงื•ืช ื•ื”ื’ื ื” ืžืคื ื™ ืฉื’ื™ืื•ืช.

ืฉื’ื™ืืช ื˜ื™ืคื•ืœ ื“ื•ืžื” ื‘ืžืฆื‘ื™ืข RHS ืžื•ืชืจ ื‘ืงื•ื“ ืžืžืฉ ืœืžื˜ื”: 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] ื™ื™ืชื›ืŸ ืฉื™ืชืจื—ืฉ ื ื™ืชื•ืง ืžืฆื‘ื™ืข ื”ืืคืก 'ProgClone'. Miscompilation.cpp 601

ื‘ื”ืชื—ืœื” ืžืฆื‘ื™ืข ื—ื›ื ProgClone ืžืคืกื™ืง ืœื”ื—ื–ื™ืง ื‘ื—ืคืฅ:

BD.setNewProgram(std::move(ProgClone));

ืœืžืขืฉื”, ืขื›ืฉื™ื• 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] ืขืฉื•ื™ื” ืœื”ืชื‘ืฆืข ื ื™ืชื•ืง ืžืฆื‘ื™ืข ื”ืืคืก 'Type'. 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] ื ื™ืชื•ืง ืžืฆื‘ื™ืข ื”ืืคืก 'Ty' ืขืฉื•ื™ ืœื”ืชื‘ืฆืข. SearchableTableEmitter.cpp 614

ืื ื™ ื—ื•ืฉื‘ ืฉื”ื›ืœ ื‘ืจื•ืจ ื•ืœื ื“ื•ืจืฉ ื”ืกื‘ืจ.

ืงื˜ืข N10: ืฉื’ื™ืืช ื”ืงืœื“ื”

bool FormatTokenLexer::tryMergeCSharpNullConditionals() {
  ....
  auto &Identifier = *(Tokens.end() - 2);
  auto &Question = *(Tokens.end() - 1);
  ....
  Identifier->ColumnWidth += Question->ColumnWidth;
  Identifier->Type = Identifier->Type;                    // <=
  Tokens.erase(Tokens.end() - 1);
  return true;
}

ืื–ื”ืจืช PVS-Studio: V570 ื”ืžืฉืชื ื” 'ืžื–ื”ื”->ืกื•ื’' ืžื•ืงืฆื” ืœืขืฆืžื•. FormatTokenLexer.cpp 249

ืื™ืŸ ื˜ืขื ืœื”ืงืฆื•ืช ืžืฉืชื ื” ืœืขืฆืžื•. ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉื”ื ืจืฆื• ืœื›ืชื•ื‘:

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: V622 [CWE-478] ืฉืงื•ืœ ืœื‘ื“ื•ืง ืืช ื”ืฆื”ืจืช 'ื”ื—ืœืคื”'. ื™ื™ืชื›ืŸ ืฉื”ืžืคืขื™ืœ ื”ืจืืฉื•ืŸ ืฉืœ 'ื”ืžืงืจื”' ื—ืกืจ. SystemZAsmParser.cpp 652

ื™ืฉ ืžืคืขื™ืœ ืžืื•ื“ ื—ืฉื•ื“ ื‘ื”ืชื—ืœื” ืœืฉื‘ื•ืจ. ืฉื›ื—ืช ืœื›ืชื•ื‘ ืคื” ืžืฉื”ื• ืื—ืจ?

ืงื˜ืข 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: V595 [CWE-476] ื”ืžืฆื‘ื™ืข 'Callee' ื ื•ืฆืœ ืœืคื ื™ ืฉื”ื•ื ืื•ืžืช ื›ื ื’ื“ nullptr. ืงื•ื•ื™ ื‘ื“ื™ืงื”: 172, 174. AMDGPUInline.cpp 172

ื”ืžื“ื“ ืงืœื™ ื‘ื”ืชื—ืœื” ืžื•ืจื—ืงืช ื‘ื–ืžืŸ ืงืจื™ืืช ื”ืคื•ื ืงืฆื™ื” 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

ื•ืื– ื ืขืฉื™ืชื™ ืœื ืžืขื•ื ื™ื™ืŸ ืœืœืžื•ื“ ืืช ื”ืื–ื”ืจื•ืช ืขื ืžืกืคืจ V595. ืื– ืื ื™ ืœื ื™ื•ื“ืข ืื ื™ืฉ ืขื•ื“ ืฉื’ื™ืื•ืช ื“ื•ืžื•ืช ืžืœื‘ื“ ืืœื” ื”ืจืฉื•ืžื•ืช ื›ืืŸ. ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉื™ืฉ.

ืงื˜ืข N17, N18: ืชื–ื•ื–ื” ื—ืฉื•ื“ื”

static inline bool processLogicalImmediate(uint64_t Imm, unsigned RegSize,
                                           uint64_t &Encoding) {
  ....
  unsigned Size = RegSize;
  ....
  uint64_t NImms = ~(Size-1) << 1;
  ....
}

ืื–ื”ืจืช PVS-Studio: V629 [CWE-190] ืฉืงื•ืœ ืœื‘ื“ื•ืง ืืช ื”ื‘ื™ื˜ื•ื™ '~(ื’ื•ื“ืœ - 1) << 1'. ื”ืกื˜ืช ืกื™ื‘ื™ื•ืช ืฉืœ ืขืจืš 32 ืกื™ื‘ื™ื•ืช ืขื ื”ืจื—ื‘ื” ืœืื—ืจ ืžื›ืŸ ืœืกื•ื’ 64 ืกื™ื‘ื™ื•ืช. AArch64AddressingModes.h 260

ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื–ื” ืœื ื‘ืื’ ื•ื”ืงื•ื“ ืขื•ื‘ื“ ื‘ื“ื™ื•ืง ื›ืžืชื•ื›ื ืŸ. ืื‘ืœ ื‘ืจื•ืจ ืฉื–ื” ืžืงื•ื ืžืื•ื“ ื—ืฉื•ื“ ื•ืฆืจื™ืš ืœื‘ื“ื•ืง ืื•ืชื•.

ื ื’ื™ื“ ื”ืžืฉืชื ื” ืžื™ื“ื” ืฉื•ื•ื” ืœ-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: V646 [CWE-670] ืฉืงื•ืœ ืœื‘ื“ื•ืง ืืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ื”ื™ื™ืฉื•ื. ื™ื™ืชื›ืŸ ืฉืžื™ืœืช ื”ืžืคืชื— 'ืื—ืจ' ื—ืกืจื”. AMDGPUAsmParser.cpp 5655

ืื™ืŸ ื›ืืŸ ื˜ืขื•ืช. ืžืื– ื”ื‘ืœื•ืง ืื– ืฉืœ ื”ืจืืฉื•ืŸ 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] ื”ืžื—ืจื•ื–ื•ืช ื”ื™ื• ืžืฉื•ืจืฉืจื•ืช ืืš ืื™ื ืŸ ื‘ืฉื™ืžื•ืฉ. ืฉืงื•ืœ ืœื‘ื“ื•ืง ืืช ื”ื‘ื™ื˜ื•ื™ '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

ื‘ืžืงืจื”, ื”ืื•ืคืจื˜ื•ืจ + ืžืฉืžืฉ ื‘ืžืงื•ื ื”ืื•ืคืจื˜ื•ืจ +=. ื”ืชื•ืฆืื” ื”ื™ื ืขื™ืฆื•ื‘ื™ื ื—ืกืจื™ ืžืฉืžืขื•ืช.

ืงื˜ืข 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();
    }
  }
}

ื ืกื” ืœืžืฆื•ื ืืช ื”ืงื•ื“ ื”ืžืกื•ื›ืŸ ื‘ืขืฆืžืš. ื•ื–ื• ืชืžื•ื ื” ืœื”ืกื™ื— ืืช ืชืฉื•ืžืช ื”ืœื‘ ื›ื“ื™ ืœื ืœื”ืกืชื›ืœ ืžื™ื“ ืขืœ ื”ืชืฉื•ื‘ื”:

ืžืฆื™ืืช ื‘ืื’ื™ื ื‘-LLVM 8 ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio

ืื–ื”ืจืช PVS-Studio: V708 [CWE-758] ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ื‘ื ื™ื™ื” ืžืกื•ื›ื ืช: 'FeaturesMap[Op] = FeaturesMap.size()', ื›ืืฉืจ 'FeaturesMap' ื”ื•ื ื‘ืžื—ืœืงืช 'map'. ื–ื” ืขืœื•ืœ ืœื”ื•ื‘ื™ืœ ืœื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช. RISCVCompressInstEmitter.cpp 490

ืฉื•ืจืช ื”ื‘ืขื™ื”:

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] ืœืžืฉืชื ื” 'NType' ืžื•ืงืฆื™ื ืขืจื›ื™ื ืคืขืžื™ื™ื ื‘ืจืฆื™ืคื•ืช. ืื•ืœื™ ื–ื• ื˜ืขื•ืช. ืงื•ื•ื™ ื‘ื“ื™ืงื”: 1663, 1664. MachOObjectFile.cpp 1664

ืื ื™ ืœื ื—ื•ืฉื‘ ืฉื™ืฉ ื›ืืŸ ื˜ืขื•ืช ืืžื™ืชื™ืช. ืคืฉื•ื˜ ืžืฉื™ืžื” ื—ื•ื–ืจืช ืžื™ื•ืชืจืช. ืื‘ืœ ืขื“ื™ื™ืŸ ื˜ืขื•ืช.

ื‘ืื•ืคืŸ ื“ื•ืžื”:

  • 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: V547 [CWE-571] ื”ื‘ื™ื˜ื•ื™ 'nextByte != 0x90' ื”ื•ื ืชืžื™ื“ ื ื›ื•ืŸ. X86DisassemblerDecoder.cpp 379

ื‘ื“ื™ืงื” ืœื ื”ื’ื™ื•ื ื™ืช. ืžึดืฉืึฐืชึทื ึถื” nextByte ืชืžื™ื“ ืœื ืฉื•ื•ื” ืœืขืจืš 0x90, ื”ืขื•ืœื” ืžื”ื‘ื“ื™ืงื” ื”ืงื•ื“ืžืช. ื–ื• ืื™ื–ื•ืฉื”ื™ ื˜ืขื•ืช ืœื•ื’ื™ืช.

ืงื˜ืข N29 - N...: ืชื ืื™ื ื ื›ื•ื ื™ื/ืฉืงืจื™ื™ื ืชืžื™ื“

ื”ืžื ืชื— ืžื•ืฆื™ื ืื–ื”ืจื•ืช ืจื‘ื•ืช ืฉื”ืžืฆื‘ ื›ื•ืœื• (V547) ืื• ื—ืœืง ืžืžื ื• (V560) ืชืžื™ื“ ื ื›ื•ืŸ ืื• ืœื ื ื›ื•ืŸ. ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืืœื” ืœื ืฉื’ื™ืื•ืช ืืžื™ืชื™ื•ืช, ืืœื ืคืฉื•ื˜ ืงื•ื“ ืžืจื•ืฉืœ, ืชื•ืฆืื” ืฉืœ ื”ืจื—ื‘ืช ืžืืงืจื• ื•ื›ื“ื•ืžื”. ืขื ื–ืืช, ื”ื’ื™ื•ื ื™ ืœื”ืกืชื›ืœ ืขืœ ื›ืœ ื”ืื–ื”ืจื•ืช ื”ืœืœื•, ืฉื›ืŸ ืฉื’ื™ืื•ืช ืœื•ื’ื™ื•ืช ืืžื™ืชื™ื•ืช ืžืชืจื—ืฉื•ืช ืžืขืช ืœืขืช. ืœื“ื•ื’ืžื”, ืงื˜ืข ื”ืงื•ื“ ื”ื–ื” ื—ืฉื•ื“:

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: V560 [CWE-570] ื—ืœืง ืžื”ื‘ื™ื˜ื•ื™ ื”ืžื•ืชื ื” ื”ื•ื ืชืžื™ื“ ืฉืงืจ: RegNo == 0xe. ARMDisassembler.cpp 939

ื”ืงื‘ื•ืข 0xE ื”ื•ื ื”ืขืจืš 14 ื‘ืขืฉืจื•ื ื™. ื‘ึผึฐื“ึดื™ืงึธื” RegNo == 0xe ืœื ื”ื’ื™ื•ื ื™ ื›ื™ ืื RegNo > 13, ืื– ื”ืคื•ื ืงืฆื™ื” ืชืฉืœื™ื ืืช ื‘ื™ืฆื•ืขื”.

ื”ื™ื• ืื–ื”ืจื•ืช ืจื‘ื•ืช ืื—ืจื•ืช ืขื ืžื–ื”ื™ V547 ื•-V560, ืื‘ืœ ื›ืžื• ืขื V595, ืœื ื”ื™ื™ืชื™ ืžืขื•ื ื™ื™ืŸ ืœืœืžื•ื“ ืืช ื”ืื–ื”ืจื•ืช ื”ืœืœื•. ื›ื‘ืจ ื”ื™ื” ื‘ืจื•ืจ ืฉื™ืฉ ืœื™ ืžืกืคื™ืง ื—ื•ืžืจ ื›ื“ื™ ืœื›ืชื•ื‘ ืžืืžืจ :). ืœื›ืŸ, ืœื ื™ื“ื•ืข ื›ืžื” ืฉื’ื™ืื•ืช ืžืกื•ื’ ื–ื” ื ื™ืชืŸ ืœื–ื”ื•ืช ื‘-LLVM ื‘ืืžืฆืขื•ืช PVS-Studio.

ืื ื™ ืืชืŸ ืœืš ื“ื•ื’ืžื” ืžื“ื•ืข ืœื™ืžื•ื“ ื”ื˜ืจื™ื’ืจื™ื ื”ืœืœื• ืžืฉืขืžื. ื”ืžื ืชื— ืฆื•ื“ืง ื‘ื”ื—ืœื˜ ื‘ื”ื ืคืงืช ืื–ื”ืจื” ืขื‘ื•ืจ ื”ืงื•ื“ ื”ื‘ื. ืื‘ืœ ื–ื• ืœื ื˜ืขื•ืช.

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: V612 [CWE-670] 'ื”ื—ื–ืจื”' ืœืœื ืชื ืื™ ื‘ืชื•ืš ืœื•ืœืื”. R600OptimizeVectorRegisters.cpp 63

ื–ื• ืฉื’ื™ืื” ืื• ื˜ื›ื ื™ืงื” ืกืคืฆื™ืคื™ืช ืฉื ื•ืขื“ื” ืœื”ืกื‘ื™ืจ ืžืฉื”ื• ืœืžืชื›ื ืชื™ื ื”ืงื•ืจืื™ื ืืช ื”ืงื•ื“. ื”ืขื™ืฆื•ื‘ ื”ื–ื” ืœื ืžืกื‘ื™ืจ ืœื™ ื›ืœื•ื ื•ื ืจืื” ืžืื•ื“ ื—ืฉื•ื“. ืขื“ื™ืฃ ืœื ืœื›ืชื•ื‘ ื›ื›ื” :).

ืขื™ื™ืฃ? ืื– ื”ื’ื™ืข ื”ื–ืžืŸ ืœื”ื›ื™ืŸ ืชื” ืื• ืงืคื”.

ืžืฆื™ืืช ื‘ืื’ื™ื ื‘-LLVM 8 ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio

ืœื™ืงื•ื™ื™ื ืฉื–ื•ื”ื• ืขืœ ื™ื“ื™ ืื‘ื—ื•ืŸ ื—ื“ืฉ

ืื ื™ ื—ื•ืฉื‘ ืฉ-30 ื”ืคืขืœื•ืช ืฉืœ ืื‘ื—ื•ืŸ ื™ืฉืŸ ืžืกืคื™ืงื•ืช. ื›ืขืช ื ืจืื” ืื™ืœื• ื“ื‘ืจื™ื ืžืขื ื™ื™ื ื™ื ื ื™ืชืŸ ืœืžืฆื•ื ืขื ื”ืื‘ื—ื•ืŸ ื”ื—ื“ืฉ ืฉื”ื•ืคื™ืข ื‘ื ืชื— ืœืื—ืจ ืžื›ืŸ ืงื•ื“ื ื”ืžื—ืื•ืช. ื‘ืžื”ืœืš ืชืงื•ืคื” ื–ื•, ื ื•ืกืคื• ืกื”"ื› 66 ืื‘ื—ื•ื ื™ื ืœืžื˜ืจื•ืช ื›ืœืœื™ื•ืช ืœื ืชื— C++.

ืงื˜ืข 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: V779 [CWE-561] ื–ื•ื”ื” ืงื•ื“ ื‘ืœืชื™ ื ื™ืชืŸ ืœื”ืฉื’ื”. ื™ื™ืชื›ืŸ ืฉืงื™ื™ืžืช ืฉื’ื™ืื”. ExecutionUtils.cpp 146

ื›ืคื™ ืฉืืชื” ื™ื›ื•ืœ ืœืจืื•ืช, ืฉื ื™ ื”ืกื ื™ืคื™ื ืฉืœ ื”ืžืคืขื™ืœ 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: V784 ื’ื•ื“ืœ ืžืกื™ื›ืช ื”ืกื™ื‘ื™ื•ืช ืงื˜ืŸ ืžื’ื•ื“ืœ ื”ืื•ืคืจื ื“ ื”ืจืืฉื•ืŸ. ื–ื” ื™ื’ืจื•ื ืœืื•ื‘ื“ืŸ ืฉืœ ื‘ื™ื˜ื™ื ื’ื‘ื•ื”ื™ื ื™ื•ืชืจ. RuntimeDyld.cpp 815

ืฉื™ืžื• ืœื‘ ืฉื”ืคื•ื ืงืฆื™ื” getStubAlignment ืกื•ื’ ืžื—ื–ื™ืจ ืœื ื—ืชื•ื. ื‘ื•ื ื ื—ืฉื‘ ืืช ื”ืขืจืš ืฉืœ ื”ื‘ื™ื˜ื•ื™, ื‘ื”ื ื—ื” ืฉื”ืคื•ื ืงืฆื™ื” ืžื—ื–ื™ืจื” ืืช ื”ืขืจืš 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

ืขื›ืฉื™ื• ืฉื™ืžื• ืœื‘ ืฉื”ืžืฉืชื ื” ื’ื•ื“ืœ ื ืชื•ื ื™ื ื™ืฉ ืกื•ื’ 64 ืกื™ื‘ื™ื•ืช ืœื ื—ืชื•ื. ืžืกืชื‘ืจ ืฉื›ืืฉืจ ืžื‘ืฆืขื™ื ืืช ืคืขื•ืœืช DataSize & 0xFFFFFFF8u, ื›ืœ ืฉืœื•ืฉื™ื ื•ืฉื ื™ื™ื ื”ื‘ื™ื˜ื™ื ื‘ืกื“ืจ ื’ื‘ื•ื” ื™ืื•ืคืกื• ืœืืคืก. ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉื–ื” ืœื ืžื” ืฉื”ืžืชื›ื ืช ืจืฆื”. ืื ื™ ื—ื•ืฉื“ ืฉื”ื•ื ืจืฆื” ืœื—ืฉื‘: DataSize & 0xFFFFFFFFFFFFFFF8u.

ื›ื“ื™ ืœืชืงืŸ ืืช ื”ืฉื’ื™ืื”, ืขืœื™ืš ืœื›ืชื•ื‘ ืืช ื–ื”:

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: V1028 [CWE-190] ื”ืฆืคื” ืืคืฉืจื™ืช. ืฉืงื•ืœ ืœื”ื˜ื™ืœ ืื•ืคืจื ื“ื™ื ืฉืœ ื”ืื•ืคืจื˜ื•ืจ 'NumElts * Scale' ืœืกื•ื’ 'size_t', ืœื ืœืชื•ืฆืื”. X86ISelLowering.h 1577

ืœื™ื”ื•ืง ืกื•ื’ ืžืคื•ืจืฉ ืžืฉืžืฉ ื›ื“ื™ ืœืžื ื•ืข ื”ืฆืคืช ื™ืชืจ ื‘ืขืช ื”ื›ืคืœืช ืžืฉืชื ื™ ืกื•ื’ int. ืขื ื–ืืช, ืœื™ื”ื•ืง ืกื•ื’ ืžืคื•ืจืฉ ื›ืืŸ ืื™ื ื• ืžื’ืŸ ืžืคื ื™ ื”ืฆืคืช ื™ืชืจ. ืจืืฉื™ืช, ื”ืžืฉืชื ื™ื ื™ื•ื›ืคืœื•, ื•ืจืง ืœืื—ืจ ืžื›ืŸ ืชื•ืฆืืช 32 ื”ืกื™ื‘ื™ื•ืช ืฉืœ ื”ื›ืคืœ ืชื•ืจื—ื‘ ืœืกื•ื’ ื’ื•ื“ืœ_ื˜.

ืงื˜ืข N35: ื”ืขืชืง-ื”ื“ื‘ืง ื ื›ืฉืœ

Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
  ....
  if (!match(Op0, m_PosZeroFP()) && isKnownNeverNaN(Op0, &TLI)) {
    I.setOperand(0, ConstantFP::getNullValue(Op0->getType()));
    return &I;
  }
  if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) {
    I.setOperand(1, ConstantFP::getNullValue(Op0->getType()));        // <=
    return &I;
  }
  ....
}

V778 [CWE-682] ื ืžืฆืื• ืฉื ื™ ืงื˜ืขื™ ืงื•ื“ ื“ื•ืžื™ื. ืื•ืœื™ ื–ื• ื˜ืขื•ืช ื”ืงืœื“ื” ื•ื™ืฉ ืœื”ืฉืชืžืฉ ื‘ืžืฉืชื ื” 'Op1' ื‘ืžืงื•ื 'Op0'. InstCombineCompares.cpp 5507

ื”ืื‘ื—ื•ืŸ ื”ืžืขื ื™ื™ืŸ ื”ื—ื“ืฉ ื”ื–ื” ืžื–ื”ื” ืžืฆื‘ื™ื ืฉื‘ื”ื ืงื˜ืข ืงื•ื“ ื”ื•ืขืชืง ื•ืฉืžื•ืช ืžืกื•ื™ืžื™ื ื‘ื• ื”ื—ืœื• ืœื”ืฉืชื ื•ืช, ืืš ื‘ืžืงื•ื ืื—ื“ ืœื ืชื™ืงื ื• ืื•ืชื•.

ืฉื™ืžื• ืœื‘ ืฉื‘ื’ื•ืฉ ื”ืฉื ื™ ื”ื ื”ืฉืชื ื• Op0 ืขืœ Op1. ืื‘ืœ ื‘ืžืงื•ื ืื—ื“ ืœื ืชื™ืงื ื• ืืช ื–ื”. ืกื‘ื™ืจ ืœื”ื ื™ื— ืฉื–ื” ื”ื™ื” ืฆืจื™ืš ืœื”ื™ื›ืชื‘ ื›ืš:

if (!match(Op1, m_PosZeroFP()) && isKnownNeverNaN(Op1, &TLI)) {
  I.setOperand(1, ConstantFP::getNullValue(Op1->getType()));
  return &I;
}

ืงื˜ืข N36: ื‘ืœื‘ื•ืœ ืžืฉืชื ื”

struct Status {
  unsigned Mask;
  unsigned Mode;

  Status() : Mask(0), Mode(0){};

  Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
    Mode &= Mask;
  };
  ....
};

ืื–ื”ืจืช PVS-Studio: V1001 [CWE-563] ื”ืžืฉืชื ื” 'ืžืฆื‘' ืžื•ืงืฆื” ืืš ืื™ื ื• ื‘ืฉื™ืžื•ืฉ ืขื“ ืกื•ืฃ ื”ืคื•ื ืงืฆื™ื”. SIModeRegister.cpp 48

ืžืกื•ื›ืŸ ืžืื•ื“ ืœืชืช ืœืืจื’ื•ืžื ื˜ื™ื ืฉืœ ืคื•ื ืงืฆื™ื” ืืช ืื•ืชื ืฉืžื•ืช ื›ืžื• ืœื—ื‘ืจื™ ื”ื›ื™ืชื”. ืงืœ ืžืื•ื“ ืœื”ืชื‘ืœื‘ืœ. ื™ืฉ ืœื ื• ื‘ื“ื™ื•ืง ืžืงืจื” ื›ื–ื” ืœืคื ื™ื ื•. ื”ื‘ื™ื˜ื•ื™ ื”ื–ื” ืœื ื”ื’ื™ื•ื ื™:

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: ืฉื›ื—ื• ืœื‘ื“ื•ืง ืืช ื”ืื™ื ื“ืงืก

ื‘ืขื‘ืจ, ื‘ื“ืงื ื• ื“ื•ื’ืžืื•ืช ืœื”ืคืขืœืช ืื‘ื—ื•ืŸ V595. ื”ืžื”ื•ืช ืฉืœื• ื”ื™ื ืฉื”ืžืฆื‘ื™ืข ืžื•ืจื—ืง ื‘ื”ืชื—ืœื”, ื•ืจืง ืื– ื‘ื•ื“ืง. ืื‘ื—ื•ืŸ ืฆืขื™ืจ V1004 ื”ื•ื ื”ืคื•ืš ื‘ืžืฉืžืขื•ืช, ืื‘ืœ ื’ื ื—ื•ืฉืฃ ื”ืจื‘ื” ืฉื’ื™ืื•ืช. ื”ื•ื ืžื–ื”ื” ืžืฆื‘ื™ื ืฉื‘ื”ื ื”ืžืฆื‘ื™ืข ื ื‘ื“ืง ื‘ื”ืชื—ืœื” ื•ืœืื—ืจ ืžื›ืŸ ื ืฉื›ื— ืœืขืฉื•ืช ื–ืืช. ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืžืงืจื™ื ื›ืืœื” ืฉื ืžืฆืื• ื‘ืชื•ืš LLVM.

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

ืื™ืš ืœื”ื’ืŸ ืขืœ ืขืฆืžืš ืžืคื ื™ ืฉื’ื™ืื•ืช ื›ืืœื”? ื”ื™ื• ืงืฉื•ื‘ื™ื ื™ื•ืชืจ ืœื’ื‘ื™ 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: V1023 [CWE-460] ืžืฆื‘ื™ืข ืœืœื ื‘ืขืœื™ื ื ื•ืกืฃ ืœืžื™ื›ืœ 'ืืกื˜ืจื˜ื’ื™ื•ืช' ื‘ืฉื™ื˜ืช 'emplace_back'. ื“ืœื™ืคืช ื–ื™ื›ืจื•ืŸ ืชืชืจื—ืฉ ื‘ืžืงืจื” ืฉืœ ื—ืจื™ื’ื”. llvm-isel-fuzzer.cpp 58

ื›ื“ื™ ืœื”ื•ืกื™ืฃ ืืœืžื ื˜ ืœืงืฆื” ืžื™ื›ืœ ื›ืžื• std::vector > ืืชื” ืœื ื™ื›ื•ืœ ืคืฉื•ื˜ ืœื›ืชื•ื‘ 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] ืžืฆื‘ื™ืข ืœืœื ื‘ืขืœื™ื ืžืชื•ื•ืกืฃ ืœืžื™ื›ืœ 'Passes' ื‘ืฉื™ื˜ืช '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] ืžืฆื‘ื™ืข ืœืœื ื‘ืขืœื™ื ื ื•ืกืฃ ืœืžื™ื›ืœ '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.

ืืชื” ื™ื›ื•ืœ ืœื”ื•ืจื™ื“ ืืช ื”ืžื ืชื— ื•ืœืงื‘ืœ ืืช ืžืคืชื— ืฉื•ืœื” ื”ืžื•ืงืฉื™ื ื‘ื›ืชื•ื‘ืช ื“ืฃ ื–ื”.

ื•ื”ื›ื™ ื—ืฉื•ื‘, ื”ืฉืชืžืฉ ื‘ื ื™ืชื•ื— ืกื˜ื˜ื™ ื‘ืื•ืคืŸ ืงื‘ื•ืข. ืฆ'ืงื™ื ื—ื“ ืคืขืžื™ื™ื, ืฉื‘ื•ืฆืขื• ืขืœ ื™ื“ื ื• ืขืœ ืžื ืช ืœื”ืคื™ืฅ ืืช ื”ืžืชื•ื“ื•ืœื•ื’ื™ื” ืฉืœ ื ื™ืชื•ื— ืกื˜ื˜ื™ ื•-PVS-Studio ืื™ื ื ืชืจื—ื™ืฉ ื ื•ืจืžืœื™.

ื‘ื”ืฆืœื—ื” ื‘ืฉื™ืคื•ืจ ื”ืื™ื›ื•ืช ื•ื”ืืžื™ื ื•ืช ืฉืœ ื”ืงื•ื“ ืฉืœืš!

ืžืฆื™ืืช ื‘ืื’ื™ื ื‘-LLVM 8 ื‘ืืžืฆืขื•ืช ืžื ืชื— PVS-Studio

ืื ืืชื” ืจื•ืฆื” ืœืฉืชืฃ ืžืืžืจ ื–ื” ืขื ืงื”ืœ ื“ื•ื‘ืจ ืื ื’ืœื™ืช, ืื ื ื”ืฉืชืžืฉ ื‘ืงื™ืฉื•ืจ ื”ืชืจื’ื•ื: ืื ื“ืจื™ื™ ืงืจืคื•ื‘. ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘-LLVM 8 ืขื PVS-Studio.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”