On 01/17/2018 09:36 AM, Richard Henderson wrote: > On 01/17/2018 05:18 AM, Philippe Mathieu-Daudé wrote: >> BTW another useful macro for the static analizer I used is: >> >> #define QEMU_FALLTHROUGH __attribute__((fallthrough)) >> >> It replaces the /* fall through */ comment, i.e.: > > That's unfortunate. Does it help if you use the actual lint spelling of /* > FALLTHRU */?
New gcc has this: '-Wimplicit-fallthrough=N' Warn when a switch case falls through. For example: ... Since there are occasions where a switch case fall through is desirable, GCC provides an attribute, '__attribute__ ((fallthrough))', that is to be used along with a null statement to suppress this warning that would normally occur: switch (cond) { case 1: bar (0); __attribute__ ((fallthrough)); default: ... } C++17 provides a standard way to suppress the '-Wimplicit-fallthrough' warning using '[[fallthrough]];' instead of the GNU attribute. In C++11 or C++14 users can use '[[gnu::fallthrough]];', which is a GNU extension. Instead of the these attributes, it is also possible to add a fallthrough comment to silence the warning. The whole body of the C or C++ style comment should match the given regular expressions listed below. The option argument N specifies what kind of comments are accepted: * '-Wimplicit-fallthrough=0' disables the warning altogether. * '-Wimplicit-fallthrough=1' matches '.*' regular expression, any comment is used as fallthrough comment. * '-Wimplicit-fallthrough=2' case insensitively matches '.*falls?[ \t-]*thr(ough|u).*' regular expression. * '-Wimplicit-fallthrough=3' case sensitively matches one of the following regular expressions: * '-fallthrough' * '@fallthrough@' * 'lint -fallthrough[ \t]*' * '[ \t.!]*(ELSE,? |INTENTIONAL(LY)? )? FALL(S | |-)?THR(OUGH|U)[ \t.!]*(-[^\n\r]*)?' * '[ \t.!]*(Else,? |Intentional(ly)? )? Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!]*(-[^\n\r]*)?' * '[ \t.!]*([Ee]lse,? |[Ii]ntentional(ly)? )? fall(s | |-)?thr(ough|u)[ \t.!]*(-[^\n\r]*)?' * '-Wimplicit-fallthrough=4' case sensitively matches one of the following regular expressions: * '-fallthrough' * '@fallthrough@' * 'lint -fallthrough[ \t]*' * '[ \t]*FALLTHR(OUGH|U)[ \t]*' * '-Wimplicit-fallthrough=5' doesn't recognize any comments as fallthrough comments, only attributes disable the warning. The comment needs to be followed after optional whitespace and other comments by 'case' or 'default' keywords or by a user label that precedes some 'case' or 'default' label. switch (cond) { case 1: bar (0); /* FALLTHRU */ default: ... } The '-Wimplicit-fallthrough=3' warning is enabled by '-Wextra'. No thanks to level 5, these days, you HAVE to use a macro that expands to the attribute and/or C17 spelling, rather than relying on the lint spelling, if you cannot control what level a user will request; although with level 3, the lint spelling of a comment still works. I'm not sure which static analyzers recognize which other spellings; which is why a macro that consistently expands to the same string known to work, rather than 20 different ad hoc comments (many of which work, but auditing that all of them work is a bigger task), may be worthwhile. -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org
signature.asc
Description: OpenPGP digital signature