feat(newlib): add option to disable eval of expression in assert() when NDEBUG set

According to the standard assert(X) should be replaced by a void expression when
NDEBUG is set. IDF's behavior was to not trigger an assertion, but we would still
evaluate X, e.g. if X was a function it would be ran.

This MR adds a kconfig option CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE which allows us
revert the behavior to be inline with the standard.

With IDF v6.0 the plan is to make CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=n the default
behavior.

Closes https://github.com/espressif/esp-idf/issues/10136
Closes https://github.com/espressif/esp-idf/issues/2758
This commit is contained in:
Marius Vikhammer 2024-08-15 16:40:19 +08:00
parent c01ccd1f62
commit ff8265b6b3
3 changed files with 21 additions and 0 deletions

15
Kconfig
View File

@ -388,6 +388,21 @@ mainmenu "Espressif IoT Development Framework Configuration"
endchoice # assertions
config COMPILER_ASSERT_NDEBUG_EVALUATE
bool "Enable to evaluate the expression inside assert(X) when NDEBUG is set"
default y
help
When NDEBUG is set, assert(X) will not cause code to trigger an assertion.
With this option set assert(X) will still evaluate the expression X, though
the result will never cause an assertion. This means that if X is a function
then the function will be called.
This is not according to the standard, which states that the assert(X) should
be replaced with ((void)0) if NDEBUG is defined.
In ESP-IDF v6.0 the default behavior will change to "no" to be inline with the
standard.
choice COMPILER_FLOAT_LIB_FROM
prompt "Compiler float lib source"
default COMPILER_FLOAT_LIB_FROM_RVFPLIB if ESP_ROM_HAS_RVFPLIB

View File

@ -30,7 +30,11 @@
#if defined(NDEBUG)
#if CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE
#define assert(__e) ((void)(__e))
#else
#define assert(__e) ((void)0)
#endif //CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE
#elif CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT

View File

@ -0,0 +1,2 @@
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y
CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=n