ื’ืขืคึฟื™ื ืขืŸ ื‘ืึทื’ื– ืื™ืŸ LLVM 8 ื ื™ืฆืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ

ื’ืขืคึฟื™ื ืขืŸ ื‘ืึทื’ื– ืื™ืŸ LLVM 8 ื ื™ืฆืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ
ืžืขืจ ื•ื•ื™ ืฆื•ื•ื™ื™ ื™ืึธืจ ื”ืึธื‘ืŸ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ ื–ื™ื ื˜ ื“ื™ ืœืขืฆื˜ืข ืงืึธื“ ื˜ืฉืขืง ืคื•ืŸ ื“ื™ LLVM ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ ืื•ื ื“ื–ืขืจ PVS-ืกื˜ื•ื“ื™ืึธ ืึทื ืึทืœื™ื–ืขืจ. ืœืึธืžื™ืจ ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืึทื– ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ ืื™ื– ื ืึธืš ืึท ืœื™ื“ื™ื ื’ ื’ืขืฆื™ื™ึทื’ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืขืจืจืึธืจืก ืื•ืŸ ืคึผืึธื˜ืขื ืฆื™ืขืœ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื–. ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืžื™ืจ ื•ื•ืขืœืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืื•ืŸ ื’ืขืคึฟื™ื ืขืŸ ื ื™ื™ึทืข ืขืจืจืึธืจืก ืื™ืŸ ื“ื™ LLVM 8.0.0 ืžืขืœื“ื•ื ื’.

ืึทืจื˜ื™ืงืœ ืฆื• ื–ื™ื™ืŸ ื’ืขืฉืจื™ื‘ืŸ

ืฆื• ื–ื™ื™ืŸ ืขืจืœืขืš, ืื™ืš ื”ืื˜ ื ื™ืฉื˜ ื•ื•ืขืœืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ. ืขืก ืื™ื– ื ื™ืฉื˜ ื˜ืฉื™ืงืึทื•ื•ืข ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื•ื•ืขื’ืŸ ืึท ืคึผืจื•ื™ืขืงื˜ ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ืึธืคึผื’ืขืฉื˜ืขืœื˜ ืขื˜ืœืขื›ืข ืžืึธืœ (1, 2, 3). ืขืก ืื™ื– ื‘ืขืกืขืจ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื•ื•ืขื’ืŸ ืขืคึผืขืก ื ื™ื™ึท, ืึธื‘ืขืจ ืื™ืš ื”ืึธื‘ืŸ ืงื™ื™ืŸ ื‘ืจื™ืจื”.

ื™ืขื“ืขืจ ืžืึธืœ ืึท ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹LLVM ืื™ื– ื‘ืืคืจื™ื™ื˜ ืึธื“ืขืจ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜ ืงืœืึทื ื’ ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ื–ืขืจ, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ืคึฟืจืื’ืŸ ืคื•ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื˜ื™ืคึผ ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคึผืึธืกื˜:

ืงื•ืง, ื“ื™ ื ื™ื™ึทืข ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹Clang Static Analyzer ื”ืื˜ ื’ืขืœืขืจื ื˜ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ื ื™ื™ึทืข ืขืจืจืึธืจืก! ืขืก ืžื™ื™ื ื˜ ืฆื• ืžื™ืจ ืึทื– ื“ื™ ืฉื™ื™ื›ื•ืช ืคื•ืŸ ื ื™ืฆืŸ PVS-Studio ืื™ื– ื“ื™ืงืจื™ืกื™ื ื’. ืงืœืึทื ื’ ื’ืขืคื™ื ื˜ ืžืขืจ ืขืจืจืึธืจืก ื•ื•ื™ ืคืจื™ืขืจ ืื•ืŸ ื›ืึทืคึผืŸ ื–ื™ืš ืžื™ื˜ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ PVS-Studio. ื•ื•ืึธืก ื˜ืึธืŸ ืื™ืจ ื˜ืจืึทื›ื˜ืŸ ื•ื•ืขื’ืŸ ื“ืขื?

ืื•ื™ืฃ ื“ืขื ื•ื•ื™ืœ ืื™ืš ืฉื˜ืขื ื“ื™ืง ืขื ื˜ืคึฟืขืจืŸ ืขืคึผืขืก ื•ื•ื™:

ืžื™ืจ ื–ื™ืฆืŸ ืื•ื™ืš ื ื™ืฉื˜ ืœื™ื™ื“ื™ืง! ืžื™ืจ ื”ืึธื‘ืŸ ื‘ืื˜ื™ื™ื˜ื™ืง ื™ืžืคึผืจื•ื•ื•ื“ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ. ืึทื–ื•ื™ ื˜ืึธืŸ ื ื™ื˜ ื–ืึธืจื’, ืžื™ืจ ืคืึธืจื–ืขืฆืŸ ืฆื• ืคื™ืจืŸ ื•ื•ื™ ืคืจื™ืขืจ.

ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ื“ืึธืก ืื™ื– ืึท ืฉืœืขื›ื˜ ืขื ื˜ืคืขืจ. ื ื™ืฉื˜ื ืงื™ื™ืŸ ื”ื•ื›ื—ื•ืช ืื™ืŸ ื“ืขื. ืื•ืŸ ื“ืขืจืคึฟืึทืจ ืฉืจืฒึทื‘ ืื™ืš ืื™ืฆื˜ ื“ืขื ืึทืจื˜ื™ืงืœ. ืึทื–ื•ื™, ื“ื™ LLVM ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื•ื•ื™ื“ืขืจ ืึธืคึผื’ืขืฉื˜ืขืœื˜ ืื•ืŸ ืึท ืคืึทืจืฉื™ื™ื“ื ืงื™ื™ึทื˜ ืคื•ืŸ ืขืจืจืึธืจืก ื–ืขื ืขืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ืขืก. ืื™ืš ื•ื•ืขืœ ืื™ืฆื˜ ื“ืขืžืึธื ืกื˜ืจื™ืจืŸ ื“ื™ ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ื˜ืฉื™ืงืึทื•ื•ืข ืฆื• ืžื™ืจ. ืงืœืึทื ื’ ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ื–ืขืจ ืงืขืŸ ื ื™ืฉื˜ ื’ืขืคึฟื™ื ืขืŸ ื“ื™ ืขืจืจืึธืจืก (ืึธื“ืขืจ ืขืก ืื™ื– ื’ืึธืจ ื•ืžื‘ืึทืงื•ื•ืขื ืฆื• ื˜ืึธืŸ ื“ืึธืก ืžื™ื˜ ื–ื™ื™ืŸ ื”ื™ืœืฃ). ืื‘ืขืจ ืžื™ืจ ืงืขื ืขืŸ. ื“ืขืจืฆื•, ืื™ืš ื’ืขืคึฟื•ื ืขืŸ ืื•ืŸ ื’ืขืฉืจื™ื‘ืŸ ืึทืœืข ื“ื™ ืขืจืจืึธืจืก ืื™ืŸ ืื™ื™ืŸ ืึธื•ื•ื ื˜.

ืื‘ืขืจ ืฉืจื™ื™ื‘ืŸ ื“ืขื ืืจื˜ื™ืงืœ ื”ืื˜ ื’ืขื“ื•ื™ืขืจื˜ ืขื˜ืœื™ื›ืข ื•ื•ืื›ืŸ. ืื™ืš ื ืึธืจ ืงืขืŸ ื ื™ืฉื˜ ื‘ืจืขื ื’ืขืŸ ื–ื™ืš ืฆื• ืฉื˜ืขืœืŸ ืึทืœืข ื“ืขื ืื™ืŸ ื˜ืขืงืกื˜ :).

ื“ื•ืจืš ื“ืขื ื•ื•ืขื’, ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื•ื•ืึธืก ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ื– ื–ืขื ืขืŸ ื’ืขื ื™ืฆื˜ ืื™ืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืขืจืจืึธืจืก ืื•ืŸ ืคึผืึธื˜ืขื ืฆื™ืขืœ ื•ื•ืึทืœื ืขืจืึทื‘ื™ืœื™ื˜ื™ื–, ืื™ืš ืคึฟืึธืจืฉืœืึธื’ืŸ ืื™ืจ ื‘ืึทืงื•ืžืขืŸ ื‘ืึทืงืึทื ื˜ ืžื™ื˜ ื“ืขื ื ืื˜ื™ืฅ.

