プログラミング便利ツール
参考リンク
utils for c development
http://www.ibiblio.org/pub/linux/devel/lang/c/!INDEX.html
Free Software Directory - Programs for small specific development tasks
http://directory.fsf.org/devel/specific/
Programmers Heaven
http://www.programmersheaven.com/zone16/mh150.htm
Vector 関数ヘッダ生成、html化、ステップ数計測など
http://www.vector.co.jp/vpack/filearea/win/prog/index.html
ソースコード解読ツールのブックマーク
https://www.codeblog.org/tools.html
リファレンスツールを探す
http://hp.vector.co.jp/authors/VA022047/linux/reference.html
ソースコードを読むための技術
http://i.loveruby.net/ja/misc/readingcode.html
LOC測定ツール Roundup
http://memolet.blog22.fc2.com/blog-category-56.html
LocMetrics - Source Code Line Counting Tool
UniversalIndentGUI
Uncrustify
...
メモリ関連チェックツール
ccmallocが高林氏のお気に入りだそう。
http://namazu.org/~satoru/unimag/6/
purify
メモリ関連バグを実行時にチェックする。
UNIX用。有料。
Valgrind -
Linux用 スレッド・メモリに関するバグを検出するデバッガ。
http://valgrind.org/
kcachegrind という可視化ツールもあるらしい。
mpatrol
メモリリークを検出する。
VC6.0で使える。
http://shu-page.hp.infoseek.co.jp/cgi-bin/ykwk/wiki.cgi?VC%a4%c7mpatrol
MemProf
GUIのメモリプロファイラ。 コンパイル時に特殊なライブラリをリンクする必要がない。 すばらしい。 ただし Linuxでしか動かない。 CUIが付属しないのが難点 (テストの自動化に使えない)。
http://people.redhat.com/otaylor/memprof/
CTC++
test coverage and dynamic analyzing tool
http://www.testwell.fi/ctcdesc.html#instrument
COVTOOL - Free test coverage analyzer for C++
http://covtool.sourceforge.net/
メモリの使い方をしているのかをヒストグラムで表示してくれる libmemusage
http://mkosaki.blog46.fc2.com/blog-entry-502.html
ドキュメンテーション
ブラウジング・クロスリファレンス
ctags
tags の作り方の指針については以下のドキュメントが参考になる。
Exuberant Ctags FAQ 日本語訳
15. 多重ディレクトリ階層のtagファイルを生成するには
http://hp.vector.co.jp/authors/VA025040/ctags/faq.html#15
GNU GLOBAL
ctagsbr
ctags GUI フロントエンド
http://catfish.virtualave.net/ctagsbr/
cflow
GNU cflow もあるらしい
http://www.gnu.org/software/cflow/
cflow の出力を graphviz で可視化するためのスクリプト
(ソースファイルがちょっと大きくなると破綻してしまう)
http://d.hatena.ne.jp/pyopyopyo/20050724/p2
cflow は使える!
http://d.hatena.ne.jp/parasporospa/20071209
どこから呼ばれているかを調べる
-i (invert; 呼びされた方を先に出力する) と -r name (name 以下のみを出力)を組み合わせると、ある関数がどこからどのようにして呼ばれているかを見ることができる。
次の例は hit_return_msg が repeat_message と wait_return から呼ばれていることを示している。
$ cflow -i -r hit_return_msg -I/usr/local/include -I./proto message.c 1 hit_return_msg {message.c 1078} 2 repeat_message {message.c 2829} 3 wait_return {message.c 864}
しかしこの方法は完全ではないようだ。
同じソースに対して global を使ったらこんな結果になった:
$ global -xr hit_return_msg hit_return_msg 22 message.c static void hit_return_msg __ARGS((void)); hit_return_msg 920 message.c hit_return_msg(); hit_return_msg 969 message.c hit_return_msg(); hit_return_msg 2848 message.c hit_return_msg();
GNU cflowの場合
GNU cflow はオプションがちょっと違う。
-r, --reverse * Print reverse call tree -x, --xref Produce cross-reference listing only -m, --main=NAME Assume main function to be called NAM(NAME以下のみを出力)
また、パーサにバグがあるらしく、-m hit_return_msg が正しく表示されなかった。
cflow の output.c の
main_sym = lookup(start_name);
で lookup が NULL を返していたので、多分パーサのバグ。
cxref
クロスリファレンス。htmlで出力できる。
けっこう使えると思う。
http://www.gedanken.demon.co.uk/cxref/
Linux Cross-Reference
CGIとして動作するクロスリファレンス生成器。
http://lxr.linux.no/
Visustin
ソースコードからフローチャートを生成する。
http://www.aivosto.com/visustin.html
対応言語は Ada, ASP, assembler, BASIC, C/C++, C#, Clipper, COBOL, ColdFusion, Fortran, Java, JSP, JavaScript, LotusScript, Pascal/Delphi, Perl, PHP, PL/SQL, PowerScript, PureBasic, Python, QuickBASIC, REALbasic, T-SQL, VB, VBA, VB.NET, Visual FoxPro or XSLT
Standard $299。Pro $599。
動的コールグラフ
ftrace
DSAS開発者の部屋:オープンソースを楽しむエンジニアの二日目 - ftraceコマンドを書く
http://dsas.blog.klab.org/archives/51025093.html
instrumental
Index of /~krahmer/instrumental
http://www.suse.de/~krahmer/instrumental/
$ cc -g -finstrument-functions -o testprog testprog.c $ cc -fPIC -c instrumental.c && ld -Bshareable instrumental.o -o inst.so This generates a shared object file you can preload with LD_PRELOAD $ LD_PRELOAD=./inst.so testprog
これを実行すると /tmp/log.inst.dot.PID(PID はプロセスID)が作成される。
このファイルの最後の行に"}"を追加し、build-pdf 中の dfile の名前を書き換えて実行するとコールグラフを描いた x.pdf が生成される。
$ cc -g -finstrument-functions -o testprog testprog.c instrumental.o
とスタティックリンクしてもよい。
etrace
同じく -finstrument-functions を使って出力をPythonで整形したもの。
http://ndevilla.free.fr/etrace/
ソースコード診断
splint
リント
Copy/Paste Detector - ソースのコピペ検出
rsm
RSM
http://msquaredtechnologies.com/m2rsm/rsm_demo.php
C, C++, Java, C# 用。if, while, switch などの数から求めるサイクロマティック複雑度を計算できる。評価版は無料で制限は10ファイルのみということだけ。
Clang Static Analyzer
C, Objective C に対応。
http://clang-analyzer.llvm.org/index.html
ソースコード整形
Java 用のはたくさんあり。
GNU indent
C言語用。
引数で指定したファイルを書き換え、元のファイルを .BAK という拡張子でバックアップをとる。
FreeBSD の indent は indent *.c とすると最後のファイルに上書き出力してしまうとんでもない代物。
GNU indent にはいろいろ追加のオプションがあるようだ。
現在の .indent.pro
-bad 宣言ブロックの後に空行を入れる -bap 関数本体の後に空行を入れる -nut タブをスペースに展開 -i4 4タブ -c40 1行コメントは40桁目から -nce } else のとき else の前に改行を入れる -di8 構造体のメンバ名を型名からどれだけインデントするか -nfcb ブロックコメントを整形しない -l120 1行の最大幅
astyle
マニュアル
http://homepage2.nifty.com/tenk/lib/doc/astyle_j.htm
~/.astylerc にオプションを書いておく。
オプション --style=ansi --style=kr --indent-preprocessor 好みのオプション --pad=all カッコと演算子の周りにスペースを入れる(会社でやってる人多し) --indent-labels goto のラベルの行のインデントを1つさげる。 --brackets=break-closing-headers else の前で改行する 好みでないオプション --break-elseifs else if の else と if の間で改行する(好みでない)
bcpp
beautify C++ programs
http://invisible-island.net/
使ったことない。
GreatCode
おそらくこれが最強。ただしバギー。
今後の開発に期待。
依存解決
make
make makes many problems
http://pc10.2ch.net/test/read.cgi/tech/1029599472/
最小の Makefile
なんと、Makefile が存在せず hoge.c があるとき
make hoge
と打つと
cc -O -pipe hoge.c -o hoge
を実行してくれる。(空の Makefile がある場合も同じ)
Vim の中からこれをやるには
:mak %<
とすればよい。
そして実行するには
:!%<
LDLIBS=-lm hoge: hoge.c
と書いておいて make と打つと
cc -lm hoge.c -o hoge
を実行してくれる。賢い。
#!/bin/sh SRCS=`echo *.c *.cpp| sed -e 's/\*\.cpp//; s/\*\.c//'` OBJS=`echo "$SRCS" | sed -e 's/\.c/.o/g; s/\.cpp/.o/g'` cat << "EOF" > Makefile TARGET = a.out CC = gcc CFLAGS = -g -DDEBUG=1 #CFLAGS = -O2 CFLAGS += -W -Wall -Wshadow -Wsign-compare -Wno-unused #LDFLAGS = -lglut -lGLU -lGL EOF cat << EOF >> Makefile SRCS = $SRCS OBJS = $OBJS EOF cat << "EOF" >> Makefile .c.o: $(CC) $(CFLAGS) -o $@ -c $< all: $(TARGET) a.out: $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) depend: makedepend -- $(CFLAGS) -- $(SRCS) clean: rm -f $(OBJS) tags $(TARGET) tags: ctags -R . EOF make depend
dummy := $(shell echo some text 1>&2)
http://d.hatena.ne.jp/mzp/20070328/make
とすれば、Makefileでprintfデバッグができる。
autoconf/automake
25 From:デフォルトの名無しさん Date:02/08/19 19:48 Mail:sage
>>23
いや、それは Autoconf と突っ込んでみる。
Makefile より Makefile.am の方が簡単だと思うし、
自分のところで動けばいいなら autoscan した後、
$ mv configure.scan configure.ac
して、
- AC_CONFIG_HEADER([config.h])
+ AM_INIT_AUTOMAKE([foreign])
- AC_CONFIG_FILES([])
+ AC_CONFIG_FILES([Makefile])
するだけで結構うまくいったりするが、どうよ。
高度な事すると結構面倒だけどね。
ソースコード生成・変換
expand(1) unexpand(1)
タブ←→スペース変換
cdecl
宣言←→英語 変換
http://http.us.debian.org/debian/pool/main/c/cdecl/cdecl_2.5.orig.tar.gz
3、4箇所修正したが、Cygwin上でコンパイル成功。
使い方 declare x as pointer to float explain float *x
cextract
プロトタイプ宣言を作成
include <stdio.h> #include <stdlib.h> #include <string.h> /* メイン関数 2行目*/ int main(int argc, char *argv[]) { return 0; } // さげる char* sage(void) { return "sage"; }
$ cextract -E +c +p -P -HINCLUDED test.c /* * This file was automatically generated by version 1.7 of cextract. * Manual editing not recommended. * * Created: Fri May 13 12:08:09 2005 */ #ifndef INCLUDED #define INCLUDED #if __STDC__ /* メイン関数 2行目*/ int main ( int argc, char *argv[] ); char* sage ( void ); #endif /* __STDC__ */ #endif /* INCLUDED */
cproto
関数のプロトタイプを生成。
プロトタイプの旧 K&R スタイル<->ANSI スタイルの変換もできる。
プログラム書くのにどんなエディタ使ってる?http://pc3.2ch.net/tech/kako/1007/10079/1007949218.html
788 名前: デフォルトの名無しさん 投稿日: 02/04/19 22:13
ctagsで
int f(
int a,
int b)
{
}
というようなのを
f: int f(int a,int b)
というように宣言の全体を出力してもらうにはどうすればいいですか790 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:27
>>788
何がしたいのかよくわからんけど、
cprotoを使えば1行にした宣言を吐いてくれたはず。
↑は FreeBSD の cproto なら -f3 オプションでできる。
unifdef
#ifdef を除去
http://www.dm4lab.to/~kjana/ruby/ruby.html
scpp (selective c preprocessor)
無効な #if 〜 #endif の除去してくれる