OSDN Git Service

[fix] #65 未初期化の変数を参照している
authorHabu <habu1010+github@gmail.com>
Thu, 11 Feb 2021 13:43:59 +0000 (22:43 +0900)
committerHabu <habu1010+github@gmail.com>
Thu, 11 Feb 2021 15:10:31 +0000 (00:10 +0900)
魔法書のを選択する時にchoose_objectがNULLを返した場合、
item == INVEN_FORCEなら練気術が選択されたとするアドホックな
実装がなされているが、選択をキャンセルした場合もNULLが
返され、その場合itemは更新されていないので未初期化の変数itemが
たまたまINVEN_FORCEっだった場合にdo_cmd_mind()が呼ばれてしまう。

そもそもinventory_slot_typeにスロット非選択状態の値があるべきなので、
INVEN_NONEを新設して使用されていない値として1000を割り当てる。
choose_object()の最初で、第2引数に参照渡しされた変数をINVEN_NONEで
初期化するようにする。

src/floor/floor-object.c
src/inventory/inventory-slot-types.h

index 80a64c0..254ceec 100644 (file)
@@ -620,6 +620,10 @@ void floor_item_describe(player_type *owner_ptr, INVENTORY_IDX item)
 object_type *choose_object(player_type *owner_ptr, OBJECT_IDX *idx, concptr q, concptr s, BIT_FLAGS option, tval_type tval)
 {
     OBJECT_IDX item;
+
+    if (idx)
+        *idx = INVEN_NONE;
+
     if (!get_item(owner_ptr, &item, q, s, option, tval))
         return NULL;
 
index ba20cee..5295d80 100644 (file)
@@ -16,5 +16,6 @@ typedef enum inventory_slot_type {
     INVEN_FEET = 35, /*!< アイテムスロット…脚部 */
     INVEN_AMMO = 23, /*!< used for get_random_ego()  */
     INVEN_TOTAL = 36, /*!< Total number of inventory_list slots (hard-coded). */
+    INVEN_NONE = 1000, /*!< アイテムスロット非選択状態 */
     INVEN_FORCE = 1111, /*!< inventory_list slot for selecting force (hard-coded). */
 } inventory_slot_type;