maybe pacify static analyzer - eat.c
The complaint is that victual.canchoke might be used without having been initialized. I'm fairly sure that that isn't correct but get dizzy trying to trace through the eating code. This might improve the situation, or maybe not.
This commit is contained in:
64
src/eat.c
64
src/eat.c
@@ -71,6 +71,8 @@ const char *const hu_stat[] = {
|
|||||||
"Fainting", "Fainted ", "Starved "
|
"Fainting", "Fainted ", "Starved "
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct victual_info zero_victual;
|
||||||
|
|
||||||
/* used by getobj() callback routines eat_ok()/offer_ok()/tin_ok() to
|
/* used by getobj() callback routines eat_ok()/offer_ok()/tin_ok() to
|
||||||
indicate whether player was given an opportunity to eat or offer or
|
indicate whether player was given an opportunity to eat or offer or
|
||||||
tin an item on the floor and declined, in order to insert "else"
|
tin an item on the floor and declined, in order to insert "else"
|
||||||
@@ -285,13 +287,14 @@ static void
|
|||||||
recalc_wt(void)
|
recalc_wt(void)
|
||||||
{
|
{
|
||||||
struct obj *piece = gc.context.victual.piece;
|
struct obj *piece = gc.context.victual.piece;
|
||||||
|
|
||||||
if (!piece) {
|
if (!piece) {
|
||||||
impossible("recalc_wt without piece");
|
impossible("recalc_wt without piece");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
debugpline1("Old weight = %d", piece->owt);
|
debugpline1("Old weight = %d", piece->owt);
|
||||||
debugpline2("Used time = %d, Req'd time = %d", gc.context.victual.usedtime,
|
debugpline2("Used time = %d, Req'd time = %d",
|
||||||
gc.context.victual.reqtime);
|
gc.context.victual.usedtime, gc.context.victual.reqtime);
|
||||||
piece->owt = weight(piece);
|
piece->owt = weight(piece);
|
||||||
debugpline1("New weight = %d", piece->owt);
|
debugpline1("New weight = %d", piece->owt);
|
||||||
}
|
}
|
||||||
@@ -374,10 +377,9 @@ touchfood(struct obj *otmp)
|
|||||||
void
|
void
|
||||||
food_disappears(struct obj *obj)
|
food_disappears(struct obj *obj)
|
||||||
{
|
{
|
||||||
if (obj == gc.context.victual.piece) {
|
if (obj == gc.context.victual.piece)
|
||||||
gc.context.victual.piece = (struct obj *) 0;
|
gc.context.victual = zero_victual; /* vicutal.piece = 0, .o_id = 0 */
|
||||||
gc.context.victual.o_id = 0;
|
|
||||||
}
|
|
||||||
if (obj->timed)
|
if (obj->timed)
|
||||||
obj_stop_timers(obj);
|
obj_stop_timers(obj);
|
||||||
}
|
}
|
||||||
@@ -409,8 +411,10 @@ do_reset_eat(void)
|
|||||||
gc.context.victual.o_id = gc.context.victual.piece->o_id;
|
gc.context.victual.o_id = gc.context.victual.piece->o_id;
|
||||||
recalc_wt();
|
recalc_wt();
|
||||||
}
|
}
|
||||||
gc.context.victual.fullwarn = gc.context.victual.eating =
|
gc.context.victual.fullwarn
|
||||||
gc.context.victual.doreset = FALSE;
|
= gc.context.victual.eating
|
||||||
|
= gc.context.victual.doreset
|
||||||
|
= FALSE;
|
||||||
/* Do not set canchoke to FALSE; if we continue eating the same object
|
/* Do not set canchoke to FALSE; if we continue eating the same object
|
||||||
* we need to know if canchoke was set when they started eating it the
|
* we need to know if canchoke was set when they started eating it the
|
||||||
* previous time. And if we don't continue eating the same object
|
* previous time. And if we don't continue eating the same object
|
||||||
@@ -527,10 +531,8 @@ done_eating(boolean message)
|
|||||||
useup(piece);
|
useup(piece);
|
||||||
else
|
else
|
||||||
useupf(piece, 1L);
|
useupf(piece, 1L);
|
||||||
gc.context.victual.piece = (struct obj *) 0;
|
|
||||||
gc.context.victual.o_id = 0;
|
gc.context.victual = zero_victual; /* vicutal.piece = 0, .o_id = 0 */
|
||||||
gc.context.victual.fullwarn = gc.context.victual.eating =
|
|
||||||
gc.context.victual.doreset = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -793,10 +795,8 @@ cprefx(register int pm)
|
|||||||
to normal play though because bones creation empties them */
|
to normal play though because bones creation empties them */
|
||||||
if (gc.context.victual.piece /* Null for tins */
|
if (gc.context.victual.piece /* Null for tins */
|
||||||
&& gc.context.victual.piece->otyp == CORPSE /* paranoia */
|
&& gc.context.victual.piece->otyp == CORPSE /* paranoia */
|
||||||
&& revive_corpse(gc.context.victual.piece)) {
|
&& revive_corpse(gc.context.victual.piece))
|
||||||
gc.context.victual.piece = (struct obj *) 0;
|
gc.context.victual = zero_victual; /* vicutal.piece=0, .o_id=0 */
|
||||||
gc.context.victual.o_id = 0;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case PM_GREEN_SLIME:
|
case PM_GREEN_SLIME:
|
||||||
@@ -1500,10 +1500,7 @@ consume_tin(const char *mesg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* in case stop_occupation() was called on previous meal */
|
/* in case stop_occupation() was called on previous meal */
|
||||||
gc.context.victual.piece = (struct obj *) 0;
|
gc.context.victual = zero_victual; /* vicutal.piece = 0, .o_id = 0 */
|
||||||
gc.context.victual.o_id = 0;
|
|
||||||
gc.context.victual.fullwarn = gc.context.victual.eating =
|
|
||||||
gc.context.victual.doreset = FALSE;
|
|
||||||
|
|
||||||
You("consume %s %s.", tintxts[r].txt, mons[mnum].pmnames[NEUTRAL]);
|
You("consume %s %s.", tintxts[r].txt, mons[mnum].pmnames[NEUTRAL]);
|
||||||
|
|
||||||
@@ -2279,9 +2276,8 @@ eatspecial(void)
|
|||||||
set_occupation(eatfood, "eating non-food", 0);
|
set_occupation(eatfood, "eating non-food", 0);
|
||||||
lesshungry(gc.context.victual.nmod);
|
lesshungry(gc.context.victual.nmod);
|
||||||
go.occupation = 0;
|
go.occupation = 0;
|
||||||
gc.context.victual.piece = (struct obj *) 0;
|
gc.context.victual = zero_victual; /* vicutal.piece = 0, .o_id = 0 */
|
||||||
gc.context.victual.o_id = 0;
|
|
||||||
gc.context.victual.eating = 0;
|
|
||||||
if (otmp->oclass == COIN_CLASS) {
|
if (otmp->oclass == COIN_CLASS) {
|
||||||
if (carried(otmp))
|
if (carried(otmp))
|
||||||
useupall(otmp);
|
useupall(otmp);
|
||||||
@@ -2704,9 +2700,8 @@ doeat(void)
|
|||||||
/* Note: gold weighs 1 pt. for each 1000 pieces (see
|
/* Note: gold weighs 1 pt. for each 1000 pieces (see
|
||||||
pickup.c) so gold and non-gold is consistent. */
|
pickup.c) so gold and non-gold is consistent. */
|
||||||
if (otmp->oclass == COIN_CLASS)
|
if (otmp->oclass == COIN_CLASS)
|
||||||
basenutrit = ((otmp->quan > 200000L)
|
basenutrit = ((otmp->quan > 200000L) ? 2000
|
||||||
? 2000
|
: (int) (otmp->quan / 100L));
|
||||||
: (int) (otmp->quan / 100L));
|
|
||||||
else if (otmp->oclass == BALL_CLASS || otmp->oclass == CHAIN_CLASS)
|
else if (otmp->oclass == BALL_CLASS || otmp->oclass == CHAIN_CLASS)
|
||||||
basenutrit = weight(otmp);
|
basenutrit = weight(otmp);
|
||||||
/* oc_nutrition is usually weight anyway */
|
/* oc_nutrition is usually weight anyway */
|
||||||
@@ -2826,8 +2821,7 @@ doeat(void)
|
|||||||
|
|
||||||
if (tmp == 2) {
|
if (tmp == 2) {
|
||||||
/* used up */
|
/* used up */
|
||||||
gc.context.victual.piece = (struct obj *) 0;
|
gc.context.victual = zero_victual; /* vicutal.piece=0, .o_id=0 */
|
||||||
gc.context.victual.o_id = 0;
|
|
||||||
return ECMD_TIME;
|
return ECMD_TIME;
|
||||||
} else if (tmp)
|
} else if (tmp)
|
||||||
dont_start = TRUE;
|
dont_start = TRUE;
|
||||||
@@ -2891,9 +2885,10 @@ doeat(void)
|
|||||||
"before rounddiv: victual.reqtime == %d, oeaten == %d, basenutrit == %d",
|
"before rounddiv: victual.reqtime == %d, oeaten == %d, basenutrit == %d",
|
||||||
gc.context.victual.reqtime, otmp->oeaten, basenutrit);
|
gc.context.victual.reqtime, otmp->oeaten, basenutrit);
|
||||||
|
|
||||||
gc.context.victual.reqtime = (basenutrit == 0) ? 0
|
gc.context.victual.reqtime
|
||||||
: rounddiv(gc.context.victual.reqtime * (long) otmp->oeaten,
|
= (basenutrit == 0) ? 0
|
||||||
basenutrit);
|
: rounddiv(gc.context.victual.reqtime * (long) otmp->oeaten,
|
||||||
|
basenutrit);
|
||||||
|
|
||||||
debugpline1("after rounddiv: victual.reqtime == %d",
|
debugpline1("after rounddiv: victual.reqtime == %d",
|
||||||
gc.context.victual.reqtime);
|
gc.context.victual.reqtime);
|
||||||
@@ -3697,7 +3692,7 @@ consume_oeaten(struct obj *obj, int amt)
|
|||||||
/* mustn't let partly-eaten drop all the way to 0 or the item would
|
/* mustn't let partly-eaten drop all the way to 0 or the item would
|
||||||
become restored to untouched; set to no bites left */
|
become restored to untouched; set to no bites left */
|
||||||
if (obj->oeaten == 0) {
|
if (obj->oeaten == 0) {
|
||||||
if (obj == gc.context.victual.piece) /* always true unless wishing... */
|
if (obj == gc.context.victual.piece) /* always true unless wishing */
|
||||||
gc.context.victual.reqtime = gc.context.victual.usedtime;
|
gc.context.victual.reqtime = gc.context.victual.usedtime;
|
||||||
obj->oeaten = 1; /* smallest possible positive value */
|
obj->oeaten = 1; /* smallest possible positive value */
|
||||||
}
|
}
|
||||||
@@ -3733,10 +3728,7 @@ cant_finish_meal(struct obj *corpse)
|
|||||||
*/
|
*/
|
||||||
if (go.occupation == eatfood && gc.context.victual.piece == corpse) {
|
if (go.occupation == eatfood && gc.context.victual.piece == corpse) {
|
||||||
/* normally performed by done_eating() */
|
/* normally performed by done_eating() */
|
||||||
gc.context.victual.piece = (struct obj *) 0;
|
gc.context.victual = zero_victual; /* vicutal.piece = 0, .o_id = 0 */
|
||||||
gc.context.victual.o_id = 0;
|
|
||||||
gc.context.victual.fullwarn = gc.context.victual.eating =
|
|
||||||
gc.context.victual.doreset = FALSE;
|
|
||||||
|
|
||||||
if (!corpse->oeaten)
|
if (!corpse->oeaten)
|
||||||
corpse->oeaten = 1; /* [see consume_oeaten()] */
|
corpse->oeaten = 1; /* [see consume_oeaten()] */
|
||||||
|
|||||||
Reference in New Issue
Block a user