ื ื™ื• ืื•ืŸ ืึทืœื˜ ื“ื™ืึทื’ื ืึธืกื˜ื™ืงืก

ื•ื•ื™ ืฉื•ื™ืŸ ื‘ืืžืขืจืงื˜, ืžื™ื˜ ื•ื•ืขื’ืŸ ืฆื•ื•ื™ื™ ื™ืึธืจ ืฆื•ืจื™ืง ื“ื™ LLVM ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื•ื•ื™ื“ืขืจ ืึธืคึผื’ืขืฉื˜ืขืœื˜, ืื•ืŸ ื“ื™ ื’ืขืคึฟื•ื ืขืŸ ืขืจืจืึธืจืก ื–ืขื ืขืŸ ืงืขืจืขืงื˜ืึทื“. ืื™ืฆื˜ ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ืคืึธืจืฉื˜ืขืœืŸ ืึท ื ื™ื™ึทืข ืคึผืขืงืœ ืคื•ืŸ ืขืจืจืึธืจืก. ืคืืจื•ื•ืืก ื–ืขื ืขืŸ ื ื™ื™ึท ื‘ืึทื’ื– ื’ืขืคึฟื•ื ืขืŸ? ืขืก ื–ืขื ืขืŸ 3 ืกื™ื‘ื•ืช ืคึฟืึทืจ ื“ืขื:

  1. ื“ื™ LLVM ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื™ื•ื•ืึทืœื•ื•ื™ื ื’, ื˜ืฉืึทื ื’ื™ื ื’ ืึทืœื˜ ืงืึธื“ ืื•ืŸ ืึทื“ื™ื ื’ ื ื™ื™ึท ืงืึธื“. ื’ืขื•ื•ื™ื™ื ื˜ืœืขืš, ืขืก ื–ืขื ืขืŸ ื ื™ื™ึทืข ืขืจืจืึธืจืก ืื™ืŸ ื“ื™ ืžืึทื“ืึทืคื™ื™ื“ ืื•ืŸ ื’ืขืฉืจื™ื‘ืŸ ืงืึธื“. ื“ืึธืก ืงืœืืจ ื“ืขืžืึทื ืกื˜ืจื™ื™ืฅ ืึทื– ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ืกื™ืก ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืงืขืกื™ื™ื“ืขืจ ืื•ืŸ ื ื™ืฉื˜ ื˜ื™ื™ืœ ืžืึธืœ. ืื•ื ื“ื–ืขืจ ืึทืจื˜ื™ืงืœืขืŸ ื•ื•ื™ื™ึทื–ืŸ ื’ื•ื˜ ื“ื™ ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ืคื•ืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ, ืึธื‘ืขืจ ื“ืึธืก ื”ืื˜ ื’ืึธืจื ื™ืฉื˜ ืฆื• ื˜ืึธืŸ ืžื™ื˜ ื™ืžืคึผืจื•ื•ื•ื™ื ื’ ืงืึธื“ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืื•ืŸ ืจื™ื“ื•ืกื™ื ื’ ื“ื™ ืงืึธืก ืคื•ืŸ ืคื™ืงืกื™ืจ ืขืจืจืึธืจืก. ื ื™ืฆืŸ ืึท ืกื˜ืึทื˜ื™ืง ืงืึธื“ ืึทื ืึทืœื™ื–ืขืจ ืงืขืกื™ื™ื“ืขืจ!
  2. ืžื™ืจ ื–ืขื ืขืŸ ืคื™ื™ื ืึทืœื™ื™ื–ื™ื ื’ ืื•ืŸ ื™ืžืคึผืจื•ื•ื•ื™ื ื’ ื™ื’ื–ื™ืกื˜ื™ื ื’ ื“ื™ืึทื’ื ืึธืกื˜ื™ืงืก. ื“ืขืจื™ื‘ืขืจ, ื“ืขืจ ืึทื ืึทืœื™ื–ืขืจ ืงืขื ืขืŸ ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืขืจืจืึธืจืก ืึทื– ืขืก ื”ืื˜ ื ื™ืฉื˜ ื‘ืืžืขืจืงื˜ ื‘ืขืฉืึทืก ืคืจื™ื™ึทืขืจื“ื™ืง ืกืงืึทื ื–.
  3. ื ื™ื• ื“ื™ืึทื’ื ืึธืกื˜ื™ืงืก ื”ืึธื‘ืŸ ืืจื•ื™ืก ืื™ืŸ PVS-Studio ื•ื•ืึธืก ื”ืื˜ ื ื™ืฉื˜ ืขืงืกื™ืกื˜ื™ืจืŸ 2 ื™ืึธืจ ืฆื•ืจื™ืง. ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ืฆื• ื”ื•ื™ื›ืคึผื•ื ืงื˜ ื–ื™ื™ ืื™ืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืฆื• ืงืœืืจ ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’ ืคื•ืŸ PVS-Studio.

ื—ืกืจื•ื ื•ืช ื™ื™ื“ืขื ืึทืคื™ื™ื“ ื“ื•ืจืš ื“ื™ืึทื’ื ืึธืกื˜ื™ืงืก ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ 2 ื™ืึธืจ ืฆื•ืจื™ืง

ืคืจืึทื’ืžืขื ื˜ N1: ืงืึธืคึผื™-ืคึผืึทืกื˜ืข

static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
  if (Name == "addcarryx.u32" || // Added in 8.0
    ....
    Name == "avx512.mask.cvtps2pd.128" || // Added in 7.0
    Name == "avx512.mask.cvtps2pd.256" || // Added in 7.0
    Name == "avx512.cvtusi2sd" || // Added in 7.0
    Name.startswith("avx512.mask.permvar.") || // Added in 7.0     // <=
    Name.startswith("avx512.mask.permvar.") || // Added in 7.0     // <=
    Name == "sse2.pmulu.dq" || // Added in 7.0
    Name == "sse41.pmuldq" || // Added in 7.0
    Name == "avx2.pmulu.dq" || // Added in 7.0
  ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-570] ืขืก ื–ืขื ืขืŸ ื™ื™ื“ืขื ื™ืงืึทืœ ืกืึทื‘-ืื•ื™ืกื“ืจื•ืงืŸ 'Name.startswith ("avx512.mask.permvar.")' ืฆื• ื“ื™ ืœื™ื ืงืก ืื•ืŸ ืฆื• ื“ื™ ืจืขื›ื˜ ืคื•ืŸ ื“ื™ '||' ืึธืคึผืขืจืึทื˜ืึธืจ. AutoUpgrade.cpp 73

ืขืก ืื™ื– ื˜ืึธืคึผืœ ืึธืคึผื’ืขืฉื˜ืขืœื˜ ืึทื– ื“ืขืจ ื ืึธืžืขืŸ ื”ื™ื™ื‘ื˜ ืžื™ื˜ ื“ื™ ืกื•ื‘ืกื˜ืจื™ื ื’ "ืึทื•ื•ืงืก512.ืžืึทืกืง.ืคึผืขืจืžื•ื•ืึทืจ.". ื‘ืฒึทื ืฆื•ื•ื™ื™ื˜ืŸ ื˜ืฉืขืง ื”ืึธื‘ืŸ ื–ื™ื™ ื“ืึธืš ื’ืขื•ื•ืึธืœื˜ ืฉืจืฒึทื‘ืŸ ืขืคึผืขืก ืึทื ื“ืขืจืฉ, ืึธื‘ืขืจ ื”ืึธื‘ืŸ ืคึฟืึทืจื’ืขืกืŸ ืฆื• ืคึฟืึทืจืจื™ื›ื˜ืŸ ื“ืขื ื ืึธื›ืžืึทื›ืŸ ื˜ืขืงืกื˜.

ืคืจืึทื’ืžืขื ื˜ N2: ื˜ื™ืคึผืึธ

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

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

ื•ื•ืืจืขื ื•ื ื’ PVS-Studio: V501 ืขืก ื–ืขื ืขืŸ ื™ื™ื“ืขื ื™ืงืึทืœ ืกืึทื‘-ืื•ื™ืกื“ืจื•ืงืŸ 'CXNameRange_WantQualifier' ืฆื• ื“ื™ ืœื™ื ืงืก ืื•ืŸ ืฆื• ื“ื™ ืจืขื›ื˜ ืคื•ืŸ ื“ื™ '|' ืึธืคึผืขืจืึทื˜ืึธืจ. CIndex.cpp 7245

