If someone can post with a consensus/decision once there is one, it would be most useful!

On 03/01/2024 17:35, Fotis Panagiotopoulos wrote:
Just to be clear, I am always referring to the standard C assert()
function/macro.

Not the unconditional NuttX ASSERT() macro. Notice the capitalization!

(Which is another confusing point worth improving... +1 for NX_ASSERT() )

On Wed, Jan 3, 2024 at 7:32 PM Fotis Panagiotopoulos<f.j.pa...@gmail.com>
wrote:

I am sorry, but I still don't see the difference.

See this line here:
https://github.com/apache/nuttx/blob/master/include/assert.h#L119

When NDEBUG is defined, assert also compiles to nothing.
As it ought to do.

(NDEBUG definition is also controlled by Kconfig, with CONFIG_NDEBUG)

So, is there an actual difference that I currently have overseen?

On Wed, Jan 3, 2024 at 6:54 PM Tomek CEDRO<to...@cedro.info>  wrote:

+1 :-)

--
CeDeROM, SQ7MHZ,http://www.tomek.cedro.info

On Wed, Jan 3, 2024, 17:44 Gregory Nutt<spudan...@gmail.com>  wrote:

+1

On 1/3/2024 10:43 AM, Nathan Hartman wrote:
On Wed, Jan 3, 2024 at 11:22 AM Gregory Nutt<spudan...@gmail.com>
wrote:
On 1/3/2024 10:11 AM, Fotis Panagiotopoulos wrote:
That would seem a little odd since there was a PR a few years ago
to
change all instances of assert/ASSERT to DEBUGASSERT to save code
size.
How is that so?

As I see here:
https://github.com/apache/nuttx/blob/master/include/assert.h#L122
assert defined exactly as DEBUGASSERT.

There shouldn't be any code size difference at all.
When CONFIG_DEBUG_ASSERTIONS is not defined, then all occurrences of
DEBUGASSERT compile to nothing (actually the current version
compiles to
an expression that is optimized out):

      #undef DEBUGASSERT  /* Like ASSERT, but only if
      CONFIG_DEBUG_ASSERTIONS is defined */

      #ifdef CONFIG_DEBUG_ASSERTIONS
      #  define DEBUGASSERT(f) _ASSERT(f, __DEBUG_ASSERT_FILE__,
      __DEBUG_ASSERT_LINE__)
      #else
      #  define DEBUGASSERT(f) ((void)(1 || (f)))
      #endif

This value, ((void)(1 || (f))), is completely removed by the
optimizer
because of short-circuiting and dead code removal.  So the code is
much
smaller if CONFIG_DEBUG_ASSERTIONS is not enabled.  If DEBUGASSERT()
is
replaced with assert() than that code bloat would be unconditional,
although somewhat less than when assertions are enabled.

This same kind of logic also applies to  DEBUGPANIC and DEBUGVERIFY.

Xiao Xiang made that change to reduce the size as needed by their
products.  He is the person you should be talking to.
Maybe we need NX_DEBUGASSERT, NX_DEBUGPANIC, NX_DEBUGVERIFY. The NX
prefix would make it more clear that this is NuttX-specific. These
would be used in the OS only, not in applications, and
CONFIG_DEBUG_ASSERTIONS would continue to control if these are real or
optimized out.

Applications that need their own specific, Kconfig-controlled debug
assertion, should define one themselves, and their own Kconfig to
optimize it out. Rationale: If you are debugging an application,
enable assertions only in that application, not everywhere throughout
the system.

Cheers
Nathan

Reply via email to