正誤情報/補足説明

最終更新日: 2013-10-03

このページでは、 拙著『lsを読まずにプログラマを名乗るな!』中の、 誤りに関する修正、 および補足的な説明を掲載します。

内容の不備等にお気付きの際には、 メール、 twitter (@flyingfoozy 宛) 等でお知らせください。

第0章 事前準備

0.1 ソースコードの入手

0.1.2 アーカイブファイルでのソースコードの入手

.hgignore 記述例

本書では、 アーカイブファイル経由でソースコードを入手した場合、 オリジナルのソースコードからの変更を監視/記録するために、 独自に履歴管理することを勧めています。

履歴管理を行う場合、 作業領域の状態確認を行う際に、 オブジェクトファイル (*.o) や実行可能ファイル、 configure により自動生成されるヘッダファイル等、 ビルド過程で生成される成果物を、 確認対象から除外できた方が便利です。

例えば履歴管理ツールに Mercurial を使用する場合は、 以下のような内容の .hgignore ファイルを、 作業領域ルート直下に置くことで、 "hg status" 実行時に、 中間成果物は表示対象から除外されます。

syntax: glob

*.o
*.Po
*.a
*.so

本書で参照している GNU coreutils 8.21 時点で、 妥当と思われる除外設定を記述した .hgignore ファイルは、 以下のリンクから入手してください。

上記 .hgignore の末尾には、 ビルド時に生成される中間成果物等の除外指定の他に、 以下のようなファイルに対する除外記述も含まれています。

Mercurial の .hgignore 記述の詳細に関しては、 "hg help hgignore" によるオンラインヘルプを参照してください (同じ内容はウェブ経由でも参照可能)。 オンラインヘルプの日本語化に関しては、 別途 Mercurial の『言語設定』 のページを参照してください。

第1章 基本的な処理ルート

1.2 情報格納領域の確保

13ページでの誤り

ページ末尾の段落に、以下の誤りがあります。

第3章 シンボリックリンクに対する挙動

3.2 シンボリックリンクに対する挙動

3.2.3 gobble_file() でのシンボリックリンクの取り扱い

lint による break 記述漏れの検出

本書のコラム『break の記述漏れ防止』では、 switch 構文における意図しない break の記述漏れが、 lint コマンドで検出可能な旨を説明していますが、 GNU coreutils に対する lint コマンドの適用は、 必ずしも上手く行くとは限りません。

Debian 系 Linux ディストリビューションでは、 lint コマンド実装として Splint が利用可能ですが、 C99 仕様を前提に実装されている GNU coreutils のソースコードは、 C90 仕様にまでしか対応していない Splint では検証できません。

例えば、 ブロック途中での変数宣言や、 for 構文中での変数宣言などがあると、 Splint は解析エラーで終了してしまいます。

Solaris 系 OS で利用可能な Oracle Solaris Studio (旧称『SunStudio』) 同梱の lint コマンドは C99 仕様に対応しているので、 GNU coreutils のソースコードに対しても適用可能です。

しかし、 Oracle Solaris Studio 同梱の lint コマンドの場合、 どういう訳か以下のように、 『default に遷移する場合の break 漏れはエラーとみなさない』 という特殊な扱いになっています。

switch(c){
  case 1:
    foo = 1;
    /* ここでの break 漏れは検出される */
  case 2:
    bar = 2;
    /* ここでの break 漏れは検出されない */
  default:
    baz = 3;
    break;
}
Oracle Solaris Studio 同梱 lint での検証

gobble_file() における break の省略は、 以下の様に default に遷移するものであるため、 残念ながら(?)この場合の break 省略に対しては、 エラー/警告表示が行われません。

2939|      switch (dereference)
2940|        {
〜〜〜〜
2946|        case DEREF_COMMAND_LINE_ARGUMENTS:
2947|        case DEREF_COMMAND_LINE_SYMLINK_TO_DIR:
2948|          if (command_line_arg)
2949|            {
〜〜〜〜
2967|            }
2968|          ※ 意図的な default への遷移
2969|        default: /* DEREF_NEVER */
2970|          err = lstat (absolute_name, &f->stat);
2971|          do_deref = false;
2972|          break;
2973|        }
gobble_file() での break 無し switch 構文

備考: AdLintClang Static Analyzer に関しては、 挙動を確認次第、追って本ページに追記します。