FAQ

全ての FAQ を展開 | 全ての FAQ を折り畳む

各 FAQ タイトルをクリックすると回答部分を展開します。

インストールに関する質問

インストール時に Could not find a valid gem 'adlint' エラー

おそらく、お使いのネットワーク環境では、外部サイトに接続するためにプロキシを経由する必要があるのではないでしょうか?

gem コマンドで HTTP プロキシを使う場合は、下記のように --http-proxy オプションを追加してください。

 % gem install adlint --no-rdoc --no-ri
   --http-proxy http://proxy_host:proxy_port

また、プロキシ使用時に認証が必要な場合は、

 % gem install adlint --no-rdoc --no-ri
   --http-proxy http://proxy_user:proxy_paswd@proxy_host:proxy_port

となります。

インストール時間を短縮するには?

下記のコマンドでインストールすると、gem コマンドが AdLint のソースファイルから API ドキュメントを自動で生成するため時間がかかってしまいます。

 % gem install adlint

Windows 環境上の Ruby 1.9.3-p0 には、ファイルへの書き込みが異様に遅い 不具合があるため、特にインストール時間が長くなるようです。

 % gem install adlint --no-ri --no-rdoc

とすると、ドキュメントの自動生成を抑止できるのでインストール時間を大幅に短縮することができます。

Ruby 1.9.3 以外のバージョンでは動かないの?

現在 AdLint の開発とテストは Ruby 1.9 系の正式リリース版 1.9.3-p194 で行っています。

Ruby 1.8 系や trunk (2.0.0dev) などでは一切テストを行っていないため、動作可能か分かりません。

実行に関する質問

解析時に Failed to read `adlint_traits.yml' と表示されるのは?

特性ファイル (adlint_traits.yml) の構文に誤りがある、または、ファイルの文字エンコーディングが UTF-8 以外である、ことが考えられます。

構文に誤りがある場合は、下に続く詳細なメッセージに構文エラーを発見した位置が出力されているはずです。

 % adlint -t adlint_traits.yml a.c
 adlint: Failed to read `adlint_traits.yml'.

 The detailed message is below;
 (adlint_traits.yml): couldn't parse YAML at line 5 column 2