ืจืขื›ื˜ ืฆื• ืึท ื˜ื™ืคึผ ื˜ืขื•ืช, ื“ื™ ื–ืขืœื‘ืข ื ืึธืžืขืŸ ืงืขืกื™ื™ื“ืขืจื“ื™ืง ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื•ื•ื™ื™ ืžืึธืœ CXNameRange_WantQualifier.

ืคืจืึทื’ืžืขื ื˜ N3: ืฆืขืžื™ืฉื•ื ื’ ืžื™ื˜ ืึธืคึผืขืจืึทื˜ืึธืจ ืคึผืจื™ื™ื“ืึทื ืก

int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
  ....
  if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == ST->isLittleEndian() ? 1 : 0)
    return 0;
  ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-476] ื“ื™ ืจืขืคืขืจืขื ืกื™ื ื’ ืคื•ืŸ ื“ื™ ื ืึทืœ ื˜ื™ื™ึทื˜ืœ 'LHS' ืงืขืŸ ืคึผืึทืกื™ืจืŸ. TGParser.cpp 2152

ืื•ื™ื‘ ื“ืขืจ ื˜ื™ื™ึทื˜ืœ LHS ืื™ื– ื ื•ืœ, ื“ืืจืฃ ืžืขืŸ ืืจื•ื™ืกื’ืขื‘ืŸ ื ื•ื•ืืจืขื ื•ื ื’. ืึธื‘ืขืจ, ืึทื ืฉื˜ืึธื˜, ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื ืึทืœ ื˜ื™ื™ึทื˜ืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ืขืจืคืขืจืึทื ืกื˜: LHS->getAsString().

ื“ืึธืก ืื™ื– ืึท ื–ื™ื™ืขืจ ื˜ื™ืคึผื™ืฉ ืกื™ื˜ื•ืึทืฆื™ืข ื•ื•ืขืŸ ืึท ื˜ืขื•ืช ืื™ื– ืคืึทืจื‘ืึธืจื’ืŸ ืื™ืŸ ืึท ื˜ืขื•ืช ื”ืึทื ื“ืœืขืจ, ื•ื•ื™ื™ึทืœ ืงื™ื™ืŸ ืื™ื™ื ืขืจ ื˜ืขืกืฅ ื–ื™ื™. ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ื–ืขืจื– ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืึทืœืข ืจื™ื˜ืฉืึทื‘ืึทืœ ืงืึธื“, ืงื™ื™ืŸ ืขื ื™ืŸ ื•ื•ื™ ืึธืคื˜ ืขืก ืื™ื– ื’ืขื ื™ืฆื˜. ื“ืึธืก ืื™ื– ืึท ื–ื™ื™ืขืจ ื’ื•ื˜ ื‘ื™ื™ึทืฉืคึผื™ืœ ืคื•ืŸ ื•ื•ื™ ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ืกื™ืก ืงืึทืžืคึผืœืึทืžืึทื ืฅ ืื ื“ืขืจืข ื˜ืขืกื˜ื™ื ื’ ืื•ืŸ ื˜ืขื•ืช ืฉื•ืฅ ื˜ืขืงื ื™ืงืก.

ืขื ืœืขืš ื˜ื™ื™ึทื˜ืœ ื”ืึทื ื“ืœื™ื ื’ ื˜ืขื•ืช ืจื”ืก ื“ืขืจืœื•ื™ื‘ื˜ ืื™ืŸ ื“ืขื ืงืึธื“ ืคึผื•ื ืงื˜ ืื•ื ื˜ืŸ: V522 [CWE-476] ื“ื™ ืจืขืคืขืจืขื ืกื™ื ื’ ืคื•ืŸ ื“ื™ ื ืึทืœ ื˜ื™ื™ึทื˜ืœ 'RHS' ืงืขืŸ ืคึผืึทืกื™ืจืŸ. TGParser.cpp 2186

ืคืจืึทื’ืžืขื ื˜ N6: ื ื™ืฆืŸ ื“ื™ ื˜ื™ื™ึทื˜ืœ ื ืึธืš ืžืึธื•ื•ื™ื ื’

static Expected<bool>
ExtractBlocks(....)
{
  ....
  std::unique_ptr<Module> ProgClone = CloneModule(BD.getProgram(), VMap);
  ....
  BD.setNewProgram(std::move(ProgClone));                                // <=
  MiscompiledFunctions.clear();

  for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {
    Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);  // <=
    assert(NewF && "Function not found??");
    MiscompiledFunctions.push_back(NewF);
  }
  ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: V522 [CWE-476] ื“ื™ ืจืขืคืขืจืขื ืกื™ื ื’ ืคื•ืŸ ื“ื™ ื ืึทืœ ื˜ื™ื™ึทื˜ืœ 'ืคึผืจืึธื’ืงืœืึธื ืข' ืงืขืŸ ืคึผืึทืกื™ืจืŸ. Miscompilation.cpp 601

ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืึท ืงืœื•ื’ ื˜ื™ื™ึทื˜ืœ ืคึผืจืึธื’ืงืœืึธื ืข ื”ืขืจื˜ ืื•ื™ืฃ ืฆื• ืคืึทืจืžืึธื’ืŸ ื“ืขื ื›ื™ื™ืคืขืฅ:

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

ืื™ืŸ ืคืึทืงื˜, ืื™ืฆื˜ ืคึผืจืึธื’ืงืœืึธื ืข ืื™ื– ืึท ื ืึทืœ ื˜ื™ื™ึทื˜ืœ. ื“ืขืจื™ื‘ืขืจ, ืึท ื ืึทืœ ื˜ื™ื™ึทื˜ืœ ื“ืขืจื™ื™ืคืขืจ ื–ืึธืœ ืคึผืึทืกื™ืจืŸ ืคึผื•ื ืงื˜ ืื•ื ื˜ืŸ:

Function *NewF = ProgClone->getFunction(MisCompFunctions[i].first);

ืึธื‘ืขืจ, ืื™ืŸ ืคืึทืงื˜, ื“ืึธืก ื•ื•ืขื˜ ื ื™ืฉื˜ ืคึผืึทืกื™ืจืŸ! ื‘ืึทืžืขืจืงื•ื ื’ ืึทื– ื“ื™ ืฉืœื™ื™ืฃ ืื™ื– ื ื™ืฉื˜ ืึทืงืฉืœื™ ืขืงืกืึทืงื™ื•ื˜ืึทื“.

ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ืขื ืงืึทื ื˜ื™ื™ื ืขืจ ืžื™ืกืงืึธืžืคึผื™ืœืขื“ ืคืึทื ื’ืงืฉืึทื ื– ืงืœืึธืจ:

MiscompiledFunctions.clear();

ื“ืขืจื ืึธืš, ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขื ืงืึทื ื˜ื™ื™ื ืขืจ ืื™ื– ื’ืขื ื™ืฆื˜ ืื™ืŸ ื“ื™ ืฉืœื™ื™ืฃ ืฆื•ืฉื˜ืึทื ื“:

for (unsigned i = 0, e = MisCompFunctions.size(); i != e; ++i) {

ืขืก ืื™ื– ื’ืจื™ื ื’ ืฆื• ื–ืขืŸ ืึทื– ื“ื™ ืฉืœื™ื™ืฃ ื˜ื•ื˜ ื ื™ืฉื˜ ืึธื ื”ื™ื™ื‘ืŸ. ืื™ืš ื˜ืจืึทื›ื˜ืŸ ื“ืึธืก ืื™ื– ืื•ื™ืš ืึท ื–ืฉื•ืง ืื•ืŸ ื“ื™ ืงืึธื“ ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขืฉืจื™ื‘ืŸ ืึทื ื“ืขืจืฉ.

ืขืก ืžื™ื™ื ื˜ ืึทื– ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขืคึผืœืึธื ื˜ืขืจื˜ ืึทื– ื‘ืึทืจื™ืžื˜ ืคึผืึทืจื™ื˜ืขื˜ ืคื•ืŸ ืขืจืจืึธืจืก! ืื™ื™ืŸ ื’ืจื™ื™ึทื– ืžืึทืกืงืก ืื ื“ืขืจืŸ :).

ืคืจืึทื’ืžืขื ื˜ N7: ื ื™ืฆืŸ ื“ื™ ื˜ื™ื™ึทื˜ืœ ื ืึธืš ืžืึธื•ื•ื™ื ื’

