##
しょうもないバグでも
えらい目にあうよ🥺
という話。(その2)
[ゆるバグ2](https://yurubug.connpass.com/event/174913/)(2020/05/06) @furandon_pig
https://furandon-pig.github.io/study-memo/docs/yurubug/20200506.html
#### これは一般の人が体験した
実話を再現したものです
#### ただし、登場する地名、団体名、
個人名などは、架空もしくは仮名であり
事実とは一切関係ありません🙄
##
元
もと
に
戻
もど
る
設定値
せっていち
体験者
@furandon_pig(仮名)
## 背景 * とある業務用システム。 * 複数のモジュールで構成されている。 * 各モジュールごとに担当チームを置いて開発。 * 新しいモジュールの追加作業時に遭遇したバグ。
## 発生していた怪奇現象 * モジュールの有効・無効をフラグ変数で設定。 * フラグに1を設定すると機能が有効になる等。 * 手元の開発環境ではモジュール単体でテスト。 * 単体テスト時には想定通りの挙動。 * ステージング環境でのテスト。 * なぜかモジュールが有効にならない。
## ソースコードの例 ```c // my_module.h extern int enable_my_module; ``` ```c // my_module.c int enable_my_module = 0; int init_my_module(void) { enable_my_module = 1; } ``` ```c // 全体のmainモジュール int main(int argc, char *argv[]) { // 各モジュールのinit_*_()な初期化処理が呼ばれる。 if (enable_my_module) { ... } } ```
## もうちょっと詳しく見てみる * 変数 `enable_my_module` の値を見てみる。 * 0に戻っているようだ🤔 * 単体テストでは1が設定されることを確認済み。 * 誰かが値を書き換えている? * 他のモジュールでは問題は発生せず。 * `enable_my_module` を狙い撃ちで書き換え? * gdbの `watch` で見てもよく分からず...🙄
## だれかが風の中で * どこかで だれかが 値を書き換えているはず...。 ## 🧐 ``` $ # (当時のデバッグ状況をもとに再現した例です) $ nm a.out ... 08049b00 B other_module_str 08049b10 B enable_my_module ```
## 連続して配置されている変数 * 自分たちのモジュールが使用する変数。 * 直前に別の変数が配置されているようだ。 ```c #define MODULE_STR 16 char other_module_str[MODULE_STR]; int init_other_module(void) { memset(other_module_str, 0, MODULE_STR+1); } ```
## 原因個所が判明😃 * 変数が隣接して配置されていた。 * 直前の変数が1byte多くゼロクリアしていた。 * その1byte分が自分達のモジュール変数だった。 * 0がモジュールの無効を示す値だった。 * (0以外だったらバグに気づけなかったかも...) * 該当モジュールの担当は別チームだった。
## 修正依頼を出して対応完了😐 ```c memset(other_module_str, 0, MODULE_STR+1); ↓ memset(other_module_str, 0, MODULE_STR); ```
## このバグから得られた知見 * [前回の例](https://furandon-pig.github.io/study-memo/docs/yurubug/20200429.html)と同じく、ごく簡単なバグ。 * ただし、いくつかの要因で原因特定が難航。 * 別チームが開発したモジュールだったこと。 * 1byte余分なゼロ埋めだったこと。 * 自分達のモジュールでのみ問題発生。 * チーム内でのデバッグ状況の共有。 * (インフラの障害対応にも似ている感じ...)
## まとめ * 遭遇したゆるいバグの紹介。 * 文字列操作に起因するバグ。 * 別モジュール起因のバグだと調査が難航しがち。 * 問題の切り分けが一段難しくなる印象。 * チーム開発ではデバッグ状況の共有も発生。 * サクサクと調査できない感ある。 * 説明のためにはしっかりとした知識が必要。
### ご清聴ありがとうございました😃