Skip to content

Phase 1: -Wunused-label を潰して -Werror=unused-label を有効化 (Phase 1 完了)#50

Merged
thawk105 merged 1 commit into
masterfrom
werror-unused-label
May 13, 2026
Merged

Phase 1: -Wunused-label を潰して -Werror=unused-label を有効化 (Phase 1 完了)#50
thawk105 merged 1 commit into
masterfrom
werror-unused-label

Conversation

@thawk105
Copy link
Copy Markdown
Owner

#43 Phase 1 の最後の 1 つ。-Wunused-label (7 件) を潰し、ccbench_add_protocol()-Werror=unused-label を追加する。Phase 1 これで完了

うち 6 件は dead label の整理、1 件は std: typo の真のバグ修正

Dead labels (6 件)

複数の関数で同名の FINISH_* ラベルが定義されていて、片方の関数では goto で使われているが、もう片方では goto 参照が一切ない。各 warning 位置の 囲み関数を確認した上で、その関数内で実際に未使用のもののみ削除。同名でも別関数の現役 goto target は触らない。

ファイル:行 ラベル 囲み関数
cc/d2pl/transaction.cc:172 FINISH_READ read_internal
cc/mocc/transaction.cc:487 FINISH_DELETE delete_record
cc/mvto/transaction.cc:224 FINISH_DELETE delete_record
cc/oze/transaction.cc:823 FINISH_VALIDATION write_validation
cc/oze/transaction.cc:1001 FINISH_VALIDATION read_validation
cc/tictoc/transaction.cc:165 FINISH_READ read_internal

いずれも「関数末尾で LABEL: <ADD_ANALYSIS の計測コード>; return ...;」の形。通常制御フローでそこに到達していたので、ラベル削除のみで動作は同じ。

Real bug (1 件)

include/bomb_pessimistic.hh:622:

 if (stat != Status::OK) {
-  std:stringstream ss; ss << "item id: " << node->i_id_;
+  std::stringstream ss; ss << "item id: " << node->i_id_;
   dump(tx.thid_, ss.str());
   return nullptr;
 }

コロン一つ抜けで、GCC は std: を unused label と解釈して通してしまっていたstringstream 自体がスコープに見えていたのは cc/ss2pl/bomb_ss2pl.cc:25using namespace std; のせい — 起きる場所が ss2pl 経由の template instantiation だけだったので、bomb_ss2pl 系をビルドした時のみ表面化していた。

-Werror=unused-label を有効化したからこそ掘り起こされた、というのは #43 の趣旨そのもの。

CMake

 target_compile_options(${target} PRIVATE
   -Werror=maybe-uninitialized
   -Werror=unused-but-set-variable
+  -Werror=unused-label)

Test plan

  • GCC 13 Release / -DENABLE_SANITIZER=OFF: 34/34
  • GCC 11 Debug + ASan: 34/34
  • CI 緑

Phase 1 完了サマリ

Warning PR 件数 内訳
-Wmaybe-uninitialized #44 1 oze の uninitialized ScanRange union (実バグ)
-Wunused-but-set-variable #47 3 cicada/dbomb/oze の dead set
-Wunused-label この PR 7 dead label 6 + std:: typo 1
11

ロードマップ通り 件数少 + 危険度高 から潰した。次は Phase 2 (-Wignored-qualifiers 30 件 → -Wsign-compare 61 件)。

…error=unused-label

#43 Phase 1 の最後。-Wunused-label の 7 件を潰し、ccbench_add_protocol() に
-Werror=unused-label を追加する。Phase 1 これで完了。

うち 6 件は dead label の整理、1 件は std:: typo の真のバグ修正。

Dead labels (6 件)
==================

複数の関数で同名の FINISH_* ラベルが定義されていて、片方の関数では goto で
使われているが、もう片方では goto 参照が一切ない。各 warning 位置の囲み
関数を確認した上で、その関数内で実際に未使用のもののみ削除。同名でも別
関数の現役 goto target は触らない。

  - cc/d2pl/transaction.cc:172      FINISH_READ in read_internal
  - cc/mocc/transaction.cc:487      FINISH_DELETE in delete_record
  - cc/mvto/transaction.cc:224      FINISH_DELETE in delete_record
  - cc/oze/transaction.cc:823       FINISH_VALIDATION in write_validation
  - cc/oze/transaction.cc:1001      FINISH_VALIDATION in read_validation
  - cc/tictoc/transaction.cc:165    FINISH_READ in read_internal

これらは概ね「関数末尾で `LABEL: <ADD_ANALYSIS の計測コード>; return ...;` の
形」をしていた。ラベル経由の遷移は無く、通常の制御フローでそこに到達して
いたので、ラベルを削除するだけで動作は同じ。

Real bug (1 件)
===============

include/bomb_pessimistic.hh:622

  - if (stat != Status::OK) {
  -   std:stringstream ss; ss << "item id: " << node->i_id_;
  + if (stat != Status::OK) {
  +   std::stringstream ss; ss << "item id: " << node->i_id_;

コロン一つ抜けで、GCC は `std:` を unused label と解釈して通してしまって
いた。`stringstream` 自体がスコープに見えていたのは cc/ss2pl/bomb_ss2pl.cc
側の `using namespace std;` (line 25) のせい — 起きる場所が ss2pl 経由の
template instantiation だけだったので、ss2pl の bomb 系をビルドした時のみ
出現。-Wunused-label を error 化したことで掘り起こされた。

CMake
=====

  -Werror=maybe-uninitialized
  -Werror=unused-but-set-variable
+ -Werror=unused-label

Test plan
=========

- GCC 13 + Release / -ENABLE_SANITIZER=OFF: 34/34
- GCC 11 + Debug + ASan:                    34/34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant