OSDN Git Service

[Fix] 64bitシフト演算を関数化(未定義動作の回避、仕様の明確化)
authortaotao54321 <taotao54321@gmail.com>
Thu, 11 Feb 2021 20:13:14 +0000 (05:13 +0900)
committertaotao54321 <taotao54321@gmail.com>
Sat, 13 Feb 2021 02:16:11 +0000 (11:16 +0900)
commitf5e55b126300cb8b67f47fbef8ad325db4e065f7
tree1ee7fa2c61af19853b59e582867245dbd662e7b4
parentba903d961d105c6da4491788fbf2997187fa0d92
[Fix] 64bitシフト演算を関数化(未定義動作の回避、仕様の明確化)

従来の64bitシフト関数には以下のような問題があった:

* s64b_RSHIFT() は、(V1<<(32-(N))) の部分で未定義動作が起こりうる。
  例えば V1 != 0 && N == 1 のとき、V1 が 31 回左シフトされてオーバーフローする。
  現状では敵を殴るだけでこれが発生するため、ubsan を用いたデバッグがしにくい。
* シフト量 0 を渡すと 32 回のシフトが発生して未定義動作となる。
* マクロで実装されているため型チェックが甘く、assert なども入れにくい。
* 引数の範囲についての仕様が書かれていない。

非マクロ関数を設けてこれらを解決する。
シフト対象は64bit非負整数、シフト量は [0,31] という仕様にする。
既存コードのシフト関数呼び出しを見る限り、これで要求は満たしているはず。
src/core/hp-mp-regenerator.c
src/core/player-processor.c
src/monster/monster-status.c
src/spell-realm/spells-song.c
src/term/z-util.c
src/term/z-util.h