From: Roman Lebedev Date: Thu, 23 Jan 2020 19:48:57 +0000 (+0300) Subject: [Sema] Sanity-check alignment requested via `__attribute__((assume_aligned(imm)))` X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=a4cfb15d15a8a353fe316f2a9fe1c8c6a6740ef1;p=android-x86%2Fexternal-llvm-project.git [Sema] Sanity-check alignment requested via `__attribute__((assume_aligned(imm)))` Summary: For `__builtin_assume_aligned()`, we do validate that the alignment is not greater than `536870912` (D68824), but we don't do that for `__attribute__((assume_aligned(N)))` attribute. I suspect we should. Reviewers: erichkeane, aaron.ballman, hfinkel, rsmith, jdoerfert Reviewed By: erichkeane Subscribers: cfe-commits, llvm-commits Tags: #llvm, #clang Differential Revision: https://reviews.llvm.org/D72994 --- diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 040a2695643..de0eda449be 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1625,6 +1625,12 @@ void Sema::AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, << E->getSourceRange(); return; } + + // Alignment calculations can wrap around if it's greater than 2**29. + unsigned MaximumAlignment = 536870912; + if (I > MaximumAlignment) + Diag(CI.getLoc(), diag::warn_assume_aligned_too_great) + << CI.getRange() << MaximumAlignment; } if (OE) { diff --git a/clang/test/Sema/builtin-assume-aligned.c b/clang/test/Sema/builtin-assume-aligned.c index 565dc660944..b862f865c2c 100644 --- a/clang/test/Sema/builtin-assume-aligned.c +++ b/clang/test/Sema/builtin-assume-aligned.c @@ -46,6 +46,7 @@ int test8(int *a, int j) { void test_void_assume_aligned(void) __attribute__((assume_aligned(32))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}} int test_int_assume_aligned(void) __attribute__((assume_aligned(16))); // expected-warning {{'assume_aligned' attribute only applies to return values that are pointers}} void *test_ptr_assume_aligned(void) __attribute__((assume_aligned(64))); // no-warning +void *test_ptr_assume_aligned(void) __attribute__((assume_aligned(1073741824))); // expected-warning {{requested alignment must be 536870912 bytes or smaller; maximum alignment assumed}} int j __attribute__((assume_aligned(8))); // expected-warning {{'assume_aligned' attribute only applies to Objective-C methods and functions}} void *test_no_fn_proto() __attribute__((assume_aligned(32))); // no-warning