彷徨えるフジワラ

年がら年中さまよってます

cscopeが(色々な意味で)凄い

ある程度以上の規模のソースを参照する場合、これまでは etags で生成したタグファイルを使っていたものの、個人的には以下のような点での使い勝手の悪さから、代替手段の模索などを細々と続ける毎日を。

  • 定義位置にしか飛べない(宣言位置に飛びたい場合も)
  • 厳密一致ベースで飛びたい(部分一致で飛ばれるとノイズが多い)
  • 意外に検出精度が悪い(正規表現ベースだから?)

で、風の便りでcscopeとやらが良いらしい、という噂を聞いたので、ちょっと試してみた。

cscope では、シンボル系検索機能として以下のものが提供されている。

  • シンボルの検索 ⇒ 宣言/定義/参照が検索対象
  • 定義位置の検索 ⇒ 定義が検索対象
  • 呼び出し先の検索 ⇒ 指定関数から呼び出されている関数の一覧
  • 呼び出し元の検索 ⇒ 指定関数を呼び出している関数の一覧
  • 文字列の検索 ⇒ シンボル検索での検索対象に加えてコメント記述等を対象に検索
  • egrep での検索 ⇒ 正規表現

「関数呼び出し」のような「参照」も『シンボルの検索』の対象に。なので、参照回数の少ない関数の宣言位置を知りたい場合なら『シンボルの検索』でも良いけど、多用されている関数の宣言位置を知りたい場合に『シンボルの検索』はちょっとノイジーかなぁ。

とは言うものの、ぱっと触った限りでは、etags よりも検出精度は良さそうな感じ。とりあえず、etags での不満は殆ど解消されそうな感触。

但し、試しに作成した OpenSolaris ソースの usr/src/uts/common 配下のインデックスファイルのサイズは、配下のディレクトリの "du -s" 出力が 308096 ≒ 150MB であるのに対して 75MB という巨大さ!それって、ファイル丸々取り込んでない?(etags の生成するファイルは約 7MB)

おまけに、一旦検索を始めると完了するまで CPU 使用率が 50% に張り付いたまま。「50%」と言っても、Core Duo CPU 搭載マシンで実行した際の CPU 使用率なので、実質 CPU 100% でブン回っているに等しい感じ。これは『CPU を有効に活用している』というべきなのか、『無駄に CPU を消費している』と言うべきなのか。

うーん、なんて御大尽なプログラムなんだ…。

それと、cscope は ctags や etags と同様に文字列ベースでインデックスを作成しているらしいので、ブラウズ対象のソースによっては使いづらい局面が。

例えば OpenSSL とかは、類似処理の宣言・定義の記述を省力化するためにプリプロセスでの展開を多用しているので、文字列ベースのインデックスだと物凄く使い勝手が悪くなってしまうんだよなぁ。

というわけで、来週末は silent bob あたりを試してみるか…。