This idiom is known as “flexible array member,” and it is standardized since
C99. The “bar[0]” syntax you mention is a GCC extension predating C99.
I’m not that familiar with the nuances of SWIG, but it looks like SWIG doesn’t
understand this at all, and is treating “bar” as a pointer member and adding a
nonsense (char []) cast. “bar” needs to be the target of a memcpy/memmove, not
a pointer assignment. Given this, I wonder if it even generates appropriate
code for the “bar[0]” version, or if it just emits a zero-length memcpy.
At first glance, and without doing any experiments of my own, I would say that,
unless there’s something in SWIG that just needs to be configured differently,
it certainly appears to be a SWIG bug. If so, it may be nontrivial to fix.
I wonder if this was always a little bit broken, and GCC 12 just revealed it
with better diagnostics.
– Ben
On Mon, Feb 21, 2022, at 1:22 PM, Steve Grubb wrote:
> Hello,
>
> I have a FTBFS package, audit, that has a strange problem that I'd like to
> run by the devel list. It is a common idiom in the kernel to do something
> like:
>
> struct foo{
> unsigned int barlen;
> char bar[];
> };
>
> There are about 80 instances of this in the kernel headers. When one of these
> headers is included by SWIG, it makes code like this:
>
> if (arg2) {
> arg1->bar = (char [])(char *)memcpy(malloc((size)*sizeof(char)), (const
> char *)(arg2), sizeof(char)*(size));
> } else {
> arg1->bar = 0;
> }
>
> which results in
>
> error: cast specifies array type
>
> and
>
> error: assignment to expression with array type.
>
> Is this intended to be an error by gcc-12?
>
> One fix is to change the struct decalaration to bar[0]; and gcc doesn't
> error
> out on that. But that will take some time to get in the upstream kernel. Just
> curious if this is intended by gcc or a problem of SWIG/kernel?
>
> Thanks,
> -Steve
>
> _______________________________________________
> devel mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
> Fedora Code of Conduct:
> https://docs.fedoraproject.org/en-US/project/code-of-conduct/
> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> List Archives:
> https://lists.fedoraproject.org/archives/list/[email protected]
> Do not reply to spam on the list, report it:
> https://pagure.io/fedora-infrastructure
_______________________________________________
devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]
Fedora Code of Conduct:
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives:
https://lists.fedoraproject.org/archives/list/[email protected]
Do not reply to spam on the list, report it:
https://pagure.io/fedora-infrastructure