เบŠเบญเบเบซเบฒเปเบกเบ‡เป„เบกเป‰เปƒเบ™ LLVM 8 เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบŠเบญเบเบซเบฒเปเบกเบ‡เป„เบกเป‰เปƒเบ™ LLVM 8 เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio
เบซเบผเบฒเบเบเบงเปˆเบฒเบชเบญเบ‡เบ›เบตเป„เบ”เป‰เบœเปˆเบฒเบ™เป„เบ›เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบฅเบฐเบซเบฑเบ”เบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™ LLVM เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio เบเบฑเบ‡เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบŠเบฑเป‰เบ™เบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบˆเบธเบ”เบญเปˆเบญเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเบงเบ”เบชเบญเบšเปเบฅเบฐเบŠเบญเบเบซเบฒเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบซเบกเปˆเปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบ LLVM 8.0.0.

เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™

เบ”เป‰เบงเบเบ„เบงเบฒเบกเบŠเบทเปˆเบชเบฑเบ”, เบ‚เป‰เบญเบเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰. เบกเบฑเบ™เบšเปเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบซเบผเบฒเบเบ„เบฑเป‰เบ‡เปเบฅเป‰เบง (1, 2, 3). เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เปƒเบซเบกเปˆ, เปเบ•เปˆเบ‚เป‰เบญเบเบšเปเปˆเบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบ.

เบ—เบธเบเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบชเบฐเบšเบฑเบšเปƒเปเปˆเบ‚เบญเบ‡ LLVM เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒ เบซเบผเบทเบญเบฑเบšเป€เบ”เบ” Clang Static Analyzer, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ„เปเบฒเบ–เบฒเบกเบ›เบฐเป€เบžเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบขเบนเปˆเปƒเบ™เป€เบกเบฅเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

เป€เบšเบดเปˆเบ‡, เบฎเบธเปˆเบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡ Clang Static Analyzer เป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบซเบกเปˆ! เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ‚เป‰เบญเบเบกเบตเบ„เบงเบฒเบกเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ PVS-Studio เปเบกเปˆเบ™เบซเบผเบธเบ”เบฅเบปเบ‡. Clang เบžเบปเบšเป€เบซเบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบซเบผเบฒเบเบเปˆเบงเบฒเบเปˆเบญเบ™เปเบฅเบฐเบˆเบฑเบšเบเบฑเบšเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡ PVS-Studio. เป€เบˆเบปเป‰เบฒเบ„เบดเบ”เปเบ™เบงเปƒเบ”เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰?

เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบกเบตเบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบญเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™:

เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ™เบฑเปˆเบ‡โ€‹เบขเบนเปˆโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹! เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เบฑเบšเบ›เบธเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ. เบชเบฐเบ™เบฑเป‰เบ™เบขเปˆเบฒเบเบฑเบ‡เบงเบปเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบทเบšเบ•เปเปˆเบ™เปเบฒเบžเบฒเบ„เบทเป€เบเบปเปˆเบฒ.

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ™เบตเป‰เปเบกเปˆเบ™เบ„เปเบฒเบ•เบญเบšเบ—เบตเปˆเบšเปเปˆเบ”เบต. เบšเปเปˆเบกเบตเบซเบผเบฑเบเบ–เบฒเบ™เปƒเบ”เป†เปƒเบ™เบกเบฑเบ™. เปเบฅเบฐเบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป‚เบ„เบ‡เบเบฒเบ™ LLVM เป„เบ”เป‰เบ–เบทเบเบเบงเบ”เบชเบญเบšเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เปเบฅเบฐเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ•เปˆเบฒเบ‡เป†เป„เบ”เป‰เบ–เบทเบเบžเบปเบšเป€เบซเบฑเบ™เบขเบนเปˆเปƒเบ™เบกเบฑเบ™. เบ•เบญเบ™เบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบเบฑเบšเบ‚เป‰เบญเบ. Clang Static Analyzer เบšเปเปˆเบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰ (เบซเบผเบทเบกเบฑเบ™เบšเปเปˆเบชเบฐเบ”เบงเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบฑเป‰เบ™เบ”เป‰เบงเบเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบกเบฑเบ™). เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบปเบšเป€เบซเบฑเบ™เปเบฅเบฐเบ‚เบฝเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบ•เบญเบ™เปเบฅเบ‡เบซเบ™เบถเปˆเบ‡.

เปเบ•เปˆเบเบฒเบ™เบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเบญเบฒเบ—เบดเบ”. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบšเปเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เบ•เบปเบ™โ€‹เป€เบญเบ‡โ€‹เป€เบžเบทเปˆเบญโ€‹เป€เบญเบปเบฒโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ™เบตเป‰โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบก :).

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบชเบปเบ™เปƒเบˆเปƒเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบˆเบธเบ”เบญเปˆเบญเบ™เบ—เบตเปˆเบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™, เบ‚เป‰เบญเบเบ‚เปเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบฎเบนเป‰เบˆเบฑเบเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰. เบซเบกเบฒเบโ€‹เป€เบซเบ”โ€‹.

เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเปƒเบซเบกเปˆเปเบฅเบฐเป€เบเบปเปˆเบฒ

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบฅเบฐเบšเบธเป„เบงเป‰เปเบฅเป‰เบง, เบ›เบฐเบกเบฒเบ™เบชเบญเบ‡เบ›เบตเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เป‚เบ„เบ‡เบเบฒเบ™ LLVM เป„เบ”เป‰เบ–เบทเบเบเบงเบ”เบชเบญเบšเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เปเบฅเบฐเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™เป„เบ”เป‰เบ–เบทเบเปเบเป‰เป„เบ‚. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเบ™เปเบฒเบชเบฐเป€เบซเบ™เบต batch เปƒเบซเบกเปˆเบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบžเบปเบšเบšเบฑเบเปƒเปเปˆ? เบกเบต 3 เป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰:

  1. เป‚เบ„เบ‡เบเบฒเบ™ LLVM เบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เป€เบเบปเปˆเบฒเปเบฅเบฐเป€เบžเบตเปˆเบกเบฅเบฐเบซเบฑเบ”เปƒเบซเบกเปˆ. เบ•เบฒเบกเบ—เปเบฒเบกเบฐเบŠเบฒเบ”, เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบซเบกเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เบ”เบฑเบ”เปเบเป‰เปเบฅเบฐเบฅเบฒเบเบฅเบฑเบเบญเบฑเบเบชเบญเบ™. เบ™เบตเป‰เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ static เบ„เบงเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบ›เบฑเบ™เบ›เบปเบเบเบฐเบ•เบด, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ„เบฒเบง. เบšเบปเบ”เบ„เบงเบฒเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio, เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ„เบธเบ™เบ™เบฐเบžเบฒเบšเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”. เปƒเบŠเป‰เบ•เบปเบงเบงเบดเป€เบ„เบฒเบฐเบฅเบฐเบซเบฑเบ”เบชเบฐเบ–เบดเบ”เป€เบ›เบฑเบ™เบ›เบฐเบˆเบณ!
  2. เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบเปเบฒโ€‹เบฅเบฑเบ‡โ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เบฎเบนเบšโ€‹เปเบฅเบฐโ€‹เบ›เบฑเบšโ€‹เบ›เบธเบ‡โ€‹เบเบฒเบ™โ€‹เบงเบดโ€‹เบ™เบดเบ”โ€‹เป„เบชโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบขเบนเปˆโ€‹เปเบฅเป‰เบงโ€‹. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบชเบฐเปเบเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ.
  3. เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเปƒเปเปˆเป„เบ”เป‰เบ›เบฐเบเบปเบ”เบขเบนเปˆเปƒเบ™ PVS-Studio เบ—เบตเปˆเบšเปเปˆเบกเบตเบขเบนเปˆ 2 เบ›เบตเบเปˆเบญเบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบ™เบฑเป‰เบ™เปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบขเบนเปˆเปƒเบ™เบžเบฒเบเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡ PVS-Studio.

เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบตเปˆเบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเบ—เบตเปˆเบกเบตเบขเบนเปˆ 2 เบ›เบตเบเปˆเบญเบ™

Fragment N1: เบชเบณเป€เบ™เบปเบฒ-เบงเบฒเบ‡

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V501 [CWE-570] เบกเบตเบชเปˆเบงเบ™เบเปˆเบญเบเบ—เบตเปˆเบ„เบทเบเบฑเบ™ 'Name.startswith("avx512.mask.permvar.")' เป„เบ›เบ—เบฒเบ‡เบŠเป‰เบฒเบ เปเบฅเบฐเบ‚เบงเบฒเบ‚เบญเบ‡ '||' เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™. AutoUpgrade.cpp 73

เบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบชเบญเบ‡เป€เบ—เบทเปˆเบญเบงเปˆเบฒเบŠเบทเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบชเบฒเบเบเปˆเบญเบ "avx512.mask.permvar." เปƒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบฑเป‰เบ‡เบ—เบตเบชเบญเบ‡, เปเบ™เปˆเบ™เบญเบ™เบžเบงเบเป€เบ‚เบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบชเบดเปˆเบ‡เบญเบทเปˆเบ™, เปเบ•เปˆเบฅเบทเบกเปเบเป‰เป„เบ‚เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ–เบทเบเบ„เบฑเบ”เบฅเบญเบ.

Fragment N2: เบžเบดเบกเบœเบดเบ”

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

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V501 เบกเบตเบชเปˆเบงเบ™เบเปˆเบญเบเบ—เบตเปˆเบ„เบทเบเบฑเบ™ 'CXNameRange_WantQualifier' เป„เบ›เบ—เบฒเบ‡เบŠเป‰เบฒเบ เปเบฅเบฐเบ‚เบงเบฒเบ‚เบญเบ‡ '|' เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™. CIndex.cpp 7245

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบžเบดเบกเบœเบดเบ”, เบ„เปˆเบฒเบ„เบปเบ‡เบ—เบตเปˆเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ”เบฝเบงเบเบฑเบ™เบ–เบทเบเปƒเบŠเป‰เบชเบญเบ‡เบ„เบฑเป‰เบ‡ CXNameRange_WantQualifier.

Fragment N3: เบชเบฑเบšเบชเบปเบ™เบเบฑเบšเบ„เบณเบชเบฑเปˆเบ‡เบเปˆเบญเบ™เปœเป‰เบฒ

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: 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 เบเบฑเบšเบ•เบปเบงเปเบ› เบ”เบฑเบ”เบŠเบฐเบ™เบต. เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบฅเบฐเบซเบฑเบ”, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบงเบปเบ‡เป€เบฅเบฑเบšเบ›เบฐเบกเบฒเบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ ternary:

if (ISD == ISD::EXTRACT_VECTOR_ELT && Index == (ST->isLittleEndian() ? 1 : 0))

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™ ternary เปเบกเปˆเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบซเบผเบฒเบเปเบฅเบฐ provokes เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™. เบˆเบปเปˆเบ‡เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เบเบฑเบšเบกเบฑเบ™ เปเบฅเบฐเบขเปˆเบฒเป‚เบฅเบšเบกเบฒเบเบเบฑเบšเบงเบปเบ‡เป€เบฅเบฑเบš. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก เบ—เบตเปˆเบ™เบตเป‰, เปƒเบ™เบšเบปเบ” "เบฅเบฐเบงเบฑเบ‡เบ‚เบญเบ‡ ?: เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เปเบฅเบฐเบ›เบดเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบงเบปเบ‡เป€เบฅเบฑเบš."

Fragment N4, N5: เบ•เบปเบงเบŠเบตเป‰ Null

Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
  ....
  TypedInit *LHS = dyn_cast<TypedInit>(Result);
  ....
  LHS = dyn_cast<TypedInit>(
    UnOpInit::get(UnOpInit::CAST, LHS, StringRecTy::get())
      ->Fold(CurRec));
  if (!LHS) {
    Error(PasteLoc, Twine("can't cast '") + LHS->getAsString() +
                    "' to string");
    return nullptr;
  }
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V522 [CWE-476] เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡เบ•เบปเบงเบŠเบตเป‰ null 'LHS' เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. TGParser.cpp 2152

เบ–เป‰เบฒเบ•เบปเบงเบŠเบตเป‰ LHS เปเบกเปˆเบ™ null, เบเบฒเบ™เป€เบ•เบทเบญเบ™เป„เบžเบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบญเบญเบ. เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐ, เบ•เบปเบงเบŠเบตเป‰ null เบ”เบฝเบงเบเบฑเบ™เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบญเป‰เบฒเบ‡เบญเบตเบ‡: LHS->getAsString().

เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบปเบเบเบฐเบ•เบดเบซเบผเบฒเบเป€เบกเบทเปˆเบญเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ–เบทเบเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เปƒเบ™เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”, เป€เบžเบฒเบฐเบงเปˆเบฒเบšเปเปˆเบกเบตเปƒเบœเบ—เบปเบ”เบชเบญเบšเบžเบงเบเบกเบฑเบ™. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เบปเบ‡เบ—เบตเปˆเบเบงเบ”เป€เบšเบดเปˆเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบ—เบฑเบ‡เบซเบกเบปเบ”, เบšเปเปˆเบงเปˆเบฒเบกเบฑเบ™เบ–เบทเบเปƒเบŠเป‰เป€เบฅเบทเป‰เบญเบเป†เป€เบ—เบปเปˆเบฒเปƒเบ”. เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ”เบตเบซเบผเบฒเบเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบดเบ”เปƒเบซเป‰เบชเบปเบกเบšเบนเบ™เปเบšเบšเบญเบทเปˆเบ™เป†เปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเป€เบ•เบฑเบเบ™เบดเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.

เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™ เบฎเบฎ เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰: V522 [CWE-476] เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบ•เบปเบงเบŠเบตเป‰ null 'RHS' เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. TGParser.cpp 2186

Fragment N6: เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบ

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

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

เบ„เปเบฒเป€เบ•เบทเบญเบ™ PVS-Studio: V522 [CWE-476] เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ null 'ProgClone' เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. Miscompilation.cpp 601

เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบชเบฐเบซเบผเบฒเบ” ProgClone เบขเบธเบ”เบเบฒเบ™เป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธ:

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

เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ ProgClone เป€เบ›เบฑเบ™เบ•เบปเบงเบŠเบตเป‰ null. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ•เบปเบงเบŠเบตเป‰ null เบ„เบงเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบขเบนเปˆเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰:

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

เปเบ•เปˆ, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ™เบตเป‰เบˆเบฐเบšเปเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™! เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒ loop เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบˆเบดเบ‡.

เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ–เบฑเบ‡ MiscompiledFunctions เบฅเบถเบšเบฅเป‰เบฒเบ‡:

MiscompiledFunctions.clear();

เบ•เปเปˆเป„เบ›, เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ–เบฑเบ‡เบ™เบตเป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบชเบฐเบžเบฒเบš loop:

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

เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบซเบฑเบ™เบงเปˆเบฒ loop เบšเปเปˆเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบ™เบตเป‰เบเบฑเบ‡เป€เบ›เบฑเบ™ bug เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบ‚เบฝเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™.

เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบปเบšเบเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡เบ™เบฑเป‰เบ™! เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบญเบฑเบ™เปœเบถเปˆเบ‡เบ›เบดเบ”เบšเบฑเบ‡เบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡ :).

Fragment N7: เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบŠเบตเป‰เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เบเป‰เบฒเบ

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

เบเบฒเบ™เป€เบ•เบทเบญเบ™ PVS-Studio: V522 [CWE-476] เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ null 'เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš' เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. Miscompilation.cpp 709

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฝเบงเบเบฑเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เปƒเบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”, เป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธเป„เบ”เป‰เบ–เบทเบเบเป‰เบฒเบ, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ„เบทเบเบฑเบšเบงเปˆเบฒเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบ‚เป‰เบญเบเป€เบซเบฑเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบตเป‰เป€เบฅเบทเป‰เบญเบเป†เปƒเบ™เบฅเบฐเบซเบฑเบ”เป‚เบ›เบผเปเบเบผเบกเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง semantics เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™ C ++. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบฎเบฑเบเบžเบฒเบชเบฒ C ++! เบกเบตเบงเบดเบ—เบตเปƒเปเปˆเป†เบซเบผเบฒเบเบ‚เบถเป‰เบ™เป€เบžเบทเปˆเบญเบเบดเบ‡เบ‚เบฒเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเป€เบญเบ‡. เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio เบชเบฐเป€เบซเบกเบตเบˆเบฐเบกเบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ :).

Fragment N8: เบ•เบปเบงเบŠเบตเป‰ Null

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

เบเบฒเบ™เป€เบ•เบทเบญเบ™ PVS-Studio: V522 [CWE-476] เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰ null 'เบ›เบฐเป€เบžเบ”' เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. PrettyFunctionDumper.cpp 233

เบ™เบญเบเป€เปœเบทเบญเป„เบ›เบˆเบฒเบเบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, เบเบฒเบ™เปเบเป‰เบšเบฑเบ™เบซเบฒเบเบฒเบ™เบžเบดเบกเบญเบญเบเปœเป‰เบฒเบ›เบปเบเบเบฐเบ•เบดเปเบกเปˆเบ™เบšเปเปˆเป„เบ”เป‰เบ—เบปเบ”เบชเบญเบš. เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบเปˆเบญเบ™เบžเบงเบเป€เบฎเบปเบฒ. เบŸเบฑเบ‡เบŠเบฑเบ™เปเบกเปˆเบ™เบฅเปเบ–เป‰เบฒเบœเบนเป‰เปƒเบŠเป‰, เบœเบนเป‰เบ—เบตเปˆ, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบฅเบฒเบง, เบˆเบฐเบ–เบทเบเบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เปเบเป‰เป„เบ‚.

เบ–เบทเบเบ•เป‰เบญเบ‡:

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

Fragment N9: เบ•เบปเบงเบŠเบตเป‰ Null

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

เบเบฒเบ™เป€เบ•เบทเบญเบ™ PVS-Studio: V522 [CWE-476] เบเบฒเบ™เบ›เบฐเบ•เบดเป€เบชเบ”เบ•เบปเบงเบŠเบตเป‰ null 'Ty' เบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™. SearchableTableEmitter.cpp 614

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบˆเบฐเปเบˆเป‰เบ‡เปเบฅเบฐเบšเปเปˆเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบ.

Fragment N10: เบžเบดเบกเบœเบดเบ”

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V570 เบ•เบปเบงเปเบ› 'Identifier->Type' เบ–เบทเบเบกเบญเบšเปเบฒเบเปƒเบซเป‰เบเบฑเบšเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡. FormatTokenLexer.cpp 249

เบšเปเปˆเบกเบตเบˆเบธเบ”เปƒเบ”เปƒเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›เปƒเบซเป‰เบเบฑเบšเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡. เบชเปˆเบงเบ™เบซเบผเบฒเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™:

Identifier->Type = Question->Type;

Fragment N11: เบเบฒเบ™เปเบ•เบเปเบเบเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบช

void SystemZOperand::print(raw_ostream &OS) const {
  switch (Kind) {
    break;
  case KindToken:
    OS << "Token:" << getToken();
    break;
  case KindReg:
    OS << "Reg:" << SystemZInstPrinter::getRegisterName(getReg());
    break;
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V622 [CWE-478] เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เบ—เบตเปˆ 'เบชเบฐเบซเบผเบฑเบš'. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ 'เบเปเบฅเบฐเบ™เบต' เบ—เปเบฒเบญเบดเบ”เบซเบฒเบเป„เบ›. SystemZAsmParser.cpp 652

เบกเบตเบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบชเบซเบผเบฒเบเปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบžเบฑเบเบœเปˆเบญเบ™. เป€เบˆเบปเป‰เบฒเบฅเบทเบกเบ‚เบฝเบ™เบญเบฑเบ™เบญเบทเปˆเบ™เบขเบนเปˆเบšเปˆเบญเบ™เบ™เบตเป‰เบšเป?

Fragment N12: เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ•เบปเบงเบŠเบตเป‰เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡

InlineCost AMDGPUInliner::getInlineCost(CallSite CS) {
  Function *Callee = CS.getCalledFunction();
  Function *Caller = CS.getCaller();
  TargetTransformInfo &TTI = TTIWP->getTTI(*Callee);

  if (!Callee || Callee->isDeclaration())
    return llvm::InlineCost::getNever("undefined callee");
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V595 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'Callee' เบ–เบทเบเบ™เบณเปƒเบŠเป‰เบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เป€เบšเบดเปˆเบ‡เป€เบชเบฑเป‰เบ™: 172, 174. AMDGPUInline.cpp 172

เบ•เบปเบงเบŠเบตเป‰เบงเบฑเบ” เป‚เบ— เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™ dereferenced เปƒเบ™เป€เบงเบฅเบฒเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ เป„เบ”เป‰เบฎเบฑเบšTTI.

เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™ turns เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบ•เบปเบงเบŠเบตเป‰เบ™เบตเป‰เบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบชเบฐเป€เบซเบกเบตเบžเบฒเบš nullptr:

if (!Callee || Callee->isDeclaration())

เปเบ•เปˆเบกเบฑเบ™เบŠเป‰เบฒเป€เบเบตเบ™เป„เบ›โ€ฆ

Fragment N13 - N...: เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ•เบปเบงเบŠเบตเป‰เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบชเบปเบ™เบ—เบฐเบ™เบฒเบขเบนเปˆเปƒเบ™เบŠเบดเป‰เบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเปเบกเปˆเบ™เบšเปเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ. เบกเบฑเบ™เบ›เบฒเบเบปเบ”เบขเบนเปˆเบ™เบตเป‰:

static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
                               bool isBinary, bool isPrecise = false) {
  ....
  Function *CalleeFn = CI->getCalledFunction();
  StringRef CalleeNm = CalleeFn->getName();                 // <=
  AttributeList CalleeAt = CalleeFn->getAttributes();
  if (CalleeFn && !CalleeFn->isIntrinsic()) {               // <=
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V595 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'CalleeFn' เบ–เบทเบเบ™เบณเปƒเบŠเป‰เบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเบ–เบทเบเบขเบทเบ™เบขเบฑเบ™เบ•เปเปˆเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 1079, 1081. SimplifyLibCalls.cpp 1079

เปเบฅเบฐเบ™เบตเป‰:

void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
                            const Decl *Tmpl, Decl *New,
                            LateInstantiatedAttrVec *LateAttrs,
                            LocalInstantiationScope *OuterMostScope) {
  ....
  NamedDecl *ND = dyn_cast<NamedDecl>(New);
  CXXRecordDecl *ThisContext =
    dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());         // <=
  CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(),
                             ND && ND->isCXXInstanceMember());     // <=
  ....
}

เบ„เปเบฒเป€เบ•เบทเบญเบ™ PVS-Studio: V595 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'ND' เบ–เบทเบเปƒเบŠเป‰เบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเบ–เบทเบเบขเบทเบ™เบขเบฑเบ™เบ•เปเปˆเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเป€เบชเบฑเป‰เบ™: 532, 534. SemaTemplateInstantiateDecl.cpp 532

เปเบฅเบฐเบ™เบตเป‰:

  • V595 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'U' เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบขเบฑเป‰เบ‡เบขเบทเบ™เบ•เปเปˆเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเป€เบชเบฑเป‰เบ™: 404, 407. DWARFormValue.cpp 404
  • V595 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'ND' เบ–เบทเบเบ™เบณเปƒเบŠเป‰เบเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเป€เบชเบฑเป‰เบ™: 2149, 2151. SemaTemplateInstantiate.cpp 2149

เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบเปเปˆเบšเปเปˆเบชเบปเบ™เปƒเบˆเปƒเบ™เบเบฒเบ™เบชเบถเบเบชเบฒเบ„เปเบฒเป€เบ•เบทเบญเบ™เบ—เบตเปˆเบกเบตเบซเบกเบฒเบเป€เบฅเบ V595. เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™.

Fragment N17, N18: เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบช

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V629 [CWE-190] เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ '~(Size - 1) << 1'. เบเบฒเบ™เบ›เปˆเบฝเบ™เบšเบดเบ”เบ‚เบญเบ‡เบ„เปˆเบฒ 32-bit เบ”เป‰เบงเบเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ•เปเปˆเป„เบ›เป€เบ›เบฑเบ™เบ›เบฐเป€เบžเบ” 64-bit. AArch64AddressingModes.h 260

เบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™ bug เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เปˆเบ™เบญเบ™เบ•เบฒเบกเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡. เปเบ•เปˆเบ™เบตเป‰เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เป€เบ›เบฑเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบชเบซเบผเบฒเบเปเบฅเบฐเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบงเบ”เบเบฒ.

เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ•เบปเบงเปเบ› เป€เบฅเบทเบญเบเบ‚เบฐเบซเบ™เบฒเบ” เปเบกเปˆเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš 16, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบœเบนเป‰เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ•เบปเบงเปเบ› NImms เบ„เบงเบฒเบกโ€‹เบซเบกเบฒเบ:

1111111111111111111111111111111111111111111111111111111111100000

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเป€เบ›เบฑเบ™:

0000000000000000000000000000000011111111111111111111111111100000

เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบงเปˆเบฒเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰เบ›เบฐเป€เบžเบ” 32-bit unsigned. เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ›เบฐเป€เบžเบ” 32-bit unsigned เบ™เบตเป‰เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ implicitly เบเบฑเบš uint64_t. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, bits เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เบˆเบฐเป€เบ›เบฑเบ™เบชเบนเบ™.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

uint64_t NImms = ~static_cast<uint64_t>(Size-1) << 1;

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™: V629 [CWE-190] เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ 'Immr << 6'. เบเบฒเบ™เบ›เปˆเบฝเบ™เบšเบดเบ”เบ‚เบญเบ‡เบ„เปˆเบฒ 32-bit เบ”เป‰เบงเบเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ•เปเปˆเป„เบ›เป€เบ›เบฑเบ™เบ›เบฐเป€เบžเบ” 64-bit. AArch64AddressingModes.h 269

Fragment N19: เบšเปเปˆเบกเบตเบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™ เบญเบทเปˆเบ™?

void AMDGPUAsmParser::cvtDPP(MCInst &Inst, const OperandVector &Operands) {
  ....
  if (Op.isReg() && Op.Reg.RegNo == AMDGPU::VCC) {
    // VOP2b (v_add_u32, v_sub_u32 ...) dpp use "vcc" token.
    // Skip it.
    continue;
  } if (isRegOrImmWithInputMods(Desc, Inst.getNumOperands())) {    // <=
    Op.addRegWithFPInputModsOperands(Inst, 2);
  } else if (Op.isDPPCtrl()) {
    Op.addImmOperands(Inst, 1);
  } else if (Op.isImm()) {
    // Handle optional arguments
    OptionalIdx[Op.getImmTy()] = I;
  } else {
    llvm_unreachable("Invalid operand type");
  }
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V646 [CWE-670] เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเป€เบซเบ”เบœเบปเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบ„เปเบฒเบซเบฅเบฑเบ 'เบญเบทเปˆเบ™' เบซเบฒเบเป„เบ›. AMDGPUAsmParser.cpp 5655

เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ™เบฑเป‰เบ™เบกเบฒ, เบ•เบฑเบ™เบ‚เบญเบ‡เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ” if เบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบ เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ•เปเปˆ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™, เบกเบตเบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™ เบญเบทเปˆเบ™ เบซเบผเบทโ€‹เบšเปเปˆ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบฅเบฐเบซเบฑเบ”เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบ„เบทเบเบฑเบ™. เบเบฑเบ‡เบžเบฒเบ” เบญเบทเปˆเบ™ เป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบซเบฑเบ”เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เปเบฅเบฐเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบซเบผเบฒเบ. เบ–เป‰เบฒเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ” เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ•เปเปˆ เบซเบฒเบเป„เบ›, เบฅเบฐเบซเบฑเบ”เบˆเบฐเป€เบฅเบตเปˆเบกเป€เบฎเบฑเบ”เบงเบฝเบเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบกเบปเบ”. เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบžเบตเปˆเบก เบญเบทเปˆเบ™.

Fragment N20: เบชเบตเปˆ typos เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ”เบฝเบงเบเบฑเบ™

LLVM_DUMP_METHOD void Symbol::dump(raw_ostream &OS) const {
  std::string Result;
  if (isUndefined())
    Result += "(undef) ";
  if (isWeakDefined())
    Result += "(weak-def) ";
  if (isWeakReferenced())
    Result += "(weak-ref) ";
  if (isThreadLocalValue())
    Result += "(tlv) ";
  switch (Kind) {
  case SymbolKind::GlobalSymbol:
    Result + Name.str();                        // <=
    break;
  case SymbolKind::ObjectiveCClass:
    Result + "(ObjC Class) " + Name.str();      // <=
    break;
  case SymbolKind::ObjectiveCClassEHType:
    Result + "(ObjC Class EH) " + Name.str();   // <=
    break;
  case SymbolKind::ObjectiveCInstanceVariable:
    Result + "(ObjC IVar) " + Name.str();       // <=
    break;
  }
  OS << Result;
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio:

  • V655 [CWE-480] เบชเบฒเบเบ–เบทเบเป€เบŠเบทเปˆเบญเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ 'Result + Name.str()'. Symbol.cpp 32
  • V655 [CWE-480] เบชเบฒเบเบ–เบทเบเป€เบŠเบทเปˆเบญเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ 'Result + "(ObjC Class)" + Name.str()'. Symbol.cpp 35
  • V655 [CWE-480] เบชเบฒเบเบ–เบทเบเป€เบŠเบทเปˆเบญเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ 'Result + "(ObjC Class EH)" + Name.str()'. Symbol.cpp 38
  • V655 [CWE-480] เบชเบฒเบเบ–เบทเบเป€เบŠเบทเปˆเบญเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบงเบ”เบชเบญเบšเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ 'Result + "(ObjC IVar)" + Name.str()'. Symbol.cpp 41

เป‚เบ”เบเบšเบฑเบ‡เป€เบญเบตเบ™, เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ + เบ–เบทเบเปƒเบŠเป‰เปเบ—เบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ +=. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบเบฒเบ™เบญเบญเบเปเบšเบšเบ—เบตเปˆเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบ.

Fragment N21: เบžเบถเบ”เบ•เบดเบเปเบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”

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

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

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

เบžเบฐเบเบฒเบเบฒเบกเบŠเบญเบเบซเบฒเบฅเบฐเบซเบฑเบ”เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡. เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบฎเบนเบšเบ—เบตเปˆเบˆเบฐเบฅเบปเบšเบเบงเบ™เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบ„เปเบฒเบ•เบญเบšเบ—เบฑเบ™เบ—เบต:

เบŠเบญเบเบซเบฒเปเบกเบ‡เป„เบกเป‰เปƒเบ™ LLVM 8 เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V708 [CWE-758] เบเบฒเบ™เบชเป‰เบฒเบ‡เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบ–เบทเบเปƒเบŠเป‰: 'FeaturesMap[Op] = FeaturesMap.size()', เบšเปˆเบญเบ™เบ—เบตเปˆ 'FeaturesMap' เป€เบ›เบฑเบ™เบ‚เบญเบ‡ 'map' class. เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบ™เปเบฒเป„เบ›เบชเบนเปˆเบžเบถเบ”เบ•เบดเบเปเบฒเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”. RISCVCompressInstEmitter.cpp 490

เป€เบชเบฑเป‰เบ™เบšเบฑเบ™เบซเบฒ:

FeaturesMap[Op] = FeaturesMap.size();

เบ–เป‰เบฒเบญเบปเบ‡เบ›เบฐเบเบญเบš Op เบšเปเปˆเบžเบปเบš, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เปƒเบ™เปเบœเบ™เบ—เบตเปˆเปเบฅเบฐเบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ™เปเบœเบ™เบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบ‚เบฝเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเบˆเบฐเป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™ เบ‚เบฐเบซเบ™เบฒเบ” เบเปˆเบญเบ™ เบซเบผเบทเบซเบผเบฑเบ‡เบˆเบฒเบเป€เบžเบตเปˆเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเปเปˆ.

Fragment N22-N24: เบเบฒเบ™เบกเบญเบšเปเบฒเบเบŠเปเป‰เบฒเบ„เบทเบ™

Error MachOObjectFile::checkSymbolTable() const {
  ....
  } else {
    MachO::nlist STE = getSymbolTableEntry(SymDRI);
    NType = STE.n_type;                              // <=
    NType = STE.n_type;                              // <=
    NSect = STE.n_sect;
    NDesc = STE.n_desc;
    NStrx = STE.n_strx;
    NValue = STE.n_value;
  }
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V519 [CWE-563] เบ•เบปเบงเปเบ› '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

Fragment N25-N27: เบเบฒเบ™เบกเบญเบšเปเบฒเบเปƒเปเปˆเป€เบžเบตเปˆเบกเป€เบ•เบตเบก

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบชเบฐเบšเบฑเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเปƒเบซเบกเปˆ.

bool Vectorizer::vectorizeLoadChain(
    ArrayRef<Instruction *> Chain,
    SmallPtrSet<Instruction *, 16> *InstructionsProcessed) {
  ....
  unsigned Alignment = getAlignment(L0);
  ....
  unsigned NewAlign = getOrEnforceKnownAlignment(L0->getPointerOperand(),
                                                 StackAdjustedAlignment,
                                                 DL, L0, nullptr, &DT);
  if (NewAlign != 0)
    Alignment = NewAlign;
  Alignment = NewAlign;
  ....
}

เบ„เปเบฒเป€เบ•เบทเบญเบ™ PVS-Studio: V519 [CWE-563] เบ•เบปเบงเปเบ› 'Alignment' เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเบ„เปˆเบฒเบชเบญเบ‡เบ„เบฑเป‰เบ‡เบ•เบดเบ”เบ•เปเปˆเบเบฑเบ™. เบšเบฒเบ‡เบ—เบตเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 1158, 1160. LoadStoreVectorizer.cpp 1160

เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเปเบ›เบเบ›เบฐเบซเบผเบฒเบ”เบซเบผเบฒเบเบ—เบตเปˆเบ›เบฒเบเบปเบ”เบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™. เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ เบเบฒเบ™เบˆเบฑเบ”เบ•เปเบฒเปเบซเบ™เปˆเบ‡ เบ„เปˆเบฒเบ–เบทเบเบกเบญเบšเปเบฒเบเบ‚เบถเป‰เบ™เบเบฑเบšเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚. เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เปเบ•เปˆเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบเบงเบ”เบเบฒเปƒเบ”เป†.

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เบ—เบตเปˆเบ™เบตเป‰:

  • V519 [CWE-563] เบ•เบปเบงเปเบ› 'เบœเบปเบ™เบเบฐเบ—เบปเบš' เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเบ„เปˆเบฒเบชเบญเบ‡เบ„เบฑเป‰เบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡. เบšเบฒเบ‡เบ—เบตเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบเบงเบ”เบชเบญเบšเป€เบชเบฑเป‰เบ™: 152, 165. WebAssemblyRegStackify.cpp 165
  • V519 [CWE-563] เบ•เบปเบงเปเบ› 'ExpectNoDerefChunk' เบ–เบทเบเบกเบญเบšเปเบฒเบเบ„เปˆเบฒเบชเบญเบ‡เป€เบ—เบทเปˆเบญเบ•เบดเบ”เบ•เปเปˆเบเบฑเบ™. เบšเบฒเบ‡เบ—เบตเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบเบงเบ”เบชเบญเบšเป€เบชเบฑเป‰เบ™: 4970, 4973. SemaType.cpp 4973

Fragment N28: เบชเบฐเบžเบฒเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบชเบฐเป€เปเบต

static int readPrefixes(struct InternalInstruction* insn) {
  ....
  uint8_t byte = 0;
  uint8_t nextByte;
  ....
  if (byte == 0xf3 && (nextByte == 0x88 || nextByte == 0x89 ||
                       nextByte == 0xc6 || nextByte == 0xc7)) {
    insn->xAcquireRelease = true;
    if (nextByte != 0x90) // PAUSE instruction support             // <=
      break;
  }
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V547 [CWE-571] เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ 'nextByte != 0x90' เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡เบชเบฐเป€เปเบต. X86DisassemblerDecoder.cpp 379

เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบ. เบ•เบปเบงเปเบ› NextByte เบชเบฐเป€เบซเบกเบตเบšเปเปˆเป€เบ—เบปเปˆเบฒเบเบฑเบšเบกเบนเบ™เบ„เปˆเบฒ 0x90, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบˆเบฒเบเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ. เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™.

Fragment N29 - N...: เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡/เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบชเบฐเป€เปเบต

เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบญเบญเบเบ„เปเบฒเป€เบ•เบทเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบงเปˆเบฒเบชเบฐเบžเบฒเบšเบ—เบฑเบ‡เบซเบกเบปเบ” (V547) เบซเบผเบทโ€‹เบชเปˆเบงเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบกเบฑเบ™ (V560) เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡ เบซเบผเบทเบœเบดเบ”เบชเบฐเป€เปเบต. เป€เบฅเบทเป‰เบญเบเป†เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเบฅเบฐเบซเบฑเบ” sloppy, เบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบกเบฐเบซเบฒเบžเบฒเบ, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบฑเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบ„เบงเบฒเบกเบฎเบนเป‰เบชเบถเบเบ—เบตเปˆเบˆเบฐเป€เบšเบดเปˆเบ‡เบเบฒเบ™เป€เบ•เบทเบญเบ™เป„เบžเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบกเบตเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เป€เบเบตเบ”เบ‚เบทเป‰เบ™เบšเบฒเบ‡เบ„เบฑเป‰เบ‡. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบฒเบเบชเปˆเบงเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบช:

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 เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเป€เบžเบฒเบฐเบงเปˆเบฒเบ–เป‰เบฒ เป€เบฅเบเบ—เบฐเบšเบฝเบ™ > 13, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™.

เบกเบตเบเบฒเบ™เป€เบ•เบทเบญเบ™เป„เบžเบญเบทเปˆเบ™เป†เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเบ—เบตเปˆเบกเบต IDs 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

Fragment N30: โ€‹โ€‹เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ‡เป„เบช

static bool
isImplicitlyDef(MachineRegisterInfo &MRI, unsigned Reg) {
  for (MachineRegisterInfo::def_instr_iterator It = MRI.def_instr_begin(Reg),
      E = MRI.def_instr_end(); It != E; ++It) {
    return (*It).isImplicitDef();
  }
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V612 [CWE-670] 'เบเบฑเบšเบ„เบทเบ™' เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบžเบฒเบเปƒเบ™เบงเบปเบ‡เบฎเบญเบš. R600OptimizeVectorRegisters.cpp 63

เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบซเบผเบทเป€เบ•เบฑเบเบ™เบดเบเบชเบฐเป€เบžเบฒเบฐเบ—เบตเปˆเบกเบตเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบžเบทเปˆเบญเบญเบฐเบ—เบดเบšเบฒเบเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบซเป‰เบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบญเปˆเบฒเบ™เบฅเบฐเบซเบฑเบ”. เบเบฒเบ™เบญเบญเบเปเบšเบšเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบซเบเบฑเบ‡เปƒเบซเป‰เบ‚เป‰เบญเบเบฎเบนเป‰ เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเปœเป‰เบฒเบชเบปเบ‡เป„เบชเบซเบผเบฒเบ. เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบšเปเปˆเบ‚เบฝเบ™เปเบšเบšเบ™เบฑเป‰เบ™ :).

เป€เบกเบทเปˆเบญเบ? เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบŠเบฒเบซเบผเบทเบเบฒเป€เบŸ.

เบŠเบญเบเบซเบฒเปเบกเบ‡เป„เบกเป‰เปƒเบ™ LLVM 8 เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบตเปˆเบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเปƒเบซเบกเปˆ

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰ 30 เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเปเบšเบšเป€เบเบปเปˆเบฒเปเบกเปˆเบ™เบžเบฝเบ‡เบžเป. เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเปƒเบซเบกเปˆเบ—เบตเปˆเบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ เบเบงเบ”เบเบฒ. เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เป€เบงเบฅเบฒเบ™เบตเป‰, เบ—เบฑเบ‡เปเบปเบ” 66 เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเปเบšเบšเบ—เบปเปˆเบงเป„เบ›เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ C++.

Fragment N31: เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰

Error CtorDtorRunner::run() {
  ....
  if (auto CtorDtorMap =
          ES.lookup(JITDylibSearchList({{&JD, true}}), std::move(Names),
                    NoDependenciesToRegister, true))
  {
    ....
    return Error::success();
  } else
    return CtorDtorMap.takeError();

  CtorDtorsByPriority.clear();

  return Error::success();
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V779 [CWE-561] เบเบงเบ”เบžเบปเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™. ExecutionUtils.cpp 146

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เบ—เบฑเบ‡เบชเบญเบ‡เบชเบฒเบ‚เบฒเบ‚เบญเบ‡เบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™ if เบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบเบเบฒเบ™เป‚เบ—เบซเบฒเบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™ เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบกเบฒ. เบ•เบฒเบกเบ™เบฑเป‰เบ™เปเบฅเป‰เบง, เบ•เบนเป‰เบšเบฑเบ™เบˆเบธ CtorDtorsByPriority เบˆเบฐเบšเปเปˆเบ–เบทเบเบฅเบถเบšเบฅเป‰เบฒเบ‡.

Fragment N32: เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰

bool LLParser::ParseSummaryEntry() {
  ....
  switch (Lex.getKind()) {
  case lltok::kw_gv:
    return ParseGVEntry(SummaryID);
  case lltok::kw_module:
    return ParseModuleEntry(SummaryID);
  case lltok::kw_typeid:
    return ParseTypeIdEntry(SummaryID);                        // <=
    break;                                                     // <=
  default:
    return Error(Lex.getLoc(), "unexpected summary kind");
  }
  Lex.setIgnoreColonInIdentifiers(false);                      // <=
  return false;
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V779 [CWE-561] เบเบงเบ”เบžเบปเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰. เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™. LLParser.cpp 835

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ. เบกเบฒเป€เบšเบดเปˆเบ‡เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ™เบตเป‰เบเปˆเบญเบ™:

return ParseTypeIdEntry(SummaryID);
break;

เบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰. เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบœเบนเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™ เบžเบฑเบเบœเปˆเบญเบ™ เบกเบตเบญเบฑเบ™เบžเบดเป€เบชเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เปเบฅเบฐเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบฅเบถเบšเบกเบฑเบ™เป„เบ”เป‰. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบšเปเปˆเปเบกเปˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‡เปˆเบฒเบเบ”เบฒเบเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™.

เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบญเบญเบเบ„เปเบฒเป€เบ•เบทเบญเบ™เบเปˆเบฝเบงเบเบฑเบšเบชเบฒเบ:

Lex.setIgnoreColonInIdentifiers(false);
return false;

เปเบฅเบฐเปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบซเบฒเป„เบ”เป‰. เบ—เบธเบเป†เบเปเบฅเบฐเบ™เบตเปƒเบ™ เบชเบฐเบซเบผเบฑเบš เบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบเบเบฒเบ™เป‚เบ—เบˆเบฒเบเบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™ เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบกเบฒ. เปเบฅเบฐเบ”เบฝเบงเบ™เบตเป‰เบฎเบนเป‰เบชเบถเบเป‚เบ”เบ”เบ”เปˆเบฝเบง เบžเบฑเบเบœเปˆเบญเบ™ เป€เบšเบดเปˆเบ‡โ€‹เบ„เบทโ€‹เบงเปˆเบฒโ€‹เบšเปเปˆโ€‹เป€เบ›เบฑเบ™โ€‹เบญเบฑเบ™โ€‹เบ•เบฐโ€‹เบฅเบฒเบโ€‹! เบšเบฒเบ‡เบ—เบตเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบชเบฒเบ‚เบฒเบ„เบงเบ™เบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบ”เป‰เบงเบ เบžเบฑเบเบœเปˆเบญเบ™, เบšเปเปˆเปเบกเปˆเบ™ เบเบฒเบ™เบเบฑเบšเบ„เบทเบ™เบกเบฒ?

Fragment N33: เบฃเบตเป€เบŠเบฑเบ”เปเบšเบšเบชเบธเปˆเบกเบ‚เบญเบ‡เบšเบดเบ”เบชเบนเบ‡

unsigned getStubAlignment() override {
  if (Arch == Triple::systemz)
    return 8;
  else
    return 1;
}

Expected<unsigned>
RuntimeDyldImpl::emitSection(const ObjectFile &Obj,
                             const SectionRef &Section,
                             bool IsCode) {
  ....
  uint64_t DataSize = Section.getSize();
  ....
  if (StubBufSize > 0)
    DataSize &= ~(getStubAlignment() - 1);
  ....
}

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V784 เบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡ bit mask เปเบกเปˆเบ™เบซเบ™เป‰เบญเบเบเปˆเบงเบฒเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡ operand เบ—เปเบฒเบญเบดเบ”. เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบชเบนเบ™เป€เบชเบ bits เบ—เบตเปˆเบชเบนเบ‡เบ‚เบถเป‰เบ™. RuntimeDyld.cpp 815

เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆ getStubAlignment เบ›เบฐเป€เบžเบ”เบœเบปเบ™เบ•เบญเบšเปเบ—เบ™ เบฅเบปเบ‡เบ™เบฒเบก. เปƒเบซเป‰เบ„เบดเบ”เป„เบฅเปˆเบ„เปˆเบฒเบ‚เบญเบ‡ expression เป‚เบ”เบเบชเบปเบกเบกเบธเบ”เบงเปˆเบฒ function เปƒเบซเป‰เบ„เปˆเบฒ 8:

~(getStubAlignment() - 1)

~(8u-1)

0xFFFFFFFF8u

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเบ•เบปเบงเปเบ› เบ‚เบฐเปœเบฒเบ”เบ‚เปเป‰เบกเบนเบ™ เบกเบตเบ›เบฐเป€เบžเบ” 64-bit unsigned. เบกเบฑเบ™เบ›เบฐเบเบปเบ”เบงเปˆเบฒเป€เบกเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ DataSize & 0xFFFFFFFF8u, เบ—เบฑเบ‡เบชเบฒเบกเบชเบดเบšเบชเบญเบ‡เบšเบดเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบนเบ‡เบˆเบฐเบ–เบทเบเบ•เบฑเป‰เบ‡เปƒเบซเบกเปˆเป€เบ›เบฑเบ™เบชเบนเบ™. เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐ, เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ™เบฑเบเบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ•เป‰เบญเบ‡เบเบฒเบ™. เบ‚เป‰เบญเบเบชเบปเบ‡เปƒเบชเบงเปˆเบฒเบฅเบฒเบงเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ: DataSize & 0xFFFFFFFFFFFFFF8u.

เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, เบ—เปˆเบฒเบ™เบ„เบงเบ™เบ‚เบฝเบ™เบ™เบตเป‰:

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

เบซเบผเบทเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™:

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

Fragment N34: เบเบฒเบ™เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เบ›เบฐเป€เบžเบ”เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบšเปเปˆเบชเบณเป€เบฅเบฑเบ”

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V1028 [CWE-190] เป€เบเบตเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเบฒเบ™เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ‚เบญเบ‡ 'NumElts * Scale' เป„เบ›เบซเบฒเบ›เบฐเป€เบžเบ” 'size_t', เบšเปเปˆเปเบกเปˆเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš. X86ISelLowering.h 1577

เบเบฒเบ™เป‚เบเบ™เบ›เบฐเป€เบžเบ”เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™ overflow เป€เบกเบทเปˆเบญเบ„เบนเบ™เบ•เบปเบงเปเบ›เบ›เบฐเป€เบžเบ” int. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบเบฒเบ™เป‚เบเบ™เบ›เบฐเป€เบžเบ”เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เบฅเบปเป‰เบ™. เบ—เปเบฒเบญเบดเบ”, เบ•เบปเบงเปเบ›เบˆเบฐเบ–เบทเบเบ„เบนเบ™, เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš 32-bit เบ‚เบญเบ‡เบเบฒเบ™เบ„เบนเบ™เบˆเบฐเบ–เบทเบเบ‚เบฐเบซเบเบฒเบเป„เบ›เบชเบนเปˆเบ›เบฐเป€เบžเบ”. เบ‚เบฐ เปœเบฒเบ”.

Fragment N35: เบฅเบปเป‰เบกเป€เบซเบฅเบงเปƒเบ™เบเบฒเบ™เบชเบณเป€เบ™เบปเบฒ-เบงเบฒเบ‡

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

V778 [CWE-682] เบชเบญเบ‡เบŠเบดเป‰เบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบžเบปเบšเป€เบซเบฑเบ™. เบšเบฒเบ‡เบ—เบต, เบ™เบตเป‰เปเบกเปˆเบ™ typo เปเบฅเบฐเบ•เบปเบงเปเบ› 'Op1' เบ„เบงเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบ—เบ™ 'Op0'. InstCombineCompares.cpp 5507

เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปƒเบซเบกเปˆเบ™เบตเป‰เบเปเบฒเบ™เบปเบ”เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เป„เบ”เป‰เบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเปเบฅเบฐเบšเบฒเบ‡เบŠเบทเปˆเปƒเบ™เบกเบฑเบ™เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบซเบ™เบถเปˆเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเป„เบ”เป‰เปเบเป‰เป„เบ‚เบกเบฑเบ™.

เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเปƒเบ™เบšเบฅเบฑเบญเบเบ—เบตเบชเบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบ›เปˆเบฝเบ™เปเบ›เบ‡ Op0 เบชเบธเบ” Op1. เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบซเบ™เบถเปˆเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบšเปเปˆเป„เบ”เป‰เปเบเป‰เป„เบ‚เบกเบฑเบ™. เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐเบ‚เบฝเบ™เปเบšเบšเบ™เบตเป‰:

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

Fragment N36: เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™

struct Status {
  unsigned Mask;
  unsigned Mode;

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

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V1001 [CWE-563] เบ•เบปเบงเปเบ› 'เป‚เบซเบกเบ”' เบ–เบทเบเบกเบญเบšเปเบฒเบเปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เป‚เบ”เบเบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™. SIModeRegister.cpp 48

เบกเบฑเบ™เป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบ‚เปเป‰เป‚เบ•เป‰เปเบเป‰เบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบŠเบทเปˆเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเบฐเบกเบฒเบŠเบดเบเปƒเบ™เบŠเบฑเป‰เบ™เบฎเบฝเบ™. เบกเบฑเบ™เบ‡เปˆเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบชเบฑเบšเบชเบปเบ™. เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบเปˆเบญเบ™เบžเบงเบเป€เบฎเบปเบฒ. เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ™เบตเป‰เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบ:

Mode &= Mask;

เบญเบฒเบเบดเบงเป€เบกเบฑเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เบซเบกเบปเบ”โ€‹เป€เบ—เบปเปˆเบฒโ€‹เบ™เบตเป‰. เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบญเบตเบเบ•เปเปˆเป„เบ›. เบชเปˆเบงเบ™เบซเบผเบฒเบเปเบฅเป‰เบง เป€เบˆเบปเป‰เบฒเบ„เบงเบ™เบ‚เบฝเบ™เปเบšเบšเบ™เบตเป‰:

Status(unsigned Mask, unsigned Mode) : Mask(Mask), Mode(Mode) {
  this->Mode &= Mask;
};

Fragment N37: เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™

class SectionBase {
  ....
  uint64_t Size = 0;
  ....
};

class SymbolTableSection : public SectionBase {
  ....
};

void SymbolTableSection::addSymbol(Twine Name, uint8_t Bind, uint8_t Type,
                                   SectionBase *DefinedIn, uint64_t Value,
                                   uint8_t Visibility, uint16_t Shndx,
                                   uint64_t Size) {
  ....
  Sym.Value = Value;
  Sym.Visibility = Visibility;
  Sym.Size = Size;
  Sym.Index = Symbols.size();
  Symbols.emplace_back(llvm::make_unique<Symbol>(Sym));
  Size += this->EntrySize;
}

เบ„เปเบฒเป€เบ•เบทเบญเบ™ PVS-Studio: V1001 [CWE-563] เบ•เบปเบงเปเบ› 'เบ‚เบฐเบซเบ™เบฒเบ”' เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปเบ•เปˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™. Object.cpp 424

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ. เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบ‚เบฝเบ™เบงเปˆเบฒ:

this->Size += this->EntrySize;

Fragment N38-N47: เบžเบงเบเป€เบ‚เบปเบฒเบฅเบทเบกเบเบงเบ”เป€เบšเบดเปˆเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบต

เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบช 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)

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบ•เบปเบงเบŠเบตเป‰เบ™เบตเป‰เปเบกเปˆเบ™ dereferenceed เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบเบงเบ”เบชเบญเบšเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™:

auto PtrSizeBits = DL.getPointerTypeSizeInBits(Ptr->getType());

เปƒเบซเป‰เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบญเบทเปˆเบ™.

llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
                                                          bool Stub) {
  ....
  auto *FD = dyn_cast<FunctionDecl>(GD.getDecl());
  SmallVector<QualType, 16> ArgTypes;
  if (FD)                                                                // <=
    for (const ParmVarDecl *Parm : FD->parameters())
      ArgTypes.push_back(Parm->getType());
  CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv(); // <=
  ....
}

เบ„เปเบฒเป€เบ•เบทเบญเบ™ PVS-Studio: V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'FD' เบ–เบทเบเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 3228, 3231. CGDebugInfo.cpp 3231

เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบซเบกเบฒเบ FD. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เป€เบซเบฑเบ™เป„เบ”เป‰เบŠเบฑเบ”เป€เบˆเบ™เปเบฅเบฐเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบžเบดเป€เบชเบ”.

เปเบฅเบฐเป€เบžเบตเปˆเบกเป€เบ•เบตเบก:

static void computePolynomialFromPointer(Value &Ptr, Polynomial &Result,
                                         Value *&BasePtr,
                                         const DataLayout &DL) {
  PointerType *PtrTy = dyn_cast<PointerType>(Ptr.getType());
  if (!PtrTy) {                                                   // <=
    Result = Polynomial();
    BasePtr = nullptr;
  }
  unsigned PointerBits =
      DL.getIndexSizeInBits(PtrTy->getPointerAddressSpace());     // <=
  ....
}

เบ„เปเบฒเป€เบ•เบทเบญเบ™ PVS-Studio: V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'PtrTy' เบ–เบทเบเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเป€เบชเบฑเป‰เบ™: 960, 965. InterleavedLoadCombinePass.cpp 965

เบงเบดเบ—เบตเบ›เป‰เบญเบ‡เบเบฑเบ™เบ•เบปเบงเป€เบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง? เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบซเบผเบฒเบเบ‚เบถเป‰เบ™เบเปˆเบฝเบงเบเบฑเบš Code-Review เปเบฅเบฐเปƒเบŠเป‰เบ•เบปเบงเบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบดเบ” PVS-Studio เป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ›เบปเบเบเบฐเบ•เบด.

เบšเปเปˆเบกเบตเบˆเบธเบ”เปƒเบ”เปƒเบ™เบเบฒเบ™เบญเป‰เบฒเบ‡เป€เบ–เบดเบ‡เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบฅเบฐเบซเบฑเบ”เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ™เบตเป‰. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบ›เบฐโ€‹เป„เบงเป‰โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ„เปเบฒโ€‹เป€เบ•เบทเบญเบ™โ€‹เปƒเบ™โ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹:

  • V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'Expr' เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเป€เบชเบฑเป‰เบ™: 1049, 1078. DebugInfoMetadata.cpp 1078
  • V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'PI' เบ–เบทเบเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 733, 753. LegacyPassManager.cpp 753
  • V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'StatepointCall' เบ–เบทเบเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 4371, 4379. Verifier.cpp 4379
  • V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'RV' เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 2263, 2268. TGParser.cpp 2268
  • V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'CalleeFn' เบ–เบทเบเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 1081, 1096. SimplifyLibCalls.cpp 1096
  • V1004 [CWE-476] เบ•เบปเบงเบŠเบตเป‰ 'TC' เบ–เบทเบเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบšเปเปˆเบ›เบญเบ”เป„เบžเบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบ–เบทเบเบเบงเบ”เบชเบญเบšเบเบฑเบš nullptr. เบเบงเบ”เบชเบญเบšเบชเบฒเบ: 1819, 1824. Driver.cpp 1824

เบŠเบดเป‰เบ™ N48-N60: เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™, เปเบ•เปˆเบกเบตเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡ (เบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ—เบตเปˆเบญเบฒเบ”เบˆเบฐเบฎเบปเปˆเบงเป„เบซเบผ)

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

เบ„เบณเป€เบ•เบทเบญเบ™ PVS-Studio: V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบเบธเบ”เบ—เบฐเบชเบฒเบ”' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-isel-fuzzer.cpp 58

เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบชเปˆเบ—เป‰เบฒเบเบ‚เบญเบ‡เบšเบฑเบ™เบˆเบธเป€เบŠเบฑเปˆเบ™ std:: vector > เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบžเบฝเบ‡เปเบ•เปˆเบ‚เบฝเบ™ xxx.push_back(X เปƒเปเปˆ), เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปƒเบˆเป€เบซเบฅเบทเป‰เบญเบกเปƒเบช implicit เบˆเบฒเบ X* ะฒ std::unique_ptr.

เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบปเปˆเบงเป„เบ›เปเบกเปˆเบ™เบเบฒเบ™เบ‚เบฝเบ™ xxx.emplace_back(X เปƒเปเปˆ)เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบกเบฑเบ™เบฅเบงเบšเบฅเบงเบก: เบงเบดเบ—เบตเบเบฒเบ™ emplace_back เบเปเปˆเบชเป‰เบฒเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเป‚เบ”เบเบเบปเบ‡เบˆเบฒเบเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบชเป‰เบฒเบ‡เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™.

เบกเบฑเบ™เบšเปเปˆเบ›เบญเบ”เป„เบž. เบ–เป‰เบฒ vector เปเบกเปˆเบ™เป€เบ•เบฑเบก, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบชเบฑเบ™เบ„เบทเบ™เปƒเบซเบกเปˆ. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบญเบฒเบ”เบˆเบฐเบฅเบปเป‰เบกเป€เบซเบฅเบง, เบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ–เบทเบเบ–เบดเป‰เบก std::bad_alloc. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ•เบปเบงเบŠเบตเป‰เบˆเบฐเบชเบนเบ™เป€เบชเบเป„เบ›เปเบฅเบฐเบงเบฑเบ”เบ–เบธเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบˆเบฐเบšเปเปˆเบ–เบทเบเบฅเบถเบš.

เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ›เบญเบ”เป„เบžเปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ unique_ptrเป€เบŠเบดเปˆเบ‡เบˆเบฐเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ•เบปเบงเบŠเบตเป‰เบเปˆเบญเบ™เบ—เบตเปˆ vector เบžเบฐเบเบฒเบเบฒเบกเบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ:

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

เบ•เบฑเป‰เบ‡เปเบ•เปˆ C++14, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ 'std::make_unique':

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

เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ™เบตเป‰เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบš LLVM. เบ–เป‰เบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเป„เบ”เป‰, compiler เบˆเบฐเบขเบธเบ”เบžเบฝเบ‡เปเบ•เปˆ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบฒเบง เป€เบงเบฅเบฒเบซเบงเปˆเบฒเบ‡, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบชเบฒเบกเบฒเบ”เบžเบฝเบ‡เปเบ•เปˆเบขเบธเบ”เป€เบŠเบปเบฒเบ–เป‰เบฒเบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบฅเบปเป‰เบกเป€เบซเบฅเบง, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เปเบกเบ‡เป„เบกเป‰เบ—เบตเปˆเบซเบ™เป‰เบฒเป€เบชเบปเป‰เบฒเปƒเบˆเปเบ—เป‰เป†.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เป„เบžเบ‚เบปเปˆเบกเบ‚เบนเปˆเบ•เปเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เปเปˆ LLVM, เบ‚เป‰เบญเบเบžเบปเบšเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบฎเบนเบšเปเบšเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ™เบตเป‰เปเบฅเบฐเบœเบนเป‰เบงเบดเป€เบ„เบฒเบฐ PVS-Studio เป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบกเบฑเบ™.

เบเบฒเบ™เป€เบ•เบทเบญเบ™เป„เบžเบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบ›เบฐเป€เบžเบ”เบ™เบตเป‰:

  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'Passes' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. PassManager.h 546
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'AAs' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. AliasAnalysis.h 324
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'Entry' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. DWARFDebugFrame.cpp 519
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'AllEdges' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. CFGMST.h 268
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'VMaps' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. SimpleLoopUnswitch.cpp 2012
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'Records' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. FDRlogBuilder.h 30
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบเปˆเบญเบ‡เบšเบฑเบ™เบˆเบธ 'PendingSubmodules' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. ModuleMap.cpp 810
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'Objects' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. DebugMap.cpp 88
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบเบธเบ”เบ—เบฐเบชเบฒเบ”' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-isel-fuzzer.cpp 60
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 685
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 686
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 688
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 689
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 690
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 691
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 692
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 693
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'เบ•เบปเบงเปเบเป‰เป„เบ‚' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. llvm-stress.cpp 694
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบเปˆเบญเบ‡เบšเบฑเบ™เบˆเบธ 'Operands' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. GlobalISelEmitter.cpp 1911
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'Stash' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. GlobalISelEmitter.cpp 2100
  • V1023 [CWE-460] เบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบšเปเปˆเบกเบตเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบ–เบฑเบ‡ 'Matchers' เป‚เบ”เบเบงเบดเบ—เบต 'emplace_back'. เบเบฒเบ™เบฎเบปเปˆเบงเป„เบซเบผเบ‚เบญเบ‡เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบเบปเบเป€เบงเบฑเป‰เบ™. GlobalISelEmitter.cpp 2702

เบชเบฐเบซเบฅเบธเบš

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบญเบญเบเบ„เปเบฒเป€เบ•เบทเบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ” 60 เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบขเบธเบ”เป€เบŠเบปเบฒ. เบกเบตเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบญเบทเปˆเบ™เบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio เบเบงเบ”เบžเบปเบšเปƒเบ™ LLVM เบšเป? เปเบกเปˆเบ™เปเบฅเป‰เบง, เบ‚เป‰เบญเบเบกเบต. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™เบญเบญเบเบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบก, เบกเบฑเบ™เปเบกเปˆเบ™เบ•เบญเบ™เปเบฅเบ‡, เบซเบผเบทเปเบกเป‰เบเบฐเบ—เบฑเป‰เบ‡เบเบฒเบ‡เบ„เบทเบ™, เปเบฅเบฐเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเป‚เบ—เบซเบฒเบกเบฑเบ™เบ•เปเปˆเบกเบทเป‰.

เบ‚เป‰เบญเบเบซเบงเบฑเบ‡เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบžเบปเบšเบงเปˆเบฒเบกเบฑเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบฅเบฐเบขเบฒเบเบฅเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio.

เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ”เบฒเบงโ€‹เบ™โ€‹เปŒโ€‹เป‚เบซเบฅเบ”โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹เปเบฅเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบ—เบตเปˆโ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™ minesweeper เป„เบ”เป‰โ€‹เบ—เบตเปˆโ€‹ เบซเบ™เป‰เบฒเบ™เบตเป‰.

เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”, เปƒเบŠเป‰เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบดเบ”เป€เบ›เบฑเบ™เบ›เบปเบเบเบฐเบ•เบด. เบเบงเบ”เบ„เบฑเป‰เบ‡เบ”เบฝเบง, เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเบžเบงเบเป€เบฎเบปเบฒเป€เบžเบทเปˆเบญเบ™เบดเบเบปเบกเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ static เปเบฅเบฐ PVS-Studio เบšเปเปˆเปเบกเปˆเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ›เบปเบเบเบฐเบ•เบด.

เป‚เบŠเบเบ”เบตเปƒเบ™เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ„เบธเบ™เบ™เบฐเบžเบฒเบšเปเบฅเบฐเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™!

เบŠเบญเบเบซเบฒเปเบกเบ‡เป„เบกเป‰เปƒเบ™ LLVM 8 เป‚เบ”เบเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐ PVS-Studio

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เปเบšเปˆเบ‡เบ›เบฑเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบเบฑเบšเบœเบนเป‰เบŠเบปเบกเบ—เบตเปˆเป€เบงเบปเป‰เบฒเบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”, เบเบฐเบฅเบธเบ™เบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฒเบ™เปเบ›เบžเบฒเบชเบฒ: Andrey Karpov. เบŠเบญเบเบซเบฒเบšเบฑเบเปƒเบ™ LLVM 8 เบ”เป‰เบงเบ PVS-Studio.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™