[PATCH] D123763: [randstruct] Enforce using a designated init for a randomized struct
Bill Wendling via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 14 12:26:37 PDT 2022
void updated this revision to Diff 422936.
void marked an inline comment as done.
void added a comment.
Add some smoke tests.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D123763/new/
https://reviews.llvm.org/D123763
Files:
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaInit.cpp
clang/test/Sema/init-randomized-struct.c
Index: clang/test/Sema/init-randomized-struct.c
===================================================================
--- /dev/null
+++ clang/test/Sema/init-randomized-struct.c
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 %s -verify -fsyntax-only -frandomize-layout-seed=1234567890abcdef
+
+typedef void (*func_ptr)();
+
+void foo(void);
+void bar(void);
+void baz(void);
+void gaz(void);
+
+struct test {
+ func_ptr a;
+ func_ptr b;
+ func_ptr c;
+ func_ptr d;
+ func_ptr e;
+ func_ptr f;
+ func_ptr g;
+} __attribute__((randomize_layout));
+
+struct test t1 = {}; // This should be fine per WG14 N2900 (in C23) + our extension handling of it in earlier modes
+struct test t2 = {0}; // This should also be fine per C99 6.7.8p19
+struct test t3 = { .f = baz, .b = bar, .g = gaz, .a = foo }; // Okay
+struct test t4 = { .a = foo, bar, baz }; // expected-error {{a randomized struct can only be initialized with a designated initializer}}
+
+struct other_test {
+ func_ptr a;
+ func_ptr b[3];
+ func_ptr c;
+} __attribute__((randomize_layout));
+
+struct other_test t5 = { .a = foo, .b[0] = foo }; // Okay
+struct other_test t6 = { .a = foo, .b[0] = foo, bar, baz }; // Okay
+struct other_test t7 = { .a = foo, .b = { foo, bar, baz } }; // Okay
+struct other_test t8 = { baz, bar, gaz, foo }; // expected-error {{a randomized struct can only be initialized with a designated initializer}}
+struct other_test t9 = { .a = foo, .b[0] = foo, bar, baz, gaz }; // expected-error {{a randomized struct can only be initialized with a designated initializer}}
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -2176,6 +2176,27 @@
break;
}
+ // Check if this is an initializer of forms:
+ //
+ // struct foo f = {};
+ // struct foo g = {0};
+ //
+ // These are okay for randomized structures. [C99 6.7.8p19]
+ auto IsZeroInitializer = [&](const Expr *I) {
+ if (IList->getNumInits() == 1)
+ if (const auto *IL = dyn_cast<IntegerLiteral>(I))
+ return IL->getValue().isZero();
+ return false;
+ };
+
+ // Don't allow non-designated initializers on randomized structures.
+ if (RD->isRandomized() && !IsZeroInitializer(Init)) {
+ if (!VerifyOnly)
+ SemaRef.Diag(InitLoc, diag::err_non_designated_init_used);
+ hadError = true;
+ break;
+ }
+
// We've already initialized a member of a union. We're done.
if (InitializedSomething && DeclType->isUnionType())
break;
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11588,7 +11588,9 @@
def err_hlsl_numthreads_invalid : Error<"total number of threads cannot exceed %0">;
def err_hlsl_attribute_param_mismatch : Error<"%0 attribute parameters do not match the previous declaration">;
-// Layout randomization warning.
+// Layout randomization diagnostics.
+def err_non_designated_init_used : Error<
+ "a randomized struct can only be initialized with a designated initializer">;
def err_cast_from_randomized_struct : Error<
"casting from randomized structure pointer type %0 to %1">;
} // end of sema component.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D123763.422936.patch
Type: text/x-patch
Size: 3374 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220414/a4db99f4/attachment.bin>
More information about the cfe-commits
mailing list