MAP | TOP > 工房「藤車」 > 技術系執筆情報 > 『lsを読まずにプログラマを名乗るな!』 > 正誤情報/補足説明 |
最終更新日: 2013-10-03
このページでは、 拙著『lsを読まずにプログラマを名乗るな!』中の、 誤りに関する修正、 および補足的な説明を掲載します。
内容の不備等にお気付きの際には、 メール、 twitter (@flyingfoozy 宛) 等でお知らせください。
.hgignore
記述例 (2013-09-18 更新)gobble_file()
でのシンボリックリンクの取り扱い
lint
による break
記述漏れの検出 (2013-09-18 更新)
.hgignore
記述例本書では、 アーカイブファイル経由でソースコードを入手した場合、 オリジナルのソースコードからの変更を監視/記録するために、 独自に履歴管理することを勧めています。
履歴管理を行う場合、
作業領域の状態確認を行う際に、
オブジェクトファイル (*.o
) や実行可能ファイル、
configure
により自動生成されるヘッダファイル等、
ビルド過程で生成される成果物を、
確認対象から除外できた方が便利です。
例えば履歴管理ツールに Mercurial を使用する場合は、
以下のような内容の .hgignore
ファイルを、
作業領域ルート直下に置くことで、
"hg status
" 実行時に、
中間成果物は表示対象から除外されます。
syntax: glob *.o *.Po *.a *.so
本書で参照している GNU coreutils 8.21 時点で、
妥当と思われる除外設定を記述した .hgignore
ファイルは、
以下のリンクから入手してください。
上記 .hgignore
の末尾には、
ビルド時に生成される中間成果物等の除外指定の他に、
以下のようなファイルに対する除外記述も含まれています。
*~
)
hg revert
" 等で変更内容を復旧した場合のバックアップファイル
(*.orig
)
Mercurial の
.hgignore
記述の詳細に関しては、
"hg help hgignore
"
によるオンラインヘルプを参照してください
(同じ内容はウェブ経由でも参照可能)。
オンラインヘルプの日本語化に関しては、
別途 Mercurial の『言語設定』
のページを参照してください。
ページ末尾の段落に、以下の誤りがあります。
calloc(3)
関数群よりも
malloc(3)
と関連付けて〜calloc(3)
よりも
malloc(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;
}
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| }
備考: AdLint や Clang Static Analyzer に関しては、 挙動を確認次第、追って本ページに追記します。
MAP | TOP > 工房「藤車」 > 技術系執筆情報 > 『lsを読まずにプログラマを名乗るな!』 > 正誤情報/補足説明 |