構文エラーの位置が 0 行目の 0 桁目 (line 0 column 0) となっている場合は、ファイルの文字エンコーディングを UTF-8 に変更してください。

 % adlint -t adlint_traits.yml a.c
 adlint: Failed to read `adlint_traits.yml'.

 The detailed message is below;
 (adlint_traits.yml): couldn't parse YAML at line 0 column 0

adlintize 時に adlint_traits.yml already exists と表示されるのは?

対象のプロジェクトで、既に adlintize コマンドを実行済みです。 特性ファイルを作成し直したい (上書きしても構わない) 場合は、-f オプションを追加して adlintize コマンドを実行してください。

利用者ガイドの 3.1 adlintize コマンド も参考にしてください。

設定ファイルの内容や解析環境を検証する方法は?

解析の前処理のみを試行する adlint_chk コマンドを用意しています。

また、adlintize コマンドにより作成した GNUmakefile には、adlint_chk コマンドを実行するための check ターゲットが定義されます。

下記のコマンドにより、特性ファイルなどの設定ファイルが妥当であるか、解析に必要なヘッダファイルが不足していないかなど、正常に解析できることを短時間で確認することができます。

 % make check

利用者ガイドの 3.5 adlint_chk コマンド も参考にしてください。

解析時間を短縮するには?

解析時間を短縮させる Tips をいくつか紹介します。

シングルモジュール解析を並行実行する

GNU Make は、-j オプションにより並行実行するジョブ数を指定できます。 adlintize コマンドで生成した GNUmakefileall ターゲットは、進捗表示を行わないかわりにシングルモジュール解析を並走させることができます。

したがって、下記のコマンドによりシングルモジュール解析を 4 並走させ全体の解析時間を短縮することが可能です。

 % make -j 4 all 2>make.err

クロスモジュール解析を省略する

多くの警告メッセージや品質メトリクスは、シングルモジュール解析のみで出力できます。 そこで、開発時は対象ソースファイルのシングルモジュール解析のみを実施し、クロスモジュール解析は夜間に CI ツールなどで実施するという運用も可能です。

クロスモジュール解析を省略する場合は、下記のコマンドを実行してください。

 % make verbose-sma-only

また、下記のコマンドによりクロスモジュール解析を省略しつつ、シングルモジュール解析を 4 並走させることができます。

 % make -j 4 sma-only 2>make.err

利用者ガイドの 3 コマンド仕様GNUmakefile 内のコメントも参考にしてください。

特性ファイルは毎回 adlintize コマンドで生成しないとだめ?

adlintize コマンドで生成する特性ファイル (adlint_traits.yml) は、あくまで雛形です。

したがって、通常は初回の解析時に adlintize コマンドで特性ファイルの雛形を生成し、解析対象プロジェクトに応じて設定内容を修正します。 次回からの解析時は特性ファイルを再生成する必要はありません。

また、今後の改善案として、特性ファイルをプロジェクトの Makefile から (できる限り) 自動生成する機能を検討しています。

不要な警告のチェックを抑止できないの?

現時点では、特定の警告のチェックを抑止する機能はありません。

開発チーム内でも優先順位が高い改善項目と考えているので、AdLint 2.0.0 リリース後に早い段階で対応する予定です。 また、警告のチェックを抑止した場合、不要な警告はチェック機能を実行しないため、解析時間を短縮できる見込みです。

システムヘッダに関する警告メッセージは抑止できないの?

現時点では、特定のコンパイラや特定の OS が提供するヘッダに関する警告メッセージを抑止する機能はありません。

不要な警告メッセージをフィルタするプログラムで AdLint の解析コマンドをラップするなどの方法で対応してください。

AdLint は特定のビルド環境に依存しない方針で開発されています。 したがって、どのファイルがプラットフォームが提供するヘッダなのか AdLint が判断できないため、翻訳単位に取り込まれる全てのファイルについて警告メッセージを出力します。

警告メッセージを出力する全てのファイルを利用者が指定するなどの対応方針を決定できれば、改善案として対応するかもしれません。

コンパイルできないと解析できないのか?

ソースファイルがコンパイル可能であることを前提条件としています。

AdLint は、コンパイラと同様に字句解析、構文解析、意味解析を実行することでシングルモジュール解析を実現しています。 したがって、ヘッダファイルが不足している場合など解析を続行しても妥当な結果が得られない場合は異常終了する方針をとっています。

解析対象のターゲット環境に制限はあるの?i686 だけなの?

ターゲット環境に制限は一切ありません。

AdLint は特定のプロセッサやビルド環境に依存しない方針で開発されています。 標準型(int 型など)やポインタ型のサイズ、メモリアライメントなど特性ファイル (adlint_traits.yml) で自由にカスタマイズすることができます。

adlintize -L コマンドで表示されるビルド環境の一覧は、あくまで特性ファイルやコンパイラ固有のイニシャルヘッダファイルの雛形がプリセットされたものを表します。 一覧に無いビルド環境であっても、プラットフォームの提供するヘッダファイル、お使いのコンパイラが事前定義するマクロなどの情報が分かれば対応することができます。

コンパイラは GCC や VC 以外にも対応してるの?

対応可能です。

AdLint は特定のビルド環境に依存しない方針で開発されています。 ISO 規格外のコンパイラ独自の拡張機能を使用したコードは、AdLint の「トークン置換機能」により無視したり、対応する ISO 規格の要素に置換することができます。

利用者ガイド 4.2.2 コンパイラ特性 も参考にしてください。

ユーザ独自の環境設定をする場合はどうすればいいの?

adlintize コマンドにプリセットされたテンプレートを使用せずに、ユーザ独自の環境設定を行う手順を紹介します。

以下では、Linux環境においてプリセットで用意しているi686-linux-gcc_4.5.1 テンプレートが使用できない場合の例を想定しています。

  1. gcc コマンドが事前定義するマクロと、ヘッダのサーチパスを調査します
 % touch a.c
 % gcc -E -dM -v a.c 1>a.h 2>a.log
  1. adlintize で作成した adlint_cinit.h ファイルを編集します

まず、adlint_cinit.ha.h の内容で上書きします

 % cp a.h path/to/adlint_cinit.h

次に、下記内容を adlint_cinit.h の末尾に追加してください。

 #define __const const
 #define __restrict restrict
 #define __inline inline
 #define __builtin_va_list void *
 #define __builtin_va_start(a, b) (0)
 #define __builtin_va_end(a) (0)
 #define __builtin_va_arg(ar, t) (0)
 #define __builtin_va_copy(d, s) (0)
 #define __builtin_offsetof(type, member) (0)
 #define __alignof__(type) (0)
  1. adlintize で作成した adlint_traits.yml ファイルを編集します

下記のように、a.log 中の #include <...> のサーチパスを確認し、adlint_traits.ymlcompiler_traits:include_path 項目を修正します。

 % cat a.log

 ...snip...
 #include <...> の探索はここから始まります:
    /usr/local/include
    /usr/lib/gcc/i686-redhat-linux/4.5.1/include
    /usr/include
 探索リストの終わり
 ...snip...

この場合、adlint_traits.yml ファイルの compiler_traits セクション内の include_path 項目を下記のように編集してください。

 compiler_traits:
 ...snip...
     include_path:
       - "/usr/local/include"
       - "/usr/lib/gcc/i686-redhat-linux/4.5.1/include"
       - "/usr/include"
 ...snip...

include_path 項目は project_traits セクションにも存在しますが、こちらは変更しないよう注意してください。

コア開発に関する質問

なぜ Ruby で開発しているの?

早く (!= 速く) 動くものを作りたかったので、開発効率の高い Ruby を選びました。

AdLint 自体の設計文書とかはないの?

申し訳ありません。現在のところ設計文書はありません。

お困りの点をご質問いただければ、作成中の開発者ガイドにも反映できるかもしれません。

その他の質問

AdLint の名前の由来は?

初期の UNIX で登場した lint コマンドの機能に、抽象インタプリタや品質メトリクス測定機能を追加して進化させたという意味をこめ、Advanced Lint から AdLint と命名しました。

AdLint はフルスクラッチ開発されています。lint コマンドを単純に拡張したものではありません。

また、AdLint の Ad は Advertise とは一切関係ありません。


>> トップへ戻る