Commit Graph

9476 Commits

Author SHA1 Message Date
nhmall
d6f036f329 static analyzer bit in timeout.c
src/timeout.c(2033): warning: Reading invalid data from 'gl.level.locations'.

Analyzer couldn't tell that isok(x, y) had validated x and y to be
safe indexes into gl.level.locations[x][y].

Code it a bit differently, so that the static analyzer becomes perfectly
aware that the indexes are, indeed, in range.
2023-12-22 17:18:40 -05:00
nhmall
fcc91cec94 static analyzer bit in uhitm.c
src/uhitm.c(1172): warning: Reading invalid data from 'mons'.

Analyzer wasn't happy with the index into mons[] array only
being validated by '!= -1'.

Update the check for the index to include the full array
index range, including ensuring that it is also '< NUMMONS'.
2023-12-22 16:30:24 -05:00
nhmall
51bf9dd76d comment typo 2023-12-22 14:57:50 -05:00
nhmall
de8d1ef0d1 Merge branch 'NetHack-3.7' of https://rodney.nethack.org:20040/git/NHsource into NetHack-3.7 2023-12-22 14:38:33 -05:00
nhmall
746d00d170 assess wizard.c static functions for nonnull
No nonnull return attributes were appropriate for wizard.c section
of include/extern.h either.
2023-12-22 14:35:59 -05:00
nhmall
92250aa15d assess worm.c static functions for nonnull 2023-12-22 13:18:04 -05:00
nhmall
741d2929b4 assess worn.c static functions for nonnull 2023-12-22 13:10:39 -05:00
nhmall
2542f9bada follow-up correction 2023-12-22 11:42:19 -05:00
nhmall
c1fc52e644 assess write.c static functions for nonnull 2023-12-22 10:38:38 -05:00
nhmall
10e7f61380 assess zap.c static functions for nonnull 2023-12-22 10:34:15 -05:00
PatR
0ab44ba89c pager.c: flagging pointer args non vs non-null
Yesterday I said that I'd done all of pager.c and part of objnam.c,
but I was talking about the prototypes in extern.h.  This does more
of the same, this time for the local prototypes in pager.c so "all of
pager.c" should be accurate now.
2023-12-21 09:47:52 -08:00
Pasi Kallinen
5b5e547791 Restful sleep gives a warning message 2023-12-21 09:41:47 +02:00
nhmall
c3ce08b794 NO_NONNULLS -> NO_NNARGS
I find:
    extern char *an(const char *) NONNULL NO_NNARGS;

slightly better than this:
    extern char *an(const char *) NONNULL NO_NONNULLS;
2023-12-20 22:26:16 -05:00
PatR
a696cb8d90 some NONNULLs
Update the prototypes of some functions which return a pointer that
will never be NULL.  Only covers pager.c and part of objnam.c.
2023-12-20 15:55:21 -08:00
nhmall
07ef4583ce functions passed a chain explicitly NO_NONNULLS
Some functions are passed an obj or monst chain,
and  the callers typically don't check them
against 0, so mark them explicitly as NO_NONNULLS

(NO_NONNULLS expands to nothing, but it flags that
some null arg analysis has been done)
2023-12-20 18:48:50 -05:00
nhmall
0dafde4079 more nonnull follow-up 2023-12-20 15:53:51 -05:00
Pasi Kallinen
488afffcd7 Fix NONNULL for hitting bare handed 2023-12-20 20:09:50 +02:00
PatR
0713b91beb recalc_mapseen() followup
Update several places where lazy lastseentyp[] might be an issue.

I think it isn't updated in a timely fashion when newsym() shows
a spot covered by an object or trap, but didn't manage to find any
cases where that caused a problem.  This is more in the nature of
a precaution.
2023-12-20 03:17:29 -08:00
Pasi Kallinen
60dc6343e4 Moving monsters disturb buried zombies 2023-12-20 11:17:23 +02:00
Pasi Kallinen
c0fdb2e8c4 Level temperature affects monster generation
Hot levels generate more fire-resistant monsters, cold
levels cold-resistant ones.
2023-12-18 13:43:41 +02:00
Pasi Kallinen
e4026d55fb Lazy evaluation of overview info
Callgrind showed recalc_mapseen was three times more expensive (in terms
of instructions read) than anything else in our codebase.  It was being
called in every vision change, re-evaluating the last seen map terrain
type for every map location in sight.