static Expected<bool> TestOptimizer(BugDriver &BD, std::unique_ptr<Module> Test,
                                    std::unique_ptr<Module> Safe) {
  outs() << "  Optimizing functions being tested: ";
  std::unique_ptr<Module> Optimized =
      BD.runPassesOn(Test.get(), BD.getPassesToRun());
  if (!Optimized) {
    errs() << " Error running this sequence of passes"
           << " on the input program!n";
    BD.setNewProgram(std::move(Test));                       // <=
    BD.EmitProgressBitcode(*Test, "pass-error", false);      // <=
    if (Error E = BD.debugOptimizerCrash())
      return std::move(E);
    return false;
  }
  ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: V522 [CWE-476] ื“ื™ ืจืขืคืขืจืขื ืกื™ื ื’ ืคื•ืŸ ื“ื™ ื ืึทืœ ื˜ื™ื™ึทื˜ืœ 'ื˜ืขืกื˜' ืงืขืŸ ืคึผืึทืกื™ืจืŸ. Miscompilation.cpp 709

ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืกื™ื˜ื•ืึทืฆื™ืข ื•ื•ื™ื“ืขืจ. ืื™ืŸ ืขืจืฉื˜ืขืจ, ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ื›ื™ื™ืคืขืฅ ืื™ื– ืืจื™ื‘ืขืจื’ืขืคืืจืŸ, ืื•ืŸ ื“ืขืžืึธืœื˜ ืขืก ืื™ื– ื’ืขื ื™ืฆื˜ ื•ื•ื™ ืื•ื™ื‘ ื’ืึธืจื ื™ืฉื˜ ื’ืขื˜ืจืืคืŸ. ืื™ืš ื–ืขืŸ ื“ืขื ืกื™ื˜ื•ืึทืฆื™ืข ืžืขืจ ืื•ืŸ ืžืขืจ ืึธืคื˜ ืื™ืŸ ืคึผืจืึธื’ืจืึทื ืงืึธื“ ื ืึธืš ื‘ืึทื•ื•ืขื’ื•ื ื’ ืกืขืžืึทื ื˜ื™ืงืก ืืจื•ื™ืก ืื™ืŸ C ++. ื“ืึธืก ืื™ื– ื•ื•ืึธืก ืื™ืš ืœื™ื‘ืข ื“ื™ C ++ ืฉืคึผืจืึทืš! ืขืก ื–ืขื ืขืŸ ืžืขืจ ืื•ืŸ ืžืขืจ ื ื™ื™ึทืข ื•ื•ืขื’ืŸ ืฆื• ื“ืจื™ื™ืขืŸ ื“ื™ื™ืŸ ืคื•ืก ืึทื•ื•ืขืง. ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ ื•ื•ืขื˜ ืฉื˜ืขื ื“ื™ืง ื”ืึธื‘ืŸ ืึทืจื‘ืขื˜ :).

ืคืจืึทื’ืžืขื ื˜ N8: ื ืึทืœ ื˜ื™ื™ึทื˜ืœ

void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol) {
  uint32_t TypeId = Symbol.getTypeId();
  auto Type = Symbol.getSession().getSymbolById(TypeId);
  if (Type)
    Printer << "<unknown-type>";
  else
    Type->dump(*this);
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: V522 [CWE-476] ื“ื™ ืจืขืคืขืจืขื ืกื™ื ื’ ืคื•ืŸ ื“ื™ ื ืึทืœ ื˜ื™ื™ึทื˜ืœ 'ื˜ื™ืคึผ' ืงืขืŸ ืคึผืึทืกื™ืจืŸ. PrettyFunctionDumper.cpp 233

ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื˜ืขื•ืช ื”ืึทื ื“ืœืขืจืก, ื“ื™ื‘ืึทื’ื™ื ื’ ืคึผืจื™ื ื˜ืึทื•ื˜ ืคืึทื ื’ืงืฉืึทื ื– ื–ืขื ืขืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื ื™ืฉื˜ ื˜ืขืกื˜ืขื“. ืžื™ืจ ื”ืึธื‘ืŸ ืคึผื•ื ืงื˜ ืึทื–ืึท ืคืึทืœ ืคึฟืึทืจ ืื•ื ื“ื–. ื“ื™ ืคึฟื•ื ืงืฆื™ืข ืื™ื– ื•ื•ืืจื˜ืŸ ืคึฟืึทืจ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ, ื•ื•ืึธืก, ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ืกืึทืœื•ื•ื™ื ื’ ื–ื™ื™ืŸ ืคึผืจืึธื‘ืœืขืžืก, ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืฆื•ื•ื•ื ื’ืขืŸ ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ืขืก.

ืจื™ื›ื˜ื™ื’:

if (Type)
  Type->dump(*this);
else
  Printer << "<unknown-type>";

ืคืจืึทื’ืžืขื ื˜ N9: ื ืึทืœ ื˜ื™ื™ึทื˜ืœ

void SearchableTableEmitter::collectTableEntries(
    GenericTable &Table, const std::vector<Record *> &Items) {
  ....
  RecTy *Ty = resolveTypes(Field.RecType, TI->getType());
  if (!Ty)                                                              // <=
    PrintFatalError(Twine("Field '") + Field.Name + "' of table '" +
                    Table.Name + "' has incompatible type: " +
                    Ty->getAsString() + " vs. " +                       // <=
                    TI->getType()->getAsString());
   ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: V522 [CWE-476] ื“ื™ ืจืขืคืขืจืขื ืกื™ื ื’ ืคื•ืŸ ื“ื™ ื ืึทืœ ื˜ื™ื™ึทื˜ืœ 'ื˜ื™' ืงืขืŸ ืคึผืึทืกื™ืจืŸ. SearchableTableEmitter.cpp 614

ืื™ืš ื˜ืจืึทื›ื˜ืŸ ืึทืœืฅ ืื™ื– ืงืœืึธืจ ืื•ืŸ ื“ืึทืจืฃ ืงื™ื™ืŸ ื“ืขืจืงืœืขืจื•ื ื’.

ืคืจืึทื’ืžืขื ื˜ N10: ื˜ื™ืคึผืึธ

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

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก ื“ื™ 'Identifier->Type' ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ืื™ื– ืึทืกื™ื™ื ื“ ืฆื• ื–ื™ืš. 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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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

ืื•ืŸ ื“ืขืžืึธืœื˜ ืื™ืš ื’ืขื•ื•ืืจืŸ ื ื™ื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ืœืขืจื ืขืŸ ื“ื™ ื•ื•ืึธืจื ื™ื ื’ื– ืžื™ื˜ ื ื•ืžืขืจ ื•ื•595. ืึทื–ื•ื™ ืื™ืš ื˜ืึธืŸ ื ื™ื˜ ื•ื•ื™ืกืŸ ืื•ื™ื‘ ืขืก ื–ืขื ืขืŸ ืžืขืจ ืขื ืœืขืš ืขืจืจืึธืจืก ืึทื—ื•ืฅ ื“ื™ ื•ื•ืึธืก ื–ืขื ืขืŸ ืœื™ืกื˜ืขื“ ื“ืึธ. ืจื•ื‘ึฟ ืžืกืชึผืžื ืขืก ืื™ื–.

ืคืจืึทื’ืžืขื ื˜ N17, N18: ืกืึทืกืคึผื™ืฉืึทืก ื™ื‘ืขืจืจื•ืง

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

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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] ื“ื™ ืกื˜ืจื™ื ื’ืก ื–ืขื ืขืŸ ืงืึทื ืงืึทื˜ืึทื ื™ื™ื˜ืึทื“ ืึธื‘ืขืจ ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืขื•ื•ื™ื™ื ื˜. ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื•ืจื›ืงื•ืงืŸ ื“ื™ 'ืจืขื–ื•ืœื˜ืึทื˜ + "(ObjC ืงืœืึทืก)" + Name.str ()' ืื•ื™ืกื“ืจื•ืง. Symbol.cpp 35
  • V655 [CWE-480] ื“ื™ ืกื˜ืจื™ื ื’ืก ื–ืขื ืขืŸ ืงืึทื ืงืึทื˜ืึทื ื™ื™ื˜ืึทื“ ืึธื‘ืขืจ ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืขื•ื•ื™ื™ื ื˜. ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื•ืจื›ืงื•ืงืŸ ื“ื™ 'ืจืขื–ื•ืœื˜ืึทื˜ + "(ObjC Class EH)" + Name.str()' ืื•ื™ืกื“ืจื•ืง. Symbol.cpp 38
  • V655 [CWE-480] ื“ื™ ืกื˜ืจื™ื ื’ืก ื–ืขื ืขืŸ ืงืึทื ืงืึทื˜ืึทื ื™ื™ื˜ืึทื“ ืึธื‘ืขืจ ื–ืขื ืขืŸ ื ื™ืฉื˜ ื’ืขื•ื•ื™ื™ื ื˜. ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื•ืจื›ืงื•ืงืŸ ื“ื™ ืื•ื™ืกื“ืจื•ืง 'ืจืขื–ื•ืœื˜ืึทื˜ + "(ObjC IVar)" + Name.str()'. Symbol.cpp 41

ื“ื•ืจืš ืฆื•ืคืึทืœ, ื“ื™ + ืึธืคึผืขืจืึทื˜ืึธืจ ืื™ื– ื’ืขื ื™ืฆื˜ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ื“ื™ += ืึธืคึผืขืจืึทื˜ืึธืจ. ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืื™ื– ื“ื™ื–ื™ื™ื ื– ื•ื•ืึธืก ื–ืขื ืขืŸ ืึธืŸ ื˜ื™ื™ึทื˜ืฉ.

ืคืจืึทื’ืžืขื ื˜ N21: ื•ื ื“ืขืคื™ื ืขื“ ื ืึทื˜ื•ืจ

static void getReqFeatures(std::map<StringRef, int> &FeaturesMap,
                           const std::vector<Record *> &ReqFeatures) {
  for (auto &R : ReqFeatures) {
    StringRef AsmCondString = R->getValueAsString("AssemblerCondString");

    SmallVector<StringRef, 4> Ops;
    SplitString(AsmCondString, Ops, ",");
    assert(!Ops.empty() && "AssemblerCondString cannot be empty");

    for (auto &Op : Ops) {
      assert(!Op.empty() && "Empty operator");
      if (FeaturesMap.find(Op) == FeaturesMap.end())
        FeaturesMap[Op] = FeaturesMap.size();
    }
  }
}

ืคึผืจื•ึผื•ื•ื˜ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ื“ื™ ื’ืขืคืขืจืœืขืš ืงืึธื“ ื–ื™ืš. ืื•ืŸ ื“ืึธืก ืื™ื– ืึท ื‘ื™ืœื“ ืฆื• ื“ื™ืกื˜ืจืึทืงื˜ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ ืึทื–ื•ื™ ื ื™ืฉื˜ ืฆื• ืžื™ื“ ืงื•ืงืŸ ืื™ืŸ ื“ื™ ืขื ื˜ืคืขืจ:

ื’ืขืคึฟื™ื ืขืŸ ื‘ืึทื’ื– ืื™ืŸ LLVM 8 ื ื™ืฆืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-758] ื’ืขืคืขืจืœืขืš ืงืึทื ืกื˜ืจืึทืงืฉืึทืŸ ืื™ื– ื’ืขื ื™ืฆื˜: 'FeaturesMap[Op] = FeaturesMap.size()', ื•ื•ื• 'FeaturesMap' ืื™ื– ืคื•ืŸ 'ืžืึทืคึผืข' ืงืœืึทืก. ื“ืึธืก ืงืขืŸ ืคื™ืจืŸ ืฆื• ืึทื ืคื™ื™ื ื“ ื ืึทื˜ื•ืจ. 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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-571] ื“ืขืจ ืื•ื™ืกื“ืจื•ืง 'nextByte != 0x90' ืื™ื– ืฉื˜ืขื ื“ื™ืง ืืžืช. X86 DisassemblerDecoder.cpp 379

ืงืึธื ื˜ืจืึธืœื™ืจื•ื ื’ ื˜ื•ื˜ ื ื™ืฉื˜ ืžืึทื›ืŸ ื–ื™ื ืขืŸ. ื•ื•ืึทืจื™ืึทื‘ืœืข NextByte ืฉื˜ืขื ื“ื™ืง ื ื™ื˜ ื’ืœื™ื™ึทืš ืฆื• ื“ื™ ื•ื•ืขืจื˜ 0x90, ื•ื•ืึธืก ื’ื™ื™ื˜ ืคื•ืŸ ื“ื™ ืคืจื™ืขืจื“ื™ืงืข ื˜ืฉืขืง. ื“ืึธืก ืื™ื– ืึท ืžื™ืŸ ืคื•ืŸ ืœืึทื“ื–ืฉื™ืงืึทืœ ื˜ืขื•ืช.

ืคืจืึทื’ืžืขื ื˜ N29 - N...: ืฉื˜ืขื ื“ื™ืง ืืžืช / ืคืึทืœืฉ ื˜ื ืึธื™ื

ื“ืขืจ ืึทื ืึทืœื™ื–ืขืจ ื’ื™ื˜ ืคื™ืœืข ื•ื•ืึธืจื ื™ื ื’ื– ืึทื– ื“ื™ ื’ืื ืฆืข ืฆื•ืฉื˜ืึทื ื“ (ื•ื•ืงืกื ื•ืžืงืก) ืึธื“ืขืจ ื˜ื™ื™ืœ ื“ืขืจืคื•ืŸ (ื•ื•ืงืกื ื•ืžืงืก) ืื™ื– ืฉื˜ืขื ื“ื™ืง ืืžืช ืึธื“ืขืจ ืคืึทืœืฉ. ืึธืคื˜ ื“ืึธืก ื–ืขื ืขืŸ ื ื™ืฉื˜ ืคืึทืงื˜ื™ืฉ ืขืจืจืึธืจืก, ืึธื‘ืขืจ ืคืฉื•ื˜ ืกืœืึทืคึผื™ ืงืึธื“, ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืžืึทืงืจืึธื• ื™ืงืกืคึผืึทื ืฉืึทืŸ, ืื•ืŸ ื“ื™ ื•ื•ื™. ืึธื‘ืขืจ, ืขืก ืžืื›ื˜ ื–ื™ื ืขืŸ ืฆื• ืงื•ืงืŸ ืื™ืŸ ืึทืœืข ื“ื™ ื•ื•ืึธืจื ื™ื ื’ื–, ื•ื•ื™ื™ึทืœ ืขื›ื˜ ืœืึทื“ื–ืฉื™ืงืึทืœ ืขืจืจืึธืจืก ื˜ืึธืŸ ืคืึทืœืŸ ืคื•ืŸ ืฆื™ื™ื˜ ืฆื• ืฆื™ื™ื˜. ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ื“ืขื ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืคื•ืŸ ืงืึธื“ ืื™ื– ืกืึทืกืคึผื™ืฉืึทืก:

static DecodeStatus DecodeGPRPairRegisterClass(MCInst &Inst, unsigned RegNo,
                                   uint64_t Address, const void *Decoder) {
  DecodeStatus S = MCDisassembler::Success;

  if (RegNo > 13)
    return MCDisassembler::Fail;

  if ((RegNo & 1) || RegNo == 0xe)
     S = MCDisassembler::SoftFail;
  ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-570] ื โ€‹โ€‹ื˜ื™ื™ืœ ืคื•ืŸ ืงืึทื ื“ื™ืฉืึทื ืึทืœ ืื•ื™ืกื“ืจื•ืง ืื™ื– ืฉื˜ืขื ื“ื™ืง ืคืึทืœืฉ: RegNo == 0xe. ARMDisassembler.cpp 939

ื“ืขืจ ืงืขืกื™ื™ื“ืขืจื“ื™ืง 0xE ืื™ื– ื“ื™ ื•ื•ืขืจื˜ 14 ืื™ืŸ ื“ืขืฆื™ืžืึทืœ. ื“ื•ืจื›ืงื•ืง RegNo == 0xe ื˜ื•ื˜ ื ื™ืฉื˜ ืžืึทื›ืŸ ื–ื™ื ืขืŸ ื•ื•ื™ื™ึทืœ ืื•ื™ื‘ ืจืขื’ื ืึธ > 13, ื“ืขืžืึธืœื˜ ื“ืขืจ ืคื•ื ืงืฆื™ืข ื•ื•ืขื˜ ืคืึทืจืขื ื“ื™ืงืŸ ื–ื™ื™ึทืŸ ื“ื•ืจื›ืคื™ืจื•ื ื’.

ืขืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ืคื™ืœืข ืื ื“ืขืจืข ื•ื•ืึธืจื ื™ื ื’ื– ืžื™ื˜ ID V547 ืื•ืŸ V560, ืึธื‘ืขืจ ื•ื•ื™ ืžื™ื˜ ื•ื•ืงืกื ื•ืžืงืก, ืื™ืš ื‘ื™ืŸ ื ื™ืฉื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ืœืขืจื ืขืŸ ื“ื™ ื•ื•ืึธืจื ื™ื ื’ื–. ืขืก ืื™ื– ืฉื•ื™ืŸ ื’ืขื•ื•ืขืŸ ืงืœืึธืจ ืึทื– ืื™ืš ื”ืึธื‘ืŸ ื’ืขื ื•ื’ ืžืึทื˜ืขืจื™ืึทืœ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืึทืŸ ืึทืจื˜ื™ืงืœ :). ื“ืขืจื™ื‘ืขืจ, ืขืก ืื™ื– ืื•ืžื‘ืึทืงืึทื ื˜ ื•ื•ื™ ืคื™ืœืข ืขืจืจืึธืจืก ืคื•ืŸ ื“ืขื ื˜ื™ืคึผ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื™ื™ื“ืขื ืึทืคื™ื™ื“ ืื™ืŸ 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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ื™ ื‘ื™ืกืœ ืžืึทืกืงืข ืื™ื– ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ืึธืคึผืขืจืึทื ื“. ื“ืึธืก ื•ื•ืขื˜ ืคืึทืจืฉืึทืคืŸ ื“ื™ ืึธื ื•ื•ืขืจ ืคื•ืŸ ื”ืขื›ืขืจ ื‘ื™ื˜ืŸ. RuntimeDyld.cpp 815

ื‘ื™ื˜ืข ื˜ืึธืŸ ืึทื– ื“ื™ ืคึฟื•ื ืงืฆื™ืข getStubAlignment ืงืขืจื˜ ื˜ื™ืคึผ ื•ื ืกื™ื’ื ืขื“. ืœืึธืžื™ืจ ืจืขื›ืขื ืขืŸ ื“ื™ ื•ื•ืขืจื˜ ืคื•ืŸ ื“ื™ ืื•ื™ืกื“ืจื•ืง, ืึทืกื•ืžื™ื ื’ ืึทื– ื“ื™ ืคึฟื•ื ืงืฆื™ืข ืงืขืจื˜ ื“ื™ ื•ื•ืขืจื˜ 8:

~(getStubAlignment() - 1)

~(8ื•-1)

0xFFFFFFFF8u

ืื™ืฆื˜ ื‘ืึทืžืขืจืงืŸ ืึทื– ื“ื™ ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ื“ืึทื˜ืึทืกื™ื™ื– ื”ืื˜ ืึท 64-ื‘ื™ืกืœ ืึทื ืกื™ื™ื ื“ ื˜ื™ืคึผ. ืขืก ื˜ื•ืจื ืก ืื•ื™ืก ืึทื– ื•ื•ืขืŸ ืคึผืขืจืคืึธืจืžื™ื ื’ ื“ื™ DataSize & 0xFFFFFFF8u ืึธืคึผืขืจืึทืฆื™ืข, ืึทืœืข 0 ื”ื•ื™ืš-ืกื“ืจ ื‘ื™ื˜ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืง ืฆื• ื ื•ืœ. ืจื•ื‘ึฟ ืžืกืชึผืžื, ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ื•ื•ืึธืก ื“ืขืจ ืคึผืจืึธื’ืจืึทืžื™ืกื˜ ื’ืขื•ื•ืืœื˜. ืื™ืš ื›ืึธืฉืขื“ ืึทื– ืขืจ ื’ืขื•ื•ืืœื˜ ืฆื• ืจืขื›ืขื ืขืŸ: DataSize & 8xFFFFFFFFFFFFFFFXNUMXu.

ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื ื˜ืขื•ืช, ืื™ืจ ื–ืึธืœ ืฉืจื™ื™ึทื‘ืŸ ื“ืขื:

DataSize &= ~(static_cast<uint64_t>(getStubAlignment()) - 1);

ืึธื“ืขืจ ืึทื–ื•ื™:

DataSize &= ~(getStubAlignment() - 1ULL);

ืคืจืึทื’ืžืขื ื˜ N34: ื“ื•ืจื›ืคืึทืœ ื™ืงืกืคึผืœื™ืกืึทื˜ ื˜ื™ืคึผ ื•ื•ืึทืจืคืŸ

template <typename T>
void scaleShuffleMask(int Scale, ArrayRef<T> Mask,
                      SmallVectorImpl<T> &ScaledMask) {
  assert(0 < Scale && "Unexpected scaling factor");
  int NumElts = Mask.size();
  ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
  ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-190] ืžืขื’ืœืขืš ืึธื•ื•ื•ืขืจืคืœืึธื•. ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืงืึทืกื˜ื™ื ื’ ืึธืคึผืขืจืึทื ื“ื– ืคื•ืŸ ื“ื™ 'NumElts * ืกืงืึทืœืข' ืึธืคึผืขืจืึทื˜ืึธืจ ืฆื• ื“ื™ 'ืกื™ื–_ื˜' ื˜ื™ืคึผ, ื ื™ืฉื˜ ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜. X86ISelLowering.h 1577

ื™ืงืกืคึผืœื™ืกืึทื˜ ื˜ื™ืคึผ ืงืึทืกื˜ื™ื ื’ ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ื•ื™ืกืžื™ื™ื“ืŸ ืœื•ื™ืคืŸ ื•ื•ืขืŸ ืžืึทืœื˜ืึทืคึผืœื™ื™ื™ื ื’ ื˜ื™ืคึผ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื™ื ื˜. ืึธื‘ืขืจ, ื™ืงืกืคึผืœื™ืกืึทื˜ ื˜ื™ืคึผ ืงืึทืกื˜ื™ื ื’ ื“ืึธ ื˜ื•ื˜ ื ื™ืฉื˜ ื‘ืึทืฉื™ืฆืŸ ืงืขื’ืŸ ืึธื•ื•ื•ืขืจืคืœืึธื•. ืขืจืฉื˜ืขืจ, ื“ื™ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืžืขืจื˜, ืื•ืŸ ื‘ืœื•ื™ื– ื“ืขืžืึธืœื˜ ื“ื™ 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;
  }
  ....
}

ื•ื•ืงืกื ื•ืžืงืก [CWE-682] ืฆื•ื•ื™ื™ ืขื ืœืขืš ืงืึธื“ ืคืจืึทื’ืžืึทื ืฅ ื–ืขื ืขืŸ ื’ืขืคึฟื•ื ืขืŸ. ื˜ืึธืžืขืจ, ื“ืึธืก ืื™ื– ืึท ื˜ื™ืคึผืึธ ืื•ืŸ 'Op1' ื‘ื™ื™ึทื˜ืขื•ื•ื“ื™ืง ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ 'Op0'. InstCombineCompares.cpp 5507

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

