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