Remove updating the lastseen info in the vision code, and make a small
change so newsym() uses update_lastseentyp.

From my short tests, this seems to work correctly ...
2023-12-18 10:53:18 +02:00
nhmall
e81c599e9a Revert a single file from commit 1bb854430 2023-12-17 16:32:23 -05:00
PatR
1bb8544303 even more mklev.c
This should eliminate the last analyzer complaint about maybe using
a Null pointer.  I didn't notice this one yesterday.
2023-12-17 11:02:30 -08:00
Pasi Kallinen
ea1fdc066a Split lastseentyp updating 2023-12-17 15:43:49 +02:00
Pasi Kallinen
9b8272b57f Split counting mapseen features from lastseentyp 2023-12-17 15:21:37 +02:00
nhmall
3bf2f0daee Revert "allow readobjnam arg to be nonnull"
This reverts commit 10f29a9760.
2023-12-17 07:20:35 -05:00
Mika Kuoppala
e6c4838161 sp_lvl: fix memory leak on lspo_region
If tutorial is entered, we get following leak on exit:

=================================================================
==81358==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 96 byte(s) in 3 object(s) allocated from:
    #0 0x7f6996edefdf in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
        #1 0x5601c255bcbb in alloc /home/miku/src/NetHack/src/alloc.c:71

Indirect leak of 5064 byte(s) in 3 object(s) allocated from:
    #0 0x7f6996edefdf in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
        #1 0x5601c255be1e in alloc /home/miku/src/NetHack/src/alloc.c:71
	    #2 0x5601c255be1e in dupstr /home/miku/src/NetHack/src/alloc.c:236

SUMMARY: AddressSanitizer: 5160 byte(s) leaked in 6 allocation(s).

Fix this by freeing the cloned selection before returning.
2023-12-17 11:47:26 +02:00
Pasi Kallinen
a2aa4edd51 Allow SIGINT (Ctrl-C) to stop the fuzzer 2023-12-17 11:28:13 +02:00
PatR
3d27d8e998 more mklev.c
This got accidentally omitted from the previous patch.  The
clear_level_structures() prototype is in extern.h.
2023-12-16 18:43:39 -08:00
PatR
f2671fd1a7 mklev.c: somexyspace() revisited
Replace one recenly added 'croom' test with assert(croom != NULL);
keep the other one.  Mark fill_ordinary_room() as requiring that its
first argument be non-Null.  Check for malformed subroom data before
calling it.

Plus miscellaneous reformatting.
2023-12-16 18:38:29 -08:00
nhmall
10f29a9760 allow readobjnam arg to be nonnull
Have it key on &do_random_str instead of NULL,
and modify makewish() in zap.c for the new protocol.
2023-12-16 19:30:34 -05:00
nhmall
3e83d23b19 skip calling somexyspace() if mkroom ptr is NULL 2023-12-16 18:30:35 -05:00
Pasi Kallinen
0a8f919ff3 Make monsters not use camera when hero resists blindness 2023-12-16 23:34:16 +02:00
PatR
ae80e7db47 fix analyzer complaints about Knox level
Fix some of the extreme verbosity for null vs non-null triggered
by mklev.c.  dungeon_branch() never returns Null.