ื‘ื™ื˜ืข ื˜ืึธืŸ ืึทื– ืื™ืŸ ื“ื™ ืจื’ืข ื‘ืœืึธืง ื–ื™ื™ ื’ืขื‘ื™ื˜ืŸ ืึธืคึผืงืกื ื•ืžืงืก ืื•ื™ืฃ ืึธืคึผืงืกื ื•ืžืงืก. ืื‘ืขืจ ืื™ืŸ ืื™ื™ืŸ ืึธืจื˜ ื–ื™ื™ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ืคืึทืจืจื™ื›ื˜ืŸ ืขืก. ืจื•ื‘ึฟ ืžืกืชึผืžื ืขืก ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขืฉืจื™ื‘ืŸ ื•ื•ื™ ื“ืึธืก:

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 ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [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: ื–ื™ื™ ืคืืจื’ืขืกืŸ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืื™ื ื“ืขืงืก

ื‘ื™ื– ืึทื”ืขืจ, ืžื™ืจ ื’ืขืงื•ืงื˜ ื‘ื™ื™ ื‘ื™ื™ืฉืคื™ืœืŸ ืคื•ืŸ ื“ื™ืึทื’ื ืึธืกื˜ื™ืง ื˜ืจื™ื’ืขืจื™ื ื’ ื•ื•ืงืกื ื•ืžืงืก. ื–ื™ื™ึทืŸ ืขืกืึทื ืก ืื™ื– ืึทื– ื“ืขืจ ื˜ื™ื™ึทื˜ืœ ืื™ื– ื“ืขืจืขืคืขืจืึทื ืกื˜ ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘, ืื•ืŸ ื‘ืœื•ื™ื– ื“ืขืžืึธืœื˜ ืึธืคึผื’ืขืฉื˜ืขืœื˜. ื™ื•ื ื’ืข ื“ื™ืึทื’ื ืึธืกื˜ื™ืงืก ื•ื•ืงืกื ื•ืžืงืก ืื™ื– ื“ืขืจ ืคืึทืจืงืขืจื˜ ืื™ืŸ ื˜ื™ื™ึทื˜ืฉ, ืึธื‘ืขืจ ืื•ื™ืš ืจื™ื•ื•ื™ืœื– ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืขืจืจืึธืจืก. ืขืก ื™ื™ื“ืขื ืึทืคื™ื™ื“ ืกื™ื˜ื•ืึทื˜ื™ืึธื ืก ื•ื•ื• ื“ื™ ื˜ื™ื™ึทื˜ืœ ืื™ื– ืึธืคึผื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘ ืื•ืŸ ื“ืขืžืึธืœื˜ ืคืืจื’ืขืกืŸ ืฆื• ื˜ืึธืŸ ื“ืึธืก. ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ืึทื–ืึท ืงืึทืกืขืก ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ 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

ื•ื•ื™ ืฆื• ื‘ืึทืฉื™ืฆืŸ ื–ื™ืš ืคื•ืŸ ืึทื–ืึท ืขืจืจืึธืจืก? ื–ื™ื™ืŸ ืžืขืจ ืึทื˜ืขื ื˜ื™ื•ื• ืื•ื™ืฃ ืงืึธื“-ืจืขื•ื•ื™ืข ืื•ืŸ ื ื•ืฆืŸ ื“ื™ PVS-Studio ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ื–ืขืจ ืฆื• ืงืขืกื™ื™ื“ืขืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ื™ืŸ ืงืึธื“.

ืขืก ืื™ื– ืงื™ื™ืŸ ืคื•ื ื˜ ืฆื• ืฆื™ื˜ื™ืจืŸ ืื ื“ืขืจืข ืงืึธื“ ืคืจืึทื’ืžืึทื ืฅ ืžื™ื˜ ืขืจืจืึธืจืก ืคื•ืŸ ื“ืขื ื˜ื™ืคึผ. ืื™ืš ื•ื•ืขืœ ืœืึธื–ืŸ ื‘ืœื•ื™ื– ืึท ืจืฉื™ืžื” ืคื•ืŸ ื•ื•ืึธืจื ื™ื ื’ื– ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ:

  • V1004 [CWE-476] ื“ื™ 'ืขืงืกืคึผืจ' ื˜ื™ื™ึทื˜ืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืึทื ืกื™ื™ืฃ ื ืึธืš ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ืขืจืึทืคื™ื™ื“ ืงืขื’ืŸ nullptr. ื˜ืฉืขืง ืฉื•ืจื•ืช: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] ื“ื™ 'ืคึผื™' ื˜ื™ื™ึทื˜ืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืึทื ืกื™ื™ืฃ ื ืึธืš ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ืขืจืึทืคื™ื™ื“ ืงืขื’ืŸ nullptr. ื˜ืฉืขืง ืฉื•ืจื•ืช: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] ื“ื™ 'StatepointCall' ื˜ื™ื™ึทื˜ืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืึทื ืกื™ื™ืฃ ื ืึธืš ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ืขืจืึทืคื™ื™ื“ ืงืขื’ืŸ nullptr. ื˜ืฉืขืง ืฉื•ืจื•ืช: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] ื“ื™ 'ืจื•ื•' ื˜ื™ื™ึทื˜ืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืึทื ืกื™ื™ืฃ ื ืึธืš ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ืขืจืึทืคื™ื™ื“ ืงืขื’ืŸ nullptr. ื˜ืฉืขืง ืฉื•ืจื•ืช: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] ื“ื™ 'CalleeFn' ื˜ื™ื™ึทื˜ืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืึทื ืกื™ื™ืฃ ื ืึธืš ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ืขืจืึทืคื™ื™ื“ ืงืขื’ืŸ nullptr. ื˜ืฉืขืง ืฉื•ืจื•ืช: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] ื“ืขืจ 'TC' ื˜ื™ื™ึทื˜ืœ ืื™ื– ื’ืขื ื™ืฆื˜ ืึทื ืกื™ื™ืฃ ื ืึธืš ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ืขืจืึทืคื™ื™ื“ ืงืขื’ืŸ Nullptr. ื˜ืฉืขืง ืฉื•ืจื•ืช: 1819, 1824. Driver.cpp 1824

ืคืจืึทื’ืžืขื ื˜ N48-N60: ื ื™ื˜ ืงืจื™ื˜ื™ืฉ, ืึธื‘ืขืจ ืึท ื›ื™ืกืึธืจืŸ (ืžืขื’ืœืขืš ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ)

std::unique_ptr<IRMutator> createISelMutator() {
  ....
  std::vector<std::unique_ptr<IRMutationStrategy>> Strategies;
  Strategies.emplace_back(
      new InjectorIRStrategy(InjectorIRStrategy::getDefaultOps()));
  ....
}

PVS-Studio ื•ื•ืืจืขื ื•ื ื’: ื•ื•ืงืกื ื•ืžืงืก [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืกื˜ืจืึทื˜ืขื’ื™ืขืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-isel-fuzzer.cpp 58

ืฆื• ืœื™ื™ื’ืŸ ืึทืŸ ืขืœืขืžืขื ื˜ ืฆื• ื“ื™ ืกื•ืฃ ืคื•ืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ื•ื•ื™ std :: ื•ื•ืขืงื˜ืึธืจ > ืž'ืงืขืŸ ื ื™ืฉื˜ ืกืชื ืฉืจื™ื™ื‘ืŸ xxx.push_back (ื ื™ื™ึท X), ื–ื™ื ื˜ ืขืก ืื™ื– ืงื™ื™ืŸ ื™ืžืคึผืœื™ืกืึทื˜ ืงืึทื ื•ื•ืขืจื–ืฉืึทืŸ ืคื•ืŸ X* ะฒ std::unique_ptr.

ื ืคึผืจืึธืกื˜ ืœื™ื™ื–ื•ื ื’ ืื™ื– ืฆื• ืฉืจื™ื™ึทื‘ืŸ xxx.emplace_back (ื ื™ื™ึท X)ื–ื™ื ื˜ ืขืก ืงืึทืžืคึผื™ื™ืœื–: ืื•ืคึฟืŸ emplace_back ืงืึทื ืกื˜ืจืึทืงื˜ ืึทืŸ ืขืœืขืžืขื ื˜ ื’ืœื™ื™ึทืš ืคื•ืŸ ื–ื™ื™ึทืŸ ืึทืจื’ื•ืžืขื ื˜ืŸ ืื•ืŸ ืงืขื ืขืŸ ื“ืขืจื™ื‘ืขืจ ื ื•ืฆืŸ ื™ืงืกืคึผืœื™ืกืึทื˜ ืงืึทื ืกื˜ืจืึทืงื˜ืขืจื–.

ืขืก ืื™ื– ื ื™ืฉื˜ ื–ื™ื›ืขืจ. ืื•ื™ื‘ ื“ืขืจ ื•ื•ืขืงื˜ืึธืจ ืื™ื– ืคื•ืœ, ื–ื™ืงืึธืจืŸ ืื™ื– ืฉื™ื™ึทืขืš-ืึทืœืงื™ื™ื˜ื™ื“. ื“ื™ ื–ื™ืงืึธืจืŸ ืจื™ืึทืœืึธืงืึทื˜ื™ืึธืŸ ืึธืคึผืขืจืึทืฆื™ืข ืงืขืŸ ืคืึทืจืœืึธื–ืŸ, ืจื™ื–ืึทืœื˜ื™ื ื’ ืื™ืŸ ืึท ื•ื™ืกื ืขื std :: bad_alloc. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ืขืจ ื˜ื™ื™ึทื˜ืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืคืึทืจืคืึทืœืŸ ืื•ืŸ ื“ื™ ื‘ืืฉืืคืŸ ื›ื™ื™ืคืขืฅ ื•ื•ืขื˜ ืงื™ื™ื ืžืึธืœ ื–ื™ื™ืŸ ืื•ื™ืกื’ืขืžืขืงื˜.

ื ื–ื™ื›ืขืจ ืœื™ื™ื–ื•ื ื’ ืื™ื– ืฆื• ืฉืึทืคึฟืŸ ื™ื™ื ืฆื™ืง_ืคึผื˜ืจื•ื•ืึธืก ื•ื•ืขื˜ ืคืึทืจืžืึธื’ืŸ ื“ื™ ื˜ื™ื™ึทื˜ืœ ืื™ื™ื“ืขืจ ื“ืขืจ ื•ื•ืขืงื˜ืึธืจ ืคืจื•ื•ื•ื˜ ืฆื• ืจื™ืึทืœืึธืงื™ื™ื˜ ื–ื›ึผืจื•ืŸ:

xxx.push_back(std::unique_ptr<X>(new X))

ื–ื™ื ื˜ C ++14, ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ 'std::make_unique':

xxx.push_back(std::make_unique<X>())

ื“ืขืจ ื˜ื™ืคึผ ืคื•ืŸ ื›ื™ืกืึธืจืŸ ืื™ื– ื ื™ืฉื˜ ืงืจื™ื˜ื™ืฉ ืคึฟืึทืจ LLVM. ืื•ื™ื‘ ืžืขืžืึธืจื™ ืงืขื ืขืŸ ื ื™ื˜ ื–ื™ื™ืŸ ืึทืœืึทืงื™ื™ื˜ื™ื“, ื“ืขืจ ืงืึทืžืคึผื™ื™ืœืขืจ ื•ื•ืขื˜ ืคืฉื•ื˜ ื”ืึทืœื˜ืŸ. ืึธื‘ืขืจ, ืคึฟืึทืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืžื™ื˜ ืœืึทื ื’ ื•ืคึผื˜ื™ืžืข, ื•ื•ืึธืก ืงืขื ืขืŸ ื ื™ื˜ ื ืึธืจ ืคืึทืจืขื ื“ื™ืงืŸ ืื•ื™ื‘ ื–ื›ึผืจื•ืŸ ืึทืœืึทืงื™ื™ืฉืึทืŸ ืคื™ื™ืœื–, ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ืึท ืคืึทืงื˜ื™ืฉ ืคึผืึทืกืงื•ื“ื ืข ื–ืฉื•ืง.

ื›ืึธื˜ืฉ ื“ืขืจ ืงืึธื“ ืื™ื– ื ื™ืฉื˜ ืึท ืคึผืจืึทืงื˜ื™ืฉ ืกืึทืงืึธื ืข ืฆื• LLVM, ืื™ืš ื’ืขืคึฟื•ื ืขืŸ ืขืก ื ื•ืฆื™ืง ืฆื• ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื“ืขื ื˜ืขื•ืช ืžื•ืกื˜ืขืจ ืื•ืŸ ืึทื– ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ ื”ืื˜ ื’ืขืœืขืจื ื˜ ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ืขืก.

ืื ื“ืขืจืข ื•ื•ืึธืจื ื™ื ื’ื– ืคื•ืŸ ื“ืขื ื˜ื™ืคึผ:

  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืคึผืึทืกืึทื–' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. PassManager.h 546
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'AAs' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. AliasAnalysis.h 324
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืขื ื˜ืจื™ืขืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'AllEdges' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. CFGMST.h 268
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'VMaps' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืจืขืงืึธืจื“ืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. FDRLogBuilder.h 30
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'PendingSubmodules' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. ModuleMap.cpp 810
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืึธื‘ื“ื–ืฉืขืงืฅ' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. DebugMap.cpp 88
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืกื˜ืจืึทื˜ืขื’ื™ืขืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 685
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 686
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 688
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 689
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 690
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 691
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 692
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 693
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึธื“ื™ืคื™ืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. llvm-stress.cpp 694
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืึธืคึผืขืจืึทื ื“ืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'Stash' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] ื ื˜ื™ื™ึทื˜ืœ ืึธืŸ ื‘ืึทื–ื™ืฆืขืจ ืื™ื– ืžื•ืกื™ืฃ ืฆื• ื“ื™ 'ืžืึทื˜ื˜ืฉืขืจืก' ืงืึทื ื˜ื™ื™ื ืขืจ ื“ื•ืจืš ื“ื™ 'emplace_back' ืื•ืคึฟืŸ. ื ื–ื›ึผืจื•ืŸ ืจื™ื ืขืŸ ื•ื•ืขื˜ ืคืึทืœืŸ ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืึท ื•ื™ืกื ืขื. GlobalISelEmitter.cpp 2702

ืกืึธืฃ

ืื™ืš ืืจื•ื™ืก 60 ื•ื•ืึธืจื ื™ื ื’ื– ืื™ืŸ ื’ืึทื ืฅ ืื•ืŸ ื“ืขืžืึธืœื˜ ืคืืจืฉื˜ืืคื˜. ื–ืขื ืขืŸ ืขืก ืื ื“ืขืจืข ื—ืกืจื•ื ื•ืช ื•ื•ืึธืก ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ ื“ื™ื˜ืขืงืฅ ืื™ืŸ LLVM? ื™ื ืื™ืš ื”ืื‘. ืึธื‘ืขืจ, ื•ื•ืขืŸ ืื™ืš ื”ืึธื‘ ื’ืขืฉืจื™ื‘ืŸ ืงืึธื“ ืคืจืึทื’ืžืึทื ืฅ ืคึฟืึทืจ ื“ืขื ืึทืจื˜ื™ืงืœ, ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืฉืคึผืขื˜ ืึธื•ื•ื ื˜, ืึธื“ืขืจ ื’ืึทื ืฅ ื ืึทื›ื˜, ืื•ืŸ ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ืึทื– ืขืก ืื™ื– ืฆื™ื™ึทื˜ ืฆื• ืจื•ืคืŸ ืขืก ืึท ื˜ืึธื’.

ืื™ืš ื”ืึธืคึฟืŸ ืื™ืจ ื’ืขืคึฟื•ื ืขืŸ ืขืก ื˜ืฉื™ืงืึทื•ื•ืข ืื•ืŸ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ.

ืื™ืจ ืงืขื ื˜ ืืจืืคืงืืคื™ืข ื“ื™ ืึทื ืึทืœื™ื–ืขืจ ืื•ืŸ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืžื™ื ืขืกื•ื•ืขืขืคึผืขืจ ืฉืœื™ืกืœ ื‘ื™ื™ ื“ืขื ื‘ืœืึทื˜.

ืจื•ื‘ึฟ ื™ืžืคึผืึธืจื˜ืึทื ื˜ืœื™, ื ื•ืฆืŸ ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ืกื™ืก ืงืขืกื™ื™ื“ืขืจ. ืื™ื™ืŸ-ืฆื™ื™ึทื˜ ื˜ืฉืขืงืก, ื’ืขืคื™ืจื˜ ื“ื•ืจืš ืื•ื ื“ื– ืื™ืŸ ืกื“ืจ ืฆื• ืคึผืึธืคึผื•ืœืึทืจื™ื–ื™ืจืŸ ื“ื™ ืžืขื˜ืึทื“ืึทืœืึทื“ื–ืฉื™ ืคื•ืŸ ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ืกื™ืก ืื•ืŸ ืคึผื•ื•ืก-ืกื˜ื•ื“ื™ืึธ ื–ืขื ืขืŸ ื ื™ืฉื˜ ืึท ื ืึธืจืžืึทืœ ืกืฆืขื ืึทืจ.

ื’ื•ื˜ ื’ืœื™ืง ืื™ืŸ ื™ืžืคึผืจื•ื•ื•ื™ื ื’ ื“ื™ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืื•ืŸ ืจื™ืœื™ื™ืึทื‘ื™ืœืึทื˜ื™ ืคื•ืŸ ื“ื™ื™ืŸ ืงืึธื“!

ื’ืขืคึฟื™ื ืขืŸ ื‘ืึทื’ื– ืื™ืŸ LLVM 8 ื ื™ืฆืŸ ื“ื™ PVS-Studio ืึทื ืึทืœื™ื–ืขืจ

ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœื˜ ื˜ื™ื™ืœืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ื˜ ืึทืŸ ืขื ื’ืœื™ืฉ-ื’ืขืจืขื“ื˜ ื•ื™ืœืขื, ื‘ื™ื˜ืข ื ื•ืฆืŸ ื“ื™ ืื™ื‘ืขืจื–ืขืฆื•ื ื’ ืœื™ื ืง: Andrey Karpov. ื’ืขืคึฟื™ื ืขืŸ ื‘ืึทื’ื– ืื™ืŸ LLVM 8 ืžื™ื˜ PVS-Studio.

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’