more static analyzer adjustments

This commit is contained in:
nhmall
2025-05-30 14:01:41 -04:00
parent 1bf92496f4
commit e365b5b18f
6 changed files with 70 additions and 46 deletions

View File

@@ -981,7 +981,7 @@ enter_explore_mode(void)
void
makemap_prepost(boolean pre, boolean wiztower)
{
NHFILE tmpnhfp;
NHFILE *tmpnhfp;
struct monst *mtmp;
if (pre) {
@@ -1029,9 +1029,9 @@ makemap_prepost(boolean pre, boolean wiztower)
dobjsfree();
/* discard current level; "saving" is used to release dynamic data */
zero_nhfile(&tmpnhfp); /* also sets fd to -1 as desired */
tmpnhfp.mode = FREEING;
savelev(&tmpnhfp, ledger_no(&u.uz));
tmpnhfp = get_freeing_nhfile();
savelev(tmpnhfp, ledger_no(&u.uz));
close_nhfile(tmpnhfp);
} else {
vision_reset();
gv.vision_full_recalc = 1;

View File

@@ -458,23 +458,35 @@ static const int bei = 1;
#define IS_BIGENDIAN() ( (*(char*)&bei) == 0 )
void
zero_nhfile(NHFILE *nhfp)
init_nhfile(NHFILE *nhfp)
{
if (nhfp->structlevel) {
if (nhfp->fd != -1) {
impossible("Warning - Unclosed structlevel file being reinitialized");
(void) nhclose(nhfp->fd);
}
} else if (nhfp->fpdef) {
if (nhfp->fpdef) {
impossible("Warning - Unclosed fieldlevel file being reinitialized");
(void) fclose(nhfp->fpdef);
}
}
nhfp->fd = -1;
nhfp->fpdef = (FILE *) 0;
nhfp->mode = COUNTING;
nhfp->structlevel = TRUE;
nhfp->fieldlevel = FALSE;
nhfp->addinfo = FALSE;
nhfp->bendian = IS_BIGENDIAN();
nhfp->fpdef = (FILE *) 0;
nhfp->fplog = (FILE *) 0;
nhfp->fpdebug = (FILE *) 0;
nhfp->rcount = nhfp->wcount = 0;
nhfp->eof = FALSE;
nhfp->fnidx = 0;
nhfp->style.deflt = FALSE;
nhfp->style.binary = TRUE;
nhfp->nhfpconvert = 0;
nhfp->style.deflt = FALSE;
nhfp->style.binary = TRUE;
nhfp->nhfpconvert = 0;
}
#ifndef SFCTOOL
@@ -483,9 +495,10 @@ staticfn
NHFILE *
new_nhfile(void)
{
NHFILE *nhfp = (NHFILE *) alloc(sizeof(NHFILE));
NHFILE *nhfp = (NHFILE *) alloc(sizeof *nhfp);
zero_nhfile(nhfp);
memset((genericptr_t) nhfp, 0, sizeof *nhfp);
init_nhfile(nhfp);
return nhfp;
}
@@ -496,7 +509,7 @@ void
free_nhfile(NHFILE *nhfp)
{
if (nhfp) {
zero_nhfile(nhfp);
init_nhfile(nhfp);
free(nhfp);
}
}
@@ -514,7 +527,7 @@ close_nhfile(NHFILE *nhfp)
(void) fclose(nhfp->fplog);
if (nhfp->fpdebug)
(void) fclose(nhfp->fpdebug);
zero_nhfile(nhfp);
init_nhfile(nhfp);
free_nhfile(nhfp);
}
@@ -559,7 +572,7 @@ viable_nhfile(NHFILE *nhfp)
if (nhfp->fpdebug)
(void) fclose(nhfp->fpdebug);
}
zero_nhfile(nhfp);
init_nhfile(nhfp);
free_nhfile(nhfp);
nhfp = (NHFILE *) 0;
}
@@ -1254,6 +1267,18 @@ restore_saved_game(void)
return nhfp;
}
NHFILE *
get_freeing_nhfile(void)
{
NHFILE *nhfp = (NHFILE *) 0;
nhfp = new_nhfile(); /* also sets fd to -1 */
if (nhfp) {
nhfp->mode = FREEING;
}
return nhfp;
}
/* called if there is no save file for current character */
int
check_panic_save(void)

View File

@@ -806,15 +806,11 @@ dorecover(NHFILE *nhfp)
*/
getlev(nhfp, 0, (xint8) 0);
if (!restgamestate(nhfp)) {
NHFILE tnhfp;
NHFILE *tnhfp = get_freeing_nhfile();
display_nhwindow(WIN_MESSAGE, TRUE);
zero_nhfile(&tnhfp);
tnhfp.mode = FREEING;
tnhfp.fd = -1;
savelev(&tnhfp, 0); /* discard current level */
/* no need for close_nhfile(&tnhfp), which
is not really affiliated with an open file */
savelev(tnhfp, 0); /* discard current level */
close_nhfile(tnhfp);
close_nhfile(nhfp);
(void) delete_savefile();
u.usteed_mid = u.ustuck_mid = 0;

View File

@@ -1037,13 +1037,12 @@ void
free_dungeons(void)
{
#ifdef FREE_ALL_MEMORY
NHFILE tnhfp;
NHFILE *tnhfp = get_freeing_nhfile();
zero_nhfile(&tnhfp); /* also sets fd to -1 */
tnhfp.mode = FREEING;
savelevchn(&tnhfp);
save_dungeon(&tnhfp, FALSE, TRUE);
savelevchn(tnhfp);
save_dungeon(tnhfp, FALSE, TRUE);
free_luathemes(all_themes);
close_nhfile(tnhfp);
#endif
return;
}
@@ -1054,13 +1053,11 @@ extern int options_set_window_colors_flag; /* options.c */
void
freedynamicdata(void)
{
NHFILE tnhfp;
NHFILE *tnhfp = get_freeing_nhfile();
#if defined(UNIX) && defined(MAIL)
free_maildata();
#endif
zero_nhfile(&tnhfp); /* also sets fd to -1 */
tnhfp.mode = FREEING;
free_menu_coloring();
free_invbuf(); /* let_to_name (invent.c) */
free_youbuf(); /* You_buf,&c (pline.c) */
@@ -1069,18 +1066,18 @@ freedynamicdata(void)
tmp_at(DISP_FREEMEM, 0); /* temporary display effects */
purge_all_custom_entries();
#ifdef FREE_ALL_MEMORY
#define free_current_level() savelev(&tnhfp, -1)
#define freeobjchn(X) (saveobjchn(&tnhfp, &X), X = 0)
#define freemonchn(X) (savemonchn(&tnhfp, X), X = 0)
#define freefruitchn() savefruitchn(&tnhfp)
#define freenames() savenames(&tnhfp)
#define free_killers() save_killers(&tnhfp)
#define free_oracles() save_oracles(&tnhfp)
#define free_waterlevel() save_waterlevel(&tnhfp)
#define free_timers(R) save_timers(&tnhfp, R)
#define free_light_sources(R) save_light_sources(&tnhfp, R)
#define free_current_level() savelev(tnhfp, -1)
#define freeobjchn(X) (saveobjchn(tnhfp, &X), X = 0)
#define freemonchn(X) (savemonchn(tnhfp, X), X = 0)
#define freefruitchn() savefruitchn(tnhfp)
#define freenames() savenames(tnhfp)
#define free_killers() save_killers(tnhfp)
#define free_oracles() save_oracles(tnhfp)
#define free_waterlevel() save_waterlevel(tnhfp)
#define free_timers(R) save_timers(tnhfp, R)
#define free_light_sources(R) save_light_sources(tnhfp, R)
#define free_animals() mon_animal_list(FALSE)
#define discard_gamelog() save_gamelog(&tnhfp);
#define discard_gamelog() save_gamelog(tnhfp);
/* move-specific data */
dmonsfree(); /* release dead monsters */
@@ -1155,6 +1152,11 @@ freedynamicdata(void)
if (glyphid_cache_status())
free_glyphid_cache();
if (tnhfp) {
close_nhfile(tnhfp);
tnhfp = 0;
}
/* last, because it frees data that might be used by panic() to provide
feedback to the user; conceivably other freeing might trigger panic */
sysopt_release(); /* SYSCF strings */