Cherry-picking C99 features (was: [PATCH] xx)
Stefan Metzmacher
metze at samba.org
Wed Apr 27 22:53:35 UTC 2016
Hi Ralph,
> I just came across an issue caused by our build system not forcing a
> specific C standard, instead relying on cherry-picking C99 features.
>
> One C99 feature we actively use in our code base and check for at
> configure time are C99 designated initializers.
>
> But what about other C99 features? What about C99 intermingled code
> and variable declarations, eg declaring the loop variable in a for
> loop:
>
> for (int i = 0; ...something...; i++) { ; }
>
> This builds just fine in a Samba build with newer GCC that have a
> default C standard of at least gnu99, but the build then breaks with
> older gcc that have a default C standard of gnu90. And the poor
> developer with the newer gcc won't notice.
>
> gnu90 includes C99 designated initializers (yes, really), but not C99
> intermingled code and variable declarations:
>
> $ cat test.c
> struct foo {int x; char y;};
> struct foo bar = { .y = 'X', .x = 1 };
>
> int baz(void) {
> for (int i=0; i < 2; i++) {
> bar.x += i;
> }
> return bar.x;
> }
>
> $ gcc -std=gnu90 -c test.c
> test.c: In function ‘baz’:
> test.c:5:2: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode
> for (int i=0; i < 2; i++) {
> ^
> test.c:5:2: note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code
>
> What can we do?
>
> If we decide we *don't* want to support specific C99 features like
> mixed declaration and code, there's just no way to say to the
> compiler "I want C99 feaure A but I don't want C99 feature B, please
> warn me if I inadvertently use it".
We're using -Werror=declaration-after-statement which seems to do the job
to prevent such patches to pass autobuild.
> So I guess cherry-picking is the wrong approach. It should be all or
> nothing.
>
> Attached is a patch that would continue cherry-picking C99 features
> and adds a check for mixed declarations and code, but this is just
> meant to illustrate the problem.
>
> Maybe we should take this further and be as pedantic as autoconf's
> AC_PROG_CC_C99:
>
> # If the C compiler is not in ISO C99 mode by default, try to add an
> # option to output variable CC to make it so. This macro tries
> # various options that select ISO C99 on some system or another. It
> # considers the compiler to be in ISO C99 mode if it handles _Bool,
> # // comments, flexible array members, inline, long long int, mixed
> # code and declarations, named initialization of structs, restrict,
> # va_copy, varargs macros, variable declarations in for loops and
> # variable length arrays.
I'd really try to avoid // comments, flexible array members,
mixed code and declarations and variable declarations in for loops.
metze
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20160428/fe473847/signature.sig>
More information about the samba-technical
mailing list