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

Michael Matz
2022-11-29T15:44:07Z

[-- Attachment #1: Type: text/plain, Size: 2427 bytes --]

Hey,

On Tue, 29 Nov 2022, Uecker, Martin wrote:

> It does not require any changes on how arrays are represented.
>
> As part of VM-types the size becomes part of the type and this
> can be used for static or dynamic analysis, e.g. you can
> - today - get a run-time bounds violation with the sanitizer:
>
> void foo(int n, char (*buf)[n])
> {
> (*buf)[n] = 1;
> }

This can already statically analyzed as being wrong, no need for dynamic
checking. What I mean is the checking of the claimed contract. Above you
assure for the function body that buf has n elements. This is also a
pre-condition for calling this function and _that_ can't be checked in all
cases because:

void foo (int n, char (*buf)[n]) { (*buf)[n-1] = 1; }
void callfoo(char * buf) { foo(10, buf); }

buf doesn't have a known size. And a pre-condition that can't be checked
is no pre-condition at all, as only then it can become a guarantee for the
body.

The compiler has no choice than to trust the user that the pre-condition
for calling foo is fulfilled. I can see how being able to just check half
of the contract might be useful, but if it doesn't give full checking then
any proposal for syntax should be even more obviously orthogonal than the
current one.

> For
>
> void foo(int n, char buf[n]);
>
> it semantically has no meaning according to the C standard,
> but a compiler could still warn.

Hmm? Warn about what in this decl?

> It could also warn for
>
> void foo(int n, char buf[n]);
>
> int main()
> {
> char buf[9];
> foo(buf);
> }

You mean if you write 'foo(10,buf)' (the above, as is, is simply a syntax
error for non-matching number of args). Or was it a mispaste and you mean
the one from the godbolt link, i.e.:

void foo(char buf[10]){ buf[9] = 1; }
int main()
{
char buf[9];
foo(buf);
}

? If so, yeah, we warn already. I don't think this is an argument for
(or against) introducing new syntax.

...

> But in general: This feature is useful not only for documentation
> but also for analysis.

Which feature we're talking about now? The ones you used all work today,
as you demonstrated. I thought we would be talking about that ".whatever"
syntax to refer to arbitrary parameters, even following ones? I think a
disrupting syntax change like that should have a higher bar than "in some
cases, depending on circumstance, we might even be able to warn".

Ciao,
Michael.