[PATCH] config: Fix invalid static assertions in C

Gedare Bloom gedare at rtems.org
Fri Dec 11 13:26:42 UTC 2020


Hi Sebastian,

On Fri, Dec 11, 2020 at 5:57 AM Sebastian Huber <
sebastian.huber at embedded-brains.de> wrote:

> 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(
>       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~
>
>
This is a nice fix. The initial error is opaque, but the macro expansion
seems to be clear enough to help a user debug. Thanks


> 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 ] ) )
> +
>
Magic ;)


>  #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
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20201211/90237534/attachment-0001.html>


More information about the devel mailing list