Re: [PATCH] Various pages: SYNOPSIS: Use VLA syntax in function parameters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Martin,

On 11/13/22 15:58, Martin Uecker wrote:
Am Sonntag, den 13.11.2022, 15:02 +0100 schrieb Alejandro Colomar:

On 11/13/22 14:33, Alejandro Colomar wrote:

On 11/13/22 14:19, Alejandro Colomar wrote:
But there are not only syntactical problems, because
also the type of the parameter might become relevant
and then you can get circular dependencies:

void foo(char (*a)[sizeof *.b], char (*b)[sizeof *.a]);

This seems to be a difficult stone in the road.

But note that GNU forward declarations solve this nicely.

How would that above be solved with GNU fwd decl? I'm guessing that it can't. How do you forward declare incomplete VMTs?.



I am not sure what would the best way to fix it. One
could specifiy that parameters referred to by
the .identifer syntax must of some integer type and
that the sub-expression .identifer is always
converted to a 'size_t'.

That makes sense, but then overnight some quite useful thing came to my mind
that would not be possible with this limitation:


<https://software.codidact.com/posts/285946>

char *
stpecpy(char dst[.end - .dst], char *src, char end[1])

Heh, I got an off-by-one error.  It should be dst[.end - .dst + 1], of course,
and then the result of the whole expression would be 0, which is fine as size_t.

So, never mind.

.end and .dst would have pointer size though.

{
      for (/* void */; dst <= end; dst++) {
          *dst = *src++;
          if (*dst == '\0')
              return dst;
      }
      /* Truncation detected */
      *end = '\0';

#if !defined(NDEBUG)
      /* Consume the rest of the input string. */
      while (*src++) {};
#endif

      return end + 1;
}
And I forgot to say it:  Default promotions rank high (probably the highest) in
my list of most hated features^Wbugs in C.

If you replaced them with explicit conversion you then have
to add by hand all the time, I am pretty sure most people
would hate this more. (and it could also hide bugs)

Yeah, casts are also in my top 3 list of things to avoid (although in this case there's no bug); maybe a bit over default promotions :)

I didn't mean that all promotions are bad. Just the gratuitous ones, like promoting everything to int before even needing it. That makes uint16_t a theoretical type, because whenever you try to use it, you end up with a signed 32-bit type; fun heh? :P _BitInt() solves that for me.

But sure, in (1u + 1l), promotions are fine to get a common type.


I wouldn't convert it to size_t, but
rather follow normal promotion rules.

The point of making it size_t is that you then
do need to know the type of the parameter to make
sense of the expression. If the type matters, then you get
mutual dependencies as in the example above.

Except if you treat incomplete types as... incomplete types (for which sizeof() is disallowed by the standard). And the issue we're having is that the types are not yet complete at the time we're using them, aren't they?

Kind of like the initialization order fiasco, but since we're in a limited scope, we can detect it.

Cheers,

Alex

--
<http://www.alejandro-colomar.es/>

Attachment: OpenPGP_signature
Description: OpenPGP digital signature


[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux