* When STDC_Pragma_AVAILABLE is not defined, these are defined as no-ops:
* DISABLE_WARNING_UNREACHABLE_CODE
* DISABLE_WARNING_CONDEXPR_IS_CONSTANT
+ * DISABLE_WARNING_FORMAT_NONLITERAL
* ...
* RESTORE_WARNINGS
+ * RESTORE_WARNING_CONDEXPR_IS_CONSTANT
+ * RESTORE_WARNING_FORMAT_NONLITERAL
*
*/
#define DISABLE_WARNING_UNREACHABLE_CODE \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wunreachable-code\"")
+#define DISABLE_WARNING_FORMAT_NONLITERAL \
+ _Pragma("clang diagnostic push") \
+ _Pragma("clang diagnostic ignored \"-Wformat-nonliteral\"")
#define DISABLE_WARNING_CONDEXPR_IS_CONSTANT
#define RESTORE_WARNING_CONDEXPR_IS_CONSTANT
+#define RESTORE_WARNING_FORMAT_NONLITERAL _Pragma("clang diagnostic pop")
#define RESTORE_WARNINGS _Pragma("clang diagnostic pop")
#define STDC_Pragma_AVAILABLE
#define DISABLE_WARNING_UNREACHABLE_CODE \
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wunreachable-code\"")
+#define DISABLE_WARNING_FORMAT_NONLITERAL \
+ _Pragma("GCC diagnostic push") \
+ _Pragma("GCC diagnostic ignored \"-Wformat-nonliteral\"")
#define DISABLE_WARNING_CONDEXPR_IS_CONSTANT
#define RESTORE_WARNING_CONDEXPR_IS_CONSTANT
+#define RESTORE_WARNING_FORMAT_NONLITERAL _Pragma("GCC diagnostic pop")
#define RESTORE_WARNINGS _Pragma("GCC diagnostic pop")
#define STDC_Pragma_AVAILABLE
#define DISABLE_WARNING_UNREACHABLE_CODE \
_Pragma("warning( push )") \
_Pragma("warning( disable : 4702 )")
+#define DISABLE_WARNING_FORMAT_NONLITERAL \
+ _Pragma("warning( push )") \
+ _Pragma("warning( disable : 4774 )")
#define DISABLE_WARNING_CONDEXPR_IS_CONSTANT \
_Pragma("warning( push )") \
_Pragma("warning( disable : 4127 )")
#define RESTORE_WARNING_CONDEXPR_IS_CONSTANT _Pragma("warning( pop )")
+#define RESTORE_WARNING_FORMAT_NONLITERAL _Pragma("warning( pop )")
#define RESTORE_WARNINGS _Pragma("warning( pop )")
#define STDC_Pragma_AVAILABLE
#if !defined(STDC_Pragma_AVAILABLE)
#define DISABLE_WARNING_UNREACHABLE_CODE
+#define DISABLE_WARNING_FORMAT_NONLITERAL
#define DISABLE_WARNING_CONDEXPR_IS_CONSTANT
#define RESTORE_WARNING_CONDEXPR_IS_CONSTANT
+#define RESTORE_WARNING_FORMAT_NONLITERAL
#define RESTORE_WARNINGS
#endif
return FROM_NONE;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
char *
from_what(int propidx) /* special cases can have negative values */
{
return buf;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
void
adjabil(int oldlevel, int newlevel)
{
#if defined(TTY_GRAPHICS) || defined(CURSES_GRAPHICS)
#define MAX_EXT_CMD 200 /* Change if we ever have more ext cmds */
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/*
* This is currently used only by the tty interface and is
* controlled via runtime option 'extmenu'. (Most other interfaces
}
return ret;
}
+
+RESTORE_WARNING_FORMAT_NONLITERAL
+
#endif /* TTY_GRAPHICS */
/* #monster command - use special monster ability while polymorphed */
return NULL;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* explanation of base-36 output from wiz_map_levltyp() */
static void
wiz_levltyp_legend(void)
return;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
DISABLE_WARNING_CONDEXPR_IS_CONSTANT
/* #wizsmell command - test usmellmon(). */
RESTORE_WARNING_CONDEXPR_IS_CONSTANT
+DISABLE_WARNING_FORMAT_NONLITERAL
+
#define DEFAULT_TIMEOUT_INCR 30
/* #wizinstrinsic command to set some intrinsics for testing */
return 0;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* #wizrumorcheck command - verify each rumor access */
static int
wiz_rumor_check(void)
*total_size += size;
}
+DISABLE_WARNING_FORMAT_NONLITERAL /* RESTORE_WARNING follows show_wiz_stats */
+
static void
obj_chain(winid win, const char *src, struct obj *chain, boolean force,
long *total_count, long *total_size)
return 0;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
void
sanity_check(void)
{
}
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
void
goto_level(d_level *newlevel, boolean at_stairs, boolean falling, boolean portal)
{
(void) pickup(1);
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* usually called from goto_level(); might be called from Sting_effects() */
void
maybe_lvltport_feedback(void)
putstr(tmpwin, 0, sbuf);
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* the response for '?' help request in getpos() */
static void
getpos_help(boolean force, const char *goal)
destroy_nhwindow(tmpwin);
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static int QSORTCALLBACK
cmp_coord_distu(const void *a, const void *b)
{
return buf;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* coordinate formatting for 'whatis_coord' option */
char *
coord_desc(int x, int y, char *outbuf, char cmode)
return outbuf;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static void
auto_describe(int cx, int cy)
{
return load;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* to support '#stats' wizard-mode command */
void
overview_stats(winid win, const char *statsfmt,
*total_size += osize + bsize + asize;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* Remove all mapseen objects for a particular dnum.
* Useful during quest expulsion to remove quest levels.
* [No longer deleted, just marked as unreachable. #overview will
}
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* called after completely consuming a corpse */
static void
cpostfx(int pm)
return;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
void
violated_vegetarian(void)
{
#endif
#endif /* NO_SIGNAL */
+DISABLE_WARNING_FORMAT_NONLITERAL /* one compiler warns if the format
+ string is the result of a ? x : y */
+
void
done_in_by(struct monst *mtmp, int how)
{
return;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* some special cases for overriding while-helpless reason */
static const struct {
int why, unmulti;
}
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* to support '#stats' wizard-mode command */
void
engr_stats(const char *hdrfmt, char *hdrbuf, long *count, long *size)
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
void
del_engr(register struct engr *ep)
{
: (dd == 1) ? "st" : (dd == 2) ? "nd" : "rd";
}
+DISABLE_WARNING_FORMAT_NONLITERAL /* one compiler complains about
+ result of ?: for format string */
+
/* make a signed digit string from a number */
char *
sitoa(int n)
return buf;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* return the sign of a number: -1, 0, or 1 */
int
sgn(int n)
return 0;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* #wizborn extended command */
int
doborn(void)
return 0;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* high priests aren't unique but are flagged as such to simplify something */
#define UniqCritterIndx(mndx) ((mons[mndx].geno & G_UNIQ) \
&& mndx != PM_HIGH_CLERIC)
xprname(obj, (char *) 0, obj_to_let(obj), TRUE, 0L, quan));
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
char *
xprname(struct obj *obj,
const char *txt, /* text to print instead of obj */
return li;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* the 'i' command */
int
ddoinv(void)
static NEARDATA const char oth_symbols[] = { CONTAINED_SYM, '\0' };
static NEARDATA const char *oth_names[] = { "Bagged/Boxed items" };
+DISABLE_WARNING_FORMAT_NONLITERAL
+
char *
let_to_name(char let, boolean unpaid, boolean showsym)
{
return g.invbuf;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* release the static buffer used by let_to_name() */
void
free_invbuf(void)
}
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* to support '#stats' wizard-mode command */
void
light_stats(const char *hdrfmt, char *hdrbuf, long *count, long *size)
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* Relink all lights that are so marked. */
void
relink_light_sources(boolean ghostly)
}
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static
void
missmm(register struct monst *magr, register struct monst *mdef,
noises(magr, mattk);
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/*
* fightm() -- fight some other monster
*
return optn_ok;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static int
handler_symset(int optidx)
{
return optidx;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static int
handler_autopickup_exception(void)
{
extern const char regex_id[]; /* from sys/share/<various>regex.{c,cpp} */
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* True: temporarily replace menu color entries with a fake set of menu
colors, { "light blue"=light_blue, "blue"=blue, "red"=red, &c }, that
illustrates most colors for use when the pick-a-color menu is rendered;
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
int
query_color(const char *prompt)
{
static char fmtstr_doset_tab[] = "%s\t[%s]";
static char n_currently_set[] = "(%d currently set)";
+DISABLE_WARNING_FORMAT_NONLITERAL /* RESTORE is after show_menucontrols() */
+
static int
optfn_o_autopickup_exceptions(int optidx UNUSED, int req, boolean negated UNUSED,
char *opts, char *op UNUSED)
ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
}
+
/* display keys for menu actions; used by cmd.c '?i' and pager.c '?k' */
void
show_menu_controls(winid win, boolean dolist)
arg = "";
}
}
+
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static int
count_cond(void)
{
return numapes;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* common to msg-types, menu-colors, autopickup-exceptions */
static int
handle_add_list_remove(const char *optname, int numtotal)
return opt_idx;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
int
dotogglepickup(void)
{
return 0;
}
+DISABLE_WARNING_FORMAT_NONLITERAL /* RESTORE is after do_supplemental_info() */
+
static void
look_all(boolean nearby, /* True => within BOLTLIM, False => entire map */
boolean do_mons) /* True => monsters, False => objects */
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* the '/' command */
int
dowhatis(void)
{ (void (*)(void)) 0, (char *) 0 }
};
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* the '?' command */
int
dohelp(void)
return 0;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* the 'V' command; also a choice for '?' */
int
dohistory(void)
reset_region_mids(g.regions[i]);
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* to support '#stats' wizard-mode command */
void
region_stats(const char* hdrfmt, char* hdrbuf, long* count, long* size)
/* ? */
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* update monster IDs for region being loaded from bones; `ghostly' implied */
static void
reset_region_mids(NhRegion* reg)
static void others_check(const char *ftype, const char *, winid *);
static void couldnt_open_file(const char *);
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static void
init_rumors(dlb* fp)
{
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* exclude_cookie is a hack used because we sometimes want to get rumors in a
* context where messages such as "You swallowed the fortune!" that refer to
* cookies should not appear. This has no effect for true rumors since none
}
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* 3.7: augments rumors_check(); test 'engrave' or 'epitaph' or 'bogusmon' */
static void
others_check(const char* ftype, const char* fname, winid* winptr)
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* Gets a random line of text from file 'fname', and returns it.
rng is the random number generator to use, and should act like rn2 does. */
char *
return (boolean) (glyph_to_mon(glyph) == PM_GECKO);
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static int
domonnoise(register struct monst* mtmp)
{
return 1;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* #chat command */
int
dotalk(void)
stop_occupation();
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static int
learn(void)
{
return 0;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
int
study_book(register struct obj* spellbook)
{
return 0;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static boolean
dospellmenu(
const char *prompt,
return FALSE;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static int
percent_success(int spell)
{
}
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* to support '#stats' wizard-mode command */
void
timer_stats(const char* hdrfmt, char *hdrbuf, long *count, long *size)
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* reset all timers that are marked for reseting */
void
relink_timers(boolean ghostly)
} while (c != '\n' && c != EOF);
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static void
readentry(FILE* rfile, struct toptenentry* tt)
{
#endif
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
#ifdef XLOGFILE
/* as tab is never used in eg. g.plname or death, no need to mangle those. */
topten_print(linebuf);
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* so>0: standout line; so=0: ordinary line */
static void
outentry(int rank, struct toptenentry* t1, boolean so)
topten_print(linebuf);
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static int
score_wanted(
boolean current_ver,
status_activefields[fieldidx] = enable;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
/* call once for each field, then call with BL_FLUSH to output the result */
void
genl_status_update(int idx, genericptr_t ptr, int chg UNUSED,
putmixed(WIN_STATUS, 0, newbot2); /* putmixed() due to GOLD glyph */
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static struct window_procs dumplog_windowprocs_backup;
static FILE *dumplog_file;
#define MAXWISHTRY 5
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static void
wishcmdassist(int triesleft)
{
destroy_nhwindow(win);
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
void
makewish(void)
{
CFLAGS+=-Wimplicit-int
CFLAGS+=-Wmissing-declarations
CFLAGS+=-Wmissing-prototypes
+CFLAGS+=-Wformat-nonliteral
ifeq "$(CCISCLANG)" ""
#gcc-specific here
CFLAGS+=-Wmissing-parameter-type
# 4244 conversion possible loss of data
# 4245 conversion from 'char' to 'uchar', signed/unsigned mismatch
# 4100 unreferenced formal parameter
+# 4774 format string is not a string literal (default is off at W4)
+#
#cflags = $(cflags:-W3=-W4) -wd4131 -wd4820 -wd4706 -wd4244 -wd4245 -wd4100
-cflags = $(cflags:-W3=-W4) -wd4820 -wd4706 -wd4244 -wd4245 -wd4100 -wd4310
+cflags = $(cflags:-W3=-W4) -wd4820 -wd4706 -wd4244 -wd4245 -wd4100 -wd4310 -w44774
!ENDIF
#More verbose warning output options below
static char namebuf[1000];
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static char *
name_file(const char* template, const char* tag)
{
return rv;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static boolean debug = FALSE;
static FILE *inputfp;
return;
}
+DISABLE_WARNING_FORMAT_NONLITERAL
+
void
do_rumors(void)
{
exit(EXIT_FAILURE);
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
void
do_date(void)
{
static int changed_fields = 0;
+DISABLE_WARNING_FORMAT_NONLITERAL
+
void
curses_status_update(int fldidx, genericptr_t ptr, int chg UNUSED, int percent,
int color_and_attr, unsigned long *colormasks)
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static void
draw_status(void)
{
extern const struct conditions_t conditions[]; /* botl.c */
extern int cond_idx[CONDITION_COUNT];
+DISABLE_WARNING_FORMAT_NONLITERAL
+
static void
curs_stat_conds(
int vert_cond, /* 0 => horizontal, 1 => vertical */
return;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
/* status_update() sets up values for horizontal status; do vertical */
void
curs_vert_status_vals(int win_width)
* See doc/window.doc for more details.
*/
+DISABLE_WARNING_FORMAT_NONLITERAL
+
void
tty_status_update(int fldidx, genericptr_t ptr, int chg UNUSED, int percent,
int color, unsigned long *colormasks)
return;
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
static int
make_things_fit(boolean force_update)
{
longs telling which conditions should be displayed in each
color and attriubte.
*/
+
+DISABLE_WARNING_FORMAT_NONLITERAL
+
void
mswin_status_update(int idx, genericptr_t ptr, int chg, int percent, int color, unsigned long *condmasks)
{
}
}
+RESTORE_WARNING_FORMAT_NONLITERAL
+
</ItemDefinitionGroup>\r
<ItemDefinitionGroup>\r
<ClCompile>\r
- <AdditionalOptions>/Gs /Oi- %(AdditionalOptions)</AdditionalOptions>\r
+ <AdditionalOptions>/Gs /Oi- /w44774 %(AdditionalOptions)</AdditionalOptions>\r
<Optimization>Disabled</Optimization>\r
<InlineFunctionExpansion>Default</InlineFunctionExpansion>\r
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
</ItemDefinitionGroup>\r
<ItemGroup>\r
<ClCompile Include="@(Lua)">\r
- <DisableSpecificWarnings>4701;4702;4244;4310</DisableSpecificWarnings>\r
+ <DisableSpecificWarnings>4701;4702;4244;4310;4774</DisableSpecificWarnings>\r
</ClCompile>\r
<ClCompile Include="$(SrcDir)allmain.c" />\r
<ClCompile Include="$(SrcDir)alloc.c" />\r
</PropertyGroup>\r
<ItemDefinitionGroup>\r
<ClCompile>\r
- <AdditionalOptions>/Gs /Oi- %(AdditionalOptions)</AdditionalOptions>\r
+ <AdditionalOptions>/Gs /Oi- /w44774 %(AdditionalOptions)</AdditionalOptions>\r
<Optimization>Disabled</Optimization>\r
<OmitFramePointers>true</OmitFramePointers>\r
<AdditionalIncludeDirectories>$(WinWin32Dir);$(IncDir);$(SysWinntDir);$(SysShareDir);$(WinShareDir);$(LuaDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
</ItemDefinitionGroup>\r
<ItemGroup>\r
<ClCompile Include="@(Lua)">\r
- <DisableSpecificWarnings>4701;4702;4244;4310</DisableSpecificWarnings>\r
+ <DisableSpecificWarnings>4701;4702;4244;4310;4774</DisableSpecificWarnings>\r
</ClCompile>\r
<ClCompile Include="$(SrcDir)allmain.c" />\r
<ClCompile Include="$(SrcDir)alloc.c" />\r