[PATCH] config: Fix invalid static assertions in C

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Dec 11 12:57:31 UTC 2020


Expressions in static assertions must be integral constant expressions.  In
integral constant expressions the use of address constant expressions is not
allowed.

In static initializers the address constant expressions are allowed.  Introduce
a new macro _CONFIGURE_ASSERT_NOT_NULL() which leads to a compile time error if
the second parameter is NULL.  It generates error messages like this if for
example

  #define CONFIGURE_INIT_TASK_ENTRY_POINT NULL

is provided by the application:

cpukit/include/rtems/confdefs/inittask.h:51:26: error: size of unnamed array is negative
   51 |     ( _type ) sizeof( int[ ( _value ) != NULL ? 1 : -1 ] ) )
      |                          ^
cpukit/include/rtems/confdefs/inittask.h:170:3: note: in expansion of macro '_CONFIGURE_ASSERT_NOT_NULL'
  170 |   _CONFIGURE_ASSERT_NOT_NULL(
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~

Update #4181.
---
 cpukit/include/rtems/confdefs/inittask.h | 27 +++++++++++--------
 cpukit/include/rtems/confdefs/wkspace.h  | 34 +++++++++++-------------
 2 files changed, 32 insertions(+), 29 deletions(-)

diff --git a/cpukit/include/rtems/confdefs/inittask.h b/cpukit/include/rtems/confdefs/inittask.h
index d5ba521bf9..9dbf0b967b 100644
--- a/cpukit/include/rtems/confdefs/inittask.h
+++ b/cpukit/include/rtems/confdefs/inittask.h
@@ -46,6 +46,10 @@
 
 #ifdef CONFIGURE_INIT
 
+#define _CONFIGURE_ASSERT_NOT_NULL( _type, _value ) \
+  ( ( _value ) != NULL ? ( _value ) : \
+    ( _type ) sizeof( int[ ( _value ) != NULL ? 1 : -1 ] ) )
+
 #ifdef CONFIGURE_RTEMS_INIT_TASKS_TABLE
 
 #include <rtems/confdefs/percpu.h>
@@ -94,8 +98,8 @@ extern "C" {
 #endif
 
 /*
- * Ignore the following warnings from g++ and clang in the static assertion
- * below:
+ * Ignore the following warnings from g++ and clang in the uses of
+ * _CONFIGURE_ASSERT_NOT_NULL() below:
  *
  * warning: the address of 'void Init()' will never be NULL [-Waddress]
  *
@@ -107,13 +111,6 @@ extern "C" {
 #pragma GCC diagnostic ignored "-Wpragmas"
 #pragma GCC diagnostic ignored "-Wtautological-pointer-compare"
 
-RTEMS_STATIC_ASSERT(
-  CONFIGURE_INIT_TASK_ENTRY_POINT != NULL,
-  CONFIGURE_INIT_TASK_ENTRY_POINT_MUST_NOT_BE_NULL
-);
-
-#pragma GCC diagnostic pop
-
 #ifdef CONFIGURE_INIT_TASK_CONSTRUCT_STORAGE_SIZE
 
 #ifdef CONFIGURE_INIT_TASK_STACK_SIZE
@@ -139,7 +136,10 @@ const RTEMS_tasks_User_task_config _RTEMS_tasks_User_task_config = {
     CONFIGURE_INIT_TASK_INITIAL_MODES,
     CONFIGURE_INIT_TASK_ATTRIBUTES,
   },
-  CONFIGURE_INIT_TASK_ENTRY_POINT,
+  _CONFIGURE_ASSERT_NOT_NULL(
+    rtems_task_entry,
+    CONFIGURE_INIT_TASK_ENTRY_POINT
+  ),
   CONFIGURE_INIT_TASK_ARGUMENTS
 };
 
@@ -167,7 +167,10 @@ const rtems_initialization_tasks_table _RTEMS_tasks_User_task_table = {
   CONFIGURE_INIT_TASK_STACK_SIZE,
   CONFIGURE_INIT_TASK_PRIORITY,
   CONFIGURE_INIT_TASK_ATTRIBUTES,
-  CONFIGURE_INIT_TASK_ENTRY_POINT,
+  _CONFIGURE_ASSERT_NOT_NULL(
+    rtems_task_entry,
+    CONFIGURE_INIT_TASK_ENTRY_POINT
+  ),
   CONFIGURE_INIT_TASK_INITIAL_MODES,
   CONFIGURE_INIT_TASK_ARGUMENTS
 };
@@ -180,6 +183,8 @@ RTEMS_SYSINIT_ITEM(
 
 #endif /* CONFIGURE_INIT_TASK_CONSTRUCT_STORAGE_SIZE */
 
+#pragma GCC diagnostic pop
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/cpukit/include/rtems/confdefs/wkspace.h b/cpukit/include/rtems/confdefs/wkspace.h
index 39014d7f1d..eac4bdb4bd 100644
--- a/cpukit/include/rtems/confdefs/wkspace.h
+++ b/cpukit/include/rtems/confdefs/wkspace.h
@@ -139,8 +139,8 @@ const uintptr_t _Stack_Space_size = _CONFIGURE_STACK_SPACE_SIZE;
 #if defined(CONFIGURE_TASK_STACK_ALLOCATOR) \
   && defined(CONFIGURE_TASK_STACK_DEALLOCATOR)
   /*
-   * Ignore the following warnings from g++ and clang in the static assertions
-   * below:
+   * Ignore the following warnings from g++ and clang in the uses of
+   * _CONFIGURE_ASSERT_NOT_NULL() below:
    *
    * warning: the address of 'f()' will never be NULL [-Waddress]
    *
@@ -159,13 +159,11 @@ const uintptr_t _Stack_Space_size = _CONFIGURE_STACK_SPACE_SIZE;
   #endif
 
   #ifdef CONFIGURE_TASK_STACK_ALLOCATOR_INIT
-    RTEMS_STATIC_ASSERT(
-      CONFIGURE_TASK_STACK_ALLOCATOR_INIT != NULL,
-      CONFIGURE_TASK_STACK_ALLOCATOR_INIT_MUST_NOT_BE_NULL
-    );
-
     const Stack_Allocator_initialize _Stack_Allocator_initialize =
-      CONFIGURE_TASK_STACK_ALLOCATOR_INIT;
+      _CONFIGURE_ASSERT_NOT_NULL(
+        Stack_Allocator_initialize,
+        CONFIGURE_TASK_STACK_ALLOCATOR_INIT
+      );
 
     RTEMS_SYSINIT_ITEM(
       _Stack_Allocator_do_initialize,
@@ -174,21 +172,21 @@ const uintptr_t _Stack_Space_size = _CONFIGURE_STACK_SPACE_SIZE;
     );
   #endif
 
-  RTEMS_STATIC_ASSERT(
-    CONFIGURE_TASK_STACK_ALLOCATOR != NULL,
-    CONFIGURE_TASK_STACK_ALLOCATOR_MUST_NOT_BE_NULL
-  );
+  Stack_Allocator_allocate CONFIGURE_TASK_STACK_ALLOCATOR_MUST_NOT_BE_NULL;
 
   const Stack_Allocator_allocate _Stack_Allocator_allocate =
-    CONFIGURE_TASK_STACK_ALLOCATOR;
+    _CONFIGURE_ASSERT_NOT_NULL(
+      Stack_Allocator_allocate,
+      CONFIGURE_TASK_STACK_ALLOCATOR
+    );
 
-  RTEMS_STATIC_ASSERT(
-    CONFIGURE_TASK_STACK_DEALLOCATOR != NULL,
-    CONFIGURE_TASK_STACK_DEALLOCATOR_MUST_NOT_BE_NULL
-  );
+  Stack_Allocator_free CONFIGURE_TASK_STACK_DEALLOCATOR_MUST_NOT_BE_NULL;
 
   const Stack_Allocator_free _Stack_Allocator_free =
-    CONFIGURE_TASK_STACK_DEALLOCATOR;
+    _CONFIGURE_ASSERT_NOT_NULL(
+      Stack_Allocator_free,
+      CONFIGURE_TASK_STACK_DEALLOCATOR
+    );
 
   #pragma GCC diagnostic pop
 #elif defined(CONFIGURE_TASK_STACK_ALLOCATOR) \
-- 
2.26.2



More information about the devel mailing list