オプション沼(26) gcc、Wunused一族、一筋縄ではいかない奴?

Joseph Halfmoon

今回gccのオプションで練習してみるのは未使用の「何か」を見つけて警告を発する -Wunusedオプション「一族」です。一族になるのは、見つける対象の「何か」に応じて多数の単独オプションが存在するからです。しかしよくよく調べてみると「代表」の筈の-Wunusedだけでは見つからない「何か」もあり。一筋縄ではいきまへん。

※『オプション沼』投稿順indexはこちら

※今回は動作確認に以下を使用しています

    • Windows11 WSL2上のUbuntu 20.04 LTS、gccのバージョンは9.4.0
-Wunused

使用されてない変数などを見つけ出して警告してくれるのが、「-Wunused‐チョメチョメ」というお名前のもとに存在するオプション一族です。例によって Gnu様のマニュアルページへのリンクを以下に貼っておきます。

3.8 Options to Request or Suppress Warnings

この「-Wunused-XXX」という形式のオプションは結構いっぱいあります。上記ページから拾って列挙すると以下のようでした。

-Wunused-but-set-variable
-Wunused-function
-Wunused-label
-Wunused-local-typedefs
-Wunused-parameter
-Wno-unused-result
-Wunused-variable
-Wunused-const-variable
-Wunused-const-variable=n
-Wunused-const-variable=1
-Wunused-const-variable=2
-Wunused-value

マニュアルによると「警告全部のせ」のオプションである筈の -Wall オプションに含まれているのは以下の4つだけのようです。-Wallといっても全部じゃないのね(よくあることだけど。)

-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable

一方、「-Wunused-XXX」一族の代表者は -Wunused というオプションです。マニュアルによれば、このオプション一つをつければ上記の沢山ある全てのオプションをつけたことになるという建前なのです。しかし、やはり例外があり使われていない関数引数を見つける

unused parameter

は -Wunused オプション単独では報告されないようです。この辺の様子を観察してみた結果を以下の表にまとめました。Command Lineの下にあるのは実際にコンパイル時に指定したオプションで、チェックがついているのは警告が発せられた対象です。unused-variableは一番よく使う検出対象の代表ということで。unused-parameterとunused-variableの両方を検出するには、-Wunusedに加えて -Wextraしないとだめなようです(そのくせ-Wextra単独では見て見ぬ振り?)

Command Line Wunused-variable Wunused-parameter
-Wall
-Wunused
-Wunused-parameter
-Wextra -Wunused
-Wextra
実験に使ったソース

確認実験に使ったソースは以下です。いつもの手抜きなやつ。

/* option -Wunused */
#include <stdio.h>
#include <stdlib.h>

int f1(int *ptr) {
    int localVal = 111;
    return localVal;
}

int main(int argc, char const *argv[])
{
    int a, b, c;
    a = 11;
    b = f1(&a);
    printf("f1(&a) : %d\n", b);
    return 0;
}
実験結果

まずは警告オプション無にコンパイルして実行してみます。何もなくコンパイル成功、そして動作もOK。runs

つづいて、-Wunusedオプションを付加してみます。そのときの様子が以下に。wunused

上記をみると、main関数の中で宣言されているけれども使われていない変数 c が発見され、警告が発せられています。

同様に -Wall してみたときが以下に。wall

こちらも unused-variable の変数c が見つかってます。まあ、未使用の変数が見つかれば、警告としての実質は果たせたってことでしょうなあ。

一方、使われていない関数引数(パラメータ)を検出するためにまずは単独オプション -Wunused-parameter を使ってみます。するとこんな感じ。wunusedparameter

上記の結果をみると、実験用のソースの関数引数はまったくダメダメで使われてないことが一目瞭然であります。まあ、パラメータを無理に全部使ってくれなくてもいいんだし、何かとの互換性で残った盲腸みたいなもんか?知らんけど。

最後に unused-parameterと unused-variable の両方を検出するための合わせ技、-Wextra -Wunused してみます。wextra_wunused

両方とも見つかったね。良かった?

オプション沼(25) gcc、Wmultistatement-macros、うかつな奴? へ戻る