pacify static analyzer - dog.c
This is similar to the earlier potential fix that I didn't like,
but I think think one is better.
The analyzer claimed that 'fptr' might be Null inside the switch
case for
|struct permonst *fptr = NULL;
|if (obj->otyp == CORPSE || ...) fptr = &mons[obj->corpsenm];
|switch (obj->otyp) { case CORPSE: ... /* dereference 'fptr' */ }
even though it will always have a non-Null value for otyp==CORPSE.
Make the assignment of 'fptr' unconditional. mons[NUMMONS] is
valid and won't match any actual monster. In this case it will
only be used when initializing fptr, never when fptr gets used.
This commit is contained in:
@@ -898,22 +898,25 @@ discard_migrations(void)
|
|||||||
int
|
int
|
||||||
dogfood(struct monst *mon, struct obj *obj)
|
dogfood(struct monst *mon, struct obj *obj)
|
||||||
{
|
{
|
||||||
struct permonst *mptr = mon->data, *fptr = 0;
|
struct permonst *mptr = mon->data, *fptr;
|
||||||
boolean carni = carnivorous(mptr), herbi = herbivorous(mptr),
|
boolean carni = carnivorous(mptr), herbi = herbivorous(mptr),
|
||||||
starving, mblind;
|
starving, mblind;
|
||||||
|
int fx;
|
||||||
|
|
||||||
if (is_quest_artifact(obj) || obj_resists(obj, 0, 95))
|
if (is_quest_artifact(obj) || obj_resists(obj, 0, 95))
|
||||||
return obj->cursed ? TABU : APPORT;
|
return obj->cursed ? TABU : APPORT;
|
||||||
|
|
||||||
switch (obj->oclass) {
|
switch (obj->oclass) {
|
||||||
case FOOD_CLASS:
|
case FOOD_CLASS:
|
||||||
if (obj->otyp == CORPSE || obj->otyp == TIN || obj->otyp == EGG)
|
fx = (obj->otyp == CORPSE || obj->otyp == TIN || obj->otyp == EGG)
|
||||||
fptr = &mons[obj->corpsenm];
|
? obj->corpsenm
|
||||||
|
: NUMMONS; /* valid mons[mndx] to pacify static analyzer */
|
||||||
|
fptr = &mons[fx];
|
||||||
|
|
||||||
if (obj->otyp == CORPSE && is_rider(fptr))
|
if (obj->otyp == CORPSE && is_rider(fptr))
|
||||||
return TABU;
|
return TABU;
|
||||||
if ((obj->otyp == CORPSE || obj->otyp == EGG) && touch_petrifies(fptr)
|
if ((obj->otyp == CORPSE || obj->otyp == EGG)
|
||||||
&& !resists_ston(mon))
|
&& touch_petrifies(fptr) && !resists_ston(mon))
|
||||||
return POISON;
|
return POISON;
|
||||||
if (obj->otyp == LUMP_OF_ROYAL_JELLY
|
if (obj->otyp == LUMP_OF_ROYAL_JELLY
|
||||||
&& mon->data == &mons[PM_KILLER_BEE]) {
|
&& mon->data == &mons[PM_KILLER_BEE]) {
|
||||||
@@ -938,12 +941,9 @@ dogfood(struct monst *mon, struct obj *obj)
|
|||||||
if (mptr == &mons[PM_GHOUL]) {
|
if (mptr == &mons[PM_GHOUL]) {
|
||||||
if (obj->otyp == CORPSE)
|
if (obj->otyp == CORPSE)
|
||||||
return (peek_at_iced_corpse_age(obj) + 50L <= gm.moves
|
return (peek_at_iced_corpse_age(obj) + 50L <= gm.moves
|
||||||
&& fptr != &mons[PM_LIZARD]
|
&& !(fx == PM_LIZARD || fx == PM_LICHEN)) ? DOGFOOD
|
||||||
&& fptr != &mons[PM_LICHEN])
|
: (starving && !vegan(fptr)) ? ACCFOOD
|
||||||
? DOGFOOD
|
: POISON;
|
||||||
: (starving && !vegan(fptr))
|
|
||||||
? ACCFOOD
|
|
||||||
: POISON;
|
|
||||||
if (obj->otyp == EGG)
|
if (obj->otyp == EGG)
|
||||||
return stale_egg(obj) ? CADAVER : starving ? ACCFOOD : POISON;
|
return stale_egg(obj) ? CADAVER : starving ? ACCFOOD : POISON;
|
||||||
return TABU;
|
return TABU;
|
||||||
@@ -960,7 +960,7 @@ dogfood(struct monst *mon, struct obj *obj)
|
|||||||
return carni ? CADAVER : MANFOOD;
|
return carni ? CADAVER : MANFOOD;
|
||||||
case CORPSE:
|
case CORPSE:
|
||||||
if ((peek_at_iced_corpse_age(obj) + 50L <= gm.moves
|
if ((peek_at_iced_corpse_age(obj) + 50L <= gm.moves
|
||||||
&& obj->corpsenm != PM_LIZARD && obj->corpsenm != PM_LICHEN
|
&& !(fx == PM_LIZARD || fx == PM_LICHEN)
|
||||||
&& mptr->mlet != S_FUNGUS)
|
&& mptr->mlet != S_FUNGUS)
|
||||||
|| (acidic(fptr) && !resists_acid(mon))
|
|| (acidic(fptr) && !resists_acid(mon))
|
||||||
|| (poisonous(fptr) && !resists_poison(mon)))
|
|| (poisonous(fptr) && !resists_poison(mon)))
|
||||||
@@ -983,11 +983,9 @@ dogfood(struct monst *mon, struct obj *obj)
|
|||||||
/* turning into slime is preferable to starvation */
|
/* turning into slime is preferable to starvation */
|
||||||
return (starving || slimeproof(mon->data)) ? ACCFOOD : POISON;
|
return (starving || slimeproof(mon->data)) ? ACCFOOD : POISON;
|
||||||
case CLOVE_OF_GARLIC:
|
case CLOVE_OF_GARLIC:
|
||||||
return (is_undead(mptr) || is_vampshifter(mon))
|
return (is_undead(mptr) || is_vampshifter(mon)) ? TABU
|
||||||
? TABU
|
: (herbi || starving) ? ACCFOOD
|
||||||
: (herbi || starving)
|
: MANFOOD;
|
||||||
? ACCFOOD
|
|
||||||
: MANFOOD;
|
|
||||||
case TIN:
|
case TIN:
|
||||||
return metallivorous(mptr) ? ACCFOOD : MANFOOD;
|
return metallivorous(mptr) ? ACCFOOD : MANFOOD;
|
||||||
case APPLE:
|
case APPLE:
|
||||||
@@ -995,11 +993,11 @@ dogfood(struct monst *mon, struct obj *obj)
|
|||||||
case CARROT:
|
case CARROT:
|
||||||
return (herbi || mblind) ? DOGFOOD : starving ? ACCFOOD : MANFOOD;
|
return (herbi || mblind) ? DOGFOOD : starving ? ACCFOOD : MANFOOD;
|
||||||
case BANANA:
|
case BANANA:
|
||||||
return (mptr->mlet == S_YETI && herbi)
|
/* monkeys and apes (tameable) plus sasquatch prefer these,
|
||||||
? DOGFOOD /* for monkey and ape (tameable), sasquatch */
|
yetis will only will only eat them if starving */
|
||||||
: (herbi || starving)
|
return (mptr->mlet == S_YETI && herbi) ? DOGFOOD
|
||||||
? ACCFOOD
|
: (herbi || starving) ? ACCFOOD
|
||||||
: MANFOOD;
|
: MANFOOD;
|
||||||
default:
|
default:
|
||||||
if (starving)
|
if (starving)
|
||||||
return ACCFOOD;
|
return ACCFOOD;
|
||||||
|
|||||||
Reference in New Issue
Block a user