namazu-dev(ring)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: use strerror()



Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx> wrote:

>万が一、 MUST_NOT_BE_REACHED_HERE() にたどり着くと、
>
>  foobar: foobar.c:342: MUST NOT BE REACHED HERE! Report bug!
>  zsh: 30148 abort (core dumped) foobar
>
>となります。
>
># こういうことをしているプログラムはどのくらいあるのだろう?

Python-1.5.2/Parser/grammar1.c:60 に発見しました。:-)

	for (i = g->g_ndfas, d = g->g_dfa; --i >= 0; d++) {
		if (d->d_type == type)
			return d;
	}
	assert(0);
	/* NOTREACHED */

# この部分のコードは今では使われていないようだけど

MUST_NOT_BE_REACHED_HERE() は悪くないアイディアだと思ったけ
ど、ちょっと大げさすぎるので廃止しました。代わりに

    assert(0);
    /* NOTREACHED */
  
としました。assert(0) で core dump するのできっとバグ報告を
してくれるでしょう。:-)

# assert() は abort時にファイル名と行番号を (気の利いたシス
# テムでは関数名も) 表示してくれます。


ちなみに、手元のホストの ~/src に展開されているソースを調べ
たところ、次の結果になりました。

  % cd ~/src
  % grep -n 'assert *\(' **/*.[ch] |\
    perl -nle 'print $1 if m!^(.*?)/!'| uniq -c |sort -nr
    183	glib-1.2.6
    123	apache_1.3.9
     37	Python-1.5.2
     19	wget-1.5.3
     17	grep-2.4
      7	gettext-0.10.35
      2	w3m

一般に、 assert() は積極的に使った方がいいようです。(複雑な
処理では特に)

# The Practice of Programming と Programming Pearls 2nd
# edition には assert() を使うべし、と書かれてました。

p.s.
Cで書かれた質の高いプログラムのソースコードをじっくり読んで
勉強したいのだけど、何かお勧めはありません?  できれば、数千
行程度のプログラムで、GUI関連ではないものがいいな。:)

# 上の条件を満たさなくてもこれぞお勧め、というソースコードが
# あれば教えてもらえると嬉しいです。ちなみに、岡充さん
# <http://www.aist-nara.ac.jp/~mitsu-o/> には、「Cでオブジェ
# クト指向プログラミングをするなら GLib と Gtk のソースから
# 学ぶべし」との助言を頂きました。:-)

-- Satoru Takabayashi
Each new user of a new system uncovers a new class of bugs.
                                        -- Brian Kernighan