'#include <assert.h>' should probably be moved out of multiple .c
files and into cstd.h or some such but this doesn't do that.
2023-12-16 13:26:17 -08:00
nhmall
caa8aa7f60 reinstate obj guard on _see_with_infrared macro
Checking the callers:
newsym() the use of see_with_infrared() is guarded by
    } else if ((mon = m_at(x, y)) != 0 [...]

do_mgivenname() the use of see_with_infrared is guarded by !mtmp:
        && (!mtmp
            || (!sensemon(mtmp)
                && (!(cansee(cx, cy) || see_with_infrared(mtmp))

howmonseen(mon) dereferences mon in other places, so it would
    segfault if mon were NULL; howmonseen has NONNULLARG1.
2023-12-16 12:55:09 -05:00
nhmall
294ce9b59d reinstate removal of mon guard from is_safemon()
callers were checked:
domove_attackmon_at(mtmp, x, y, displaceu) has mtmp declared nonnull;
    there are dereferences of mtmp in the first line of code in
    the function.

In domove_core():
    The 1st occurrence of is_safemon(mtmp) is guarded by if (mtmp) { }.
    The 2nd occurrence of is_safemon(mtmp) is inside an if (mtmp) { } block.
    The 3rd occurrence of is_safemon(mtmp) was just remediated by 987be7e8.

In lookaround():
    The only occurrence of is_safemon(mtmp) is inside an
        if ((mtmp = m_at(x, y)) != 0 [...] { } block.

In do_attack(mtmp), in uhitm.c:
    The parameter is declared NONNULLARG1, and the 1st line of
    code contains a dereference with mtmp->data, which would
    segfault if mtmp were NULL.
2023-12-16 12:37:49 -05:00
nhmall
987be7e8e5 a pair of domove_core() blocks
Following line 2425 of hack.c, in domove_core():
    mtmp = m_at(x, y);
mtmp can be null.

There were two if blocks following that, both of which
only make sense when mtmp is not null.

One of them was explicitly checking for mtmp being non-null,
and the other was avoiding catastrophe by relying on a
hidden check buried within an _is_safepet(mon) macro.

Place both of those blocks into an
    if (mtmp) { }
block.

99% of the diff is just indentation.
2023-12-16 11:38:55 -05:00
nhmall
c5a5b55c15 nonnull for some static functions during recent analysis 2023-12-16 10:51:59 -05:00
nhmall
516d428c40 update commented-out macro in artifact.c 2023-12-16 10:32:25 -05:00
nhmall
9aa87aee05 static analyzer bit
Make it really obvious to the analyzer that we're only
calling canseemon(mcarry) when mcarry is not null.
2023-12-16 10:04:13 -05:00
nhmall
3eed55471b another artifact.c tweak
Use 'AFTER_LAST_ARTIFACT instead of SIZE(artilist)
2023-12-16 08:34:09 -05:00
nhmall
70dcab833d remove obj guard from stone_missile(obj) macro
Checking the callers:
toss_up() would have segfaulted prior to use of stone_missile() if obj were NULL.
thitu() now has a guard prior to use of stone_missile()
ohitmon() would have crashed from earlier dereference otmp->dknown if it were NULL,
   otmp arg is declared nonnull
thitm() now has a guard prior to use of stone_missile().
hmon_hitmon_do_hit() null obj takes a different code path than the code path
    using stone_missile(); comment asserting that added
2023-12-16 07:58:44 -05:00
nhmall
603fd18a1e update commented-out macro in artifact.c 2023-12-16 06:39:26 -05:00
nhmall
2138841e63 artifact.c tweak
get_artifact() returns the address of the existing unused first
element of artilist[] as the distinct address to check for
&artilist[ART_NONARTIFACT]
2023-12-16 06:16:51 -05:00
SHIRAKATA Kentaro
358278938a add sanity check on choose_classes_menu()
If class_list contains an illegal char for mon/obj class (even if it should not happen), it might cause out-of-bound access.
2023-12-16 14:49:05 +09:00
nhmall
6da27c7013 rework artifact.c to not use null pointers at all 2023-12-15 23:52:57 -05:00
nhmall
c0acf2f89f add artifact_nums to nethack --dumpenums 2023-12-15 19:59:26 -05:00
PatR
bf5b4c40e2 avoid 'show_transcient_light()' complaint
The static analyzer complained about use of 'obj' maybe being Null
when used in an impossible warning, but that warning will never
appear for the case where obj is actually Null.  Add an assert()
that should let it figure that out, and move the impossible check
inside the 'else' clause where the check matters.  (Either of those
by itself ought to be adequate to pacify the analyzer.)
2023-12-15 14:52:53 -08:00
Pasi Kallinen
3c421da746 Previous hero rising as undead in bones retains intrinsics 2023-12-15 16:03:26 +02:00
nhmall
b368d4fbe9 revert a nonnull instance that deviated from the stated rules 2023-12-15 00:52:15 -05:00