From: Vedant Kumar Date: Fri, 8 Dec 2017 19:51:42 +0000 (+0000) Subject: [ubsan] array-bounds: Ignore params with constant size X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=700e3d5d775fa10461d32f1df583d82ef19f580c;p=clang [ubsan] array-bounds: Ignore params with constant size This is a follow-up to r320128. Eli pointed out that there is some gray area in the language standard about whether the constant size is exact, or a lower bound. https://reviews.llvm.org/D40940 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@320185 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 64af2096c9..c61bc0d642 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -829,14 +829,6 @@ llvm::Value *CodeGenFunction::LoadPassedObjectSize(const Expr *E, if (!ParamDecl) return nullptr; - // Arrays don't have pass_object_size attributes, but if they have a constant - // size modifier it's the array size (C99 6.5.7.2p1). - if (auto *DecayedArrayTy = dyn_cast(ParamDecl->getType())) - if (auto *ArrayTy = - dyn_cast(DecayedArrayTy->getOriginalType())) - return llvm::ConstantInt::get(SizeTy, - ArrayTy->getSize().getLimitedValue()); - auto *POSAttr = ParamDecl->getAttr(); if (!POSAttr) return nullptr; diff --git a/test/CodeGen/ubsan-pass-object-size.c b/test/CodeGen/ubsan-pass-object-size.c index 67970d2918..d5d4f5a9e4 100644 --- a/test/CodeGen/ubsan-pass-object-size.c +++ b/test/CodeGen/ubsan-pass-object-size.c @@ -55,8 +55,7 @@ int pat(int *const p __attribute__((pass_object_size(3))), int n) { // CHECK-LABEL: define i32 @cat( int cat(int p[static 10], int n) { - // CHECK: icmp ult i64 {{.*}}, 10, !nosanitize - // CHECK: __ubsan_handle_out_of_bounds + // CHECK-NOT: __ubsan_handle_out_of_bounds // CHECK: ret i32 return p[n]; }