On Mon, Feb 21, 2022 at 01:22:53PM -0500, 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?
GCC 11 (gcc-11.2.1-9.fc35.x86_64) gives plenty of errors with this
code:
array.c: In function ‘f’:
array.c:14:8: error: cast specifies array type
14 | (char [])(char *)memcpy(malloc((size)*sizeof(char)),
| ^
array.c:13:16: error: invalid use of flexible array member
13 | arg1->bar =
| ^
array.c:17:16: error: invalid use of flexible array member
17 | arg1->bar = 0;
| ^
In fact these are identical in GCC 12 (gcc-12.0.1-0.6.fc36.x86_64).
So whatever it is, I don't think it has anything to do with GCC 12.
I wonder if this code was meant to be compiled with an unusual -std
flag? (I tried -std=c90 and it seems to make no difference.)
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?
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top