diff options
| author | Vedant Kumar <vsk@apple.com> | 2017-01-27 23:02:44 +0000 |
|---|---|---|
| committer | Vedant Kumar <vsk@apple.com> | 2017-01-27 23:02:44 +0000 |
| commit | 3db9974b2d4a0d5092eccbf2e1384d66ab1e6a46 (patch) | |
| tree | 68d7aa58933a8bb67d90d680ace2b2099e2fea0d /clang/lib/CodeGen | |
| parent | 5ad775f2e8997391a65b4f3992689369bd78a9e6 (diff) | |
| download | bcm5719-llvm-3db9974b2d4a0d5092eccbf2e1384d66ab1e6a46.tar.gz bcm5719-llvm-3db9974b2d4a0d5092eccbf2e1384d66ab1e6a46.zip | |
[ubsan] Sanity-check shift amounts before truncation (fixes PR27271)
Ubsan does not report UB shifts in some cases where the shift exponent
needs to be truncated to match the type of the shift base. We perform a
range check on the truncated shift amount, leading to false negatives.
Fix the issue (PR27271) by performing the range check on the original
shift amount.
Differential Revision: https://reviews.llvm.org/D29234
llvm-svn: 293343
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 1b85c45cd4b..40d949deceb 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -2751,8 +2751,8 @@ Value *ScalarExprEmitter::EmitShl(const BinOpInfo &Ops) { isa<llvm::IntegerType>(Ops.LHS->getType())) { CodeGenFunction::SanitizerScope SanScope(&CGF); SmallVector<std::pair<Value *, SanitizerMask>, 2> Checks; - llvm::Value *WidthMinusOne = GetWidthMinusOneValue(Ops.LHS, RHS); - llvm::Value *ValidExponent = Builder.CreateICmpULE(RHS, WidthMinusOne); + llvm::Value *WidthMinusOne = GetWidthMinusOneValue(Ops.LHS, Ops.RHS); + llvm::Value *ValidExponent = Builder.CreateICmpULE(Ops.RHS, WidthMinusOne); if (SanitizeExponent) { Checks.push_back( |

