From: PatR Date: Mon, 6 Mar 2023 00:19:32 +0000 (-0800) Subject: eliminate static analysis complaints about eat.c X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=refs%2Fheads%2FNetHack-3.7;p=nethack eliminate static analysis complaints about eat.c This is fairly ridiculous but it prevents the bogus complaints when compiling eat.c with 'gcc -fanalyzer' about some fields in gc.context.victual being used without having been initialized. There's bound to be a better way to handle this and I'm curious whether it will work with the 'onefile' testing. --- diff --git a/include/extern.h b/include/extern.h index ecd49a89f..17584d0a7 100644 --- a/include/extern.h +++ b/include/extern.h @@ -332,6 +332,7 @@ extern void destroy_drawbridge(coordxy, coordxy); /* ### decl.c ### */ extern void decl_globals_init(void); +extern void sa_victual(volatile struct victual_info *); /* ### detect.c ### */ diff --git a/src/decl.c b/src/decl.c index 77955cdc0..a0714791f 100644 --- a/src/decl.c +++ b/src/decl.c @@ -1048,4 +1048,17 @@ decl_globals_init(void) long verbosity_suppressions[vb_elements] = { 0L, 0L, 0L, 0L, 0L, }; #endif +/* gcc 12.2's static analyzer thinks that some fields of gc.context.victual + are uninitialized when compiling 'bite(eat.c)' but that's impossible; + it is defined at global scope so guaranteed to be given implicit + initialization for fields that aren't explicitly initialized (all of + 'context'); having bite() pass &gc.context.victual to this no-op + eliminates the analyzer's very verbose complaint */ +void +sa_victual( + volatile struct victual_info *context_victual UNUSED) +{ + return; +} + /*decl.c*/ diff --git a/src/eat.c b/src/eat.c index 6b4086cfb..bed27d182 100644 --- a/src/eat.c +++ b/src/eat.c @@ -2983,6 +2983,9 @@ use_tin_opener(struct obj *obj) static int bite(void) { + /* hack to pacify static analyzer incorporated into gcc 12.2 */ + sa_victual(&gc.context.victual); + if (gc.context.victual.canchoke && u.uhunger >= 2000) { choke(gc.context.victual.piece); return 1;