owhinata commented on PR #26:
URL: https://github.com/apache/nuttx/pull/26#issuecomment-4231189974
## Codex 不具合解析: signest_test ハング
### 前提
- NuttX upstream の既��修正 2 件 (`2b513af` sig_dispatch race, `e4d5c78`
wrong-thread delivery) は**既に適用済み**。これらは SMP race condition の修正であり、single-core
STM32F413 では根本原因にならない。
- FPU 有効時の `XCPTCONTEXT_SIZE` = 216 bytes (54 regs × 4)。シグナル配信ごとにスタック上に確保される。
### 仮説一覧���確度順)
#### 仮説 1: スタックオーバーフロー(確度: 高)
`CONFIG_TESTING_OSTEST_STACKSIZE=4096` に対し、1 回のシグナル配信で消費されるスタック:
| 要素 | サイズ |
|---|---|
| `XCPTCONTEXT_SIZE` (`arm_schedulesigaction.c:118`) | 216 bytes |
| `arm_sigdeliver` フレーム | ~32 bytes |
| `nxsig_deliver` フレーム (sigset_t×6 + locals) | ~96 bytes |
| `waiter_action` → `sem_post` chain | ~80 bytes |
| `nxsig_unmask_pendingsignal` → `nxsig_tcbdispatch` → `nxsig_queue_action`
| ~128 bytes |
| **合計** | **~552 bytes** |
waiter_main 自体のスタック使用 (~200-400 bytes) を加えると、利用可能スタック ~3600 bytes
に対し余裕は少ない。phase 2/3 で複数シグナルが同時キューされ unmask 時に連鎖配信が発生すると、スタック深度がさらに増加する。
**ボードリセットが発生しない理由**: スタック破壊により `__assert()` 自体が動作不能。HardFault
ハンドラも壊れたスタックでは動作できない。
**検証方法:**
1. `CONFIG_TESTING_OSTEST_STACKSIZE=16384` に変更して再テスト
2. `CONFIG_STACK_COLORATION=y` 有効下で waiter の `/proc/<pid>/status` を確認
#### 仮説 2: arm_sigdeliver retry ループの livelock���確度: 中)
`arm_sigdeliver.c:134-141` の retry ループ:
```c
if (!sq_empty(&rtcb->sigpendactionq) &&
(rtcb->flags & TCB_FLAG_SIGNAL_ACTION) == 0)
goto retry;
```
`nxsig_deliver` → `nxsig_unmask_pendingsignal` → `nxsig_tcbdispatch` →
`nxsig_queue_action` で `sigpendactionq` に新エントリが追加され続けると retry が終了しない。sa_mask
に全奇数シグナル (1-61) が含まれるため、奇数シグナル処理中に到着した他の奇数シグナルが pending → handler 復帰後に一斉 unmask
→ 連鎖配信の可能性。
waiter は高優先度のため、このループ中は NSH/USB にCPUが渡らない。
**検証方法:**
1. シグナル範囲を 1-6、反復 1 回に縮小して段階��スト
2. phase 1 のみ → phase 2 → phase 3 で切り分け
#### 仮説 3: sighand_test の残留シグナル状態(確度: 中低)
直前の sighand_test が pending signal list を完全クリーンアップしていない場合、signest_test
開始時にゴミ状態が残る可能性。
**検証方法:** signest_test を単独実行(他テストをスキップ)
#### 仮説 4: Lazy FPU + シグナルトランポ���ンの FPU コンテキスト不���合(確度: 低)
`CONFIG_ARMV7M_LAZYFPU=y` の場合、`arm_sigdeliver` はシグナルハンドラ実行前後で FPU
コンテキストを明示保存しない。
**検証方法:** `CONFIG_ARMV7M_LAZYFPU=n` または `CONFIG_ARCH_FPU=n` で再テスト
### 推奨切り分け手順
| 優先度 | ��クション | 期待 |
|---|---|---|
| 1 | `STACKSIZE=16384` に変更 | スタックオーバーフロー排除 |
| 2 | シグナル範囲縮小 + phase 段��実行 | livelock の規模依存性確認 |
| 3 | `CONFIG_ARMV7M_LAZYFPU=n` | FPU 問題排除 |
🤖 Generated with [Claude Code](https://claude.com/claude-code) + Codex
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]