Author: Stephan Bergmann Date: 2022-07-05T08:12:53+02:00 New Revision: 4996e3f68315f9ee7f43f2de9d368ab9979080db
URL: https://github.com/llvm/llvm-project/commit/4996e3f68315f9ee7f43f2de9d368ab9979080db DIFF: https://github.com/llvm/llvm-project/commit/4996e3f68315f9ee7f43f2de9d368ab9979080db.diff LOG: [test] Check for more -fsanitize=array-bounds behavior ...that had temporarily regressed with (since reverted) <https://github.com/llvm/llvm-project/commit/886715af962de2c92fac4bd37104450345711e4a> "[clang] Introduce -fstrict-flex-arrays=<n> for stricter handling of flexible arrays", and had then been seen to cause issues in the wild: For one, the HarfBuzz project has various "fake" flexible array members of the form > Type arrayZ[HB_VAR_ARRAY]; in <https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-open-type.hh>, where HB_VAR_ARRAY is a macro defined as > #ifndef HB_VAR_ARRAY > #define HB_VAR_ARRAY 1 > #endif in <https://github.com/harfbuzz/harfbuzz/blob/main/src/hb-machinery.hh>. For another, the Firebird project in <https://github.com/FirebirdSQL/firebird/blob/master/src/lock/lock_proto.h> uses a trailing member > srq lhb_hash[1]; // Hash table as a "fake" flexible array, but declared in a > struct lhb : public Firebird::MemoryHeader that is not a standard-layout class (because the Firebird::MemoryHeader base class also declares non-static data members). (The second case is specific to C++. Extend the test setup so that all the other tests are now run for both C and C++, just in case the behavior could ever start to diverge for those two languages.) A third case where -fsanitize=array-bounds differs from -Warray-bounds (and which is also specific to C++, but which doesn't appear to have been encountered in the wild) is when the "fake" flexible array member's size results from template argument substitution. Differential Revision: https://reviews.llvm.org/D128783 Added: Modified: clang/test/CodeGen/bounds-checking-fam.c Removed: ################################################################################ diff --git a/clang/test/CodeGen/bounds-checking-fam.c b/clang/test/CodeGen/bounds-checking-fam.c index 8da580fe06464..9d7994cee0948 100644 --- a/clang/test/CodeGen/bounds-checking-fam.c +++ b/clang/test/CodeGen/bounds-checking-fam.c @@ -1,5 +1,6 @@ // REQUIRES: x86-registered-target // RUN: %clang_cc1 -emit-llvm -triple x86_64 -fsanitize=array-bounds %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-STRICT-0 +// RUN: %clang_cc1 -emit-llvm -triple x86_64 -fsanitize=array-bounds -x c++ %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-STRICT-0,CXX,CXX-STRICT-0 /// Before flexible array member was added to C99, many projects use a /// one-element array as the last emember of a structure as an alternative. @@ -15,20 +16,58 @@ struct Three { int a[3]; }; -// CHECK-LABEL: define {{.*}} @test_one( +// CHECK-LABEL: define {{.*}} @{{.*}}test_one{{.*}}( int test_one(struct One *p, int i) { // CHECK-STRICT-0-NOT: @__ubsan return p->a[i] + (p->a)[i]; } -// CHECK-LABEL: define {{.*}} @test_two( +// CHECK-LABEL: define {{.*}} @{{.*}}test_two{{.*}}( int test_two(struct Two *p, int i) { // CHECK-STRICT-0: call void @__ubsan_handle_out_of_bounds_abort( return p->a[i] + (p->a)[i]; } -// CHECK-LABEL: define {{.*}} @test_three( +// CHECK-LABEL: define {{.*}} @{{.*}}test_three{{.*}}( int test_three(struct Three *p, int i) { // CHECK-STRICT-0: call void @__ubsan_handle_out_of_bounds_abort( return p->a[i] + (p->a)[i]; } + +#define FLEXIBLE 1 +struct Macro { + int a[FLEXIBLE]; +}; + +// CHECK-LABEL: define {{.*}} @{{.*}}test_macro{{.*}}( +int test_macro(struct Macro *p, int i) { + // CHECK-STRICT-0-NOT: @__ubsan + return p->a[i] + (p->a)[i]; +} + +#if defined __cplusplus + +struct Base { + int b; +}; +struct NoStandardLayout : Base { + int a[1]; +}; + +// CXX-LABEL: define {{.*}} @{{.*}}test_nostandardlayout{{.*}}( +int test_nostandardlayout(NoStandardLayout *p, int i) { + // CXX-STRICT-0-NOT: @__ubsan + return p->a[i] + (p->a)[i]; +} + +template<int N> struct Template { + int a[N]; +}; + +// CXX-LABEL: define {{.*}} @{{.*}}test_template{{.*}}( +int test_template(Template<1> *p, int i) { + // CXX-STRICT-0-NOT: @__ubsan + return p->a[i] + (p->a)[i]; +} + +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits