Hacker News new | ask | show | jobs
by peterdn 3493 days ago
In some compilers due to C99 variable length arrays [1], your macro compiles happily if passed a value that is not a compile-time constant.

For example, this compiles but segfaults at runtime (GCC 4.9.2):

  int main(int argc, char * argv[]) {
    return (sizeof(char[(argc) ? -1 : 1]) - 1);
  }
[1] https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
1 comments

Ah, good point. One more reason for me to hate VLAs. ;)

The negative-length array trick is used in the Linux kernel source code [1]. I expect it's compiled with -Wvla though.

[1] https://github.com/torvalds/linux/blob/v4.5/arch/x86/boot/bo...

Looks exactly like the macro Jan Beulich replaced with the one discussed in OP: https://github.com/torvalds/linux/commit/8c87df457cb58fe75b9...
They are so good that they became optional in C11[0] and thankfully were not adopted by ANSI C++.

[0] - ISO 9899:2011 Programming Languages - C 6.7.6.2 4