プログラミング便利ツール

参考リンク

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

  • CSCOPE/memo
  • goxygen /memo ドキュメントジェネレータ
  • Ctags(etags)/memo
  • GLOBAL /memo 日本人がつくったやつ。でもマニュアルは英語。
  • LXR/memo
  • DOC++使ったことないです. リンクだけ
  • OO Bench C++, Objective-C, and Javaベンチマーク
  • Regexx 正規表現のライブラリとか,テンプレートとか
  • ZooLib マルチスレッド
  • C++ Threadsマルチスレッ ド
  • Clintソースコー ドの技術をチェックするやつ

ソースコードを読むための技術
http://i.loveruby.net/ja/misc/readingcode.html

LOC測定ツール Roundup
LocMetrics - Source Code Line Counting Tool
UniversalIndentGUI
Uncrustify
...

http://memolet.blog22.fc2.com/blog-category-56.html

メモリ関連チェックツール

ccmallocが高林氏のお気に入りだそう。
http://namazu.org/~satoru/unimag/6/

purify

メモリ関連バグを実行時にチェックする。
UNIX用。有料。

Valgrind -

Linux用 スレッド・メモリに関するバグを検出するデバッガ。
http://valgrind.org/
kcachegrind という可視化ツールもあるらしい。

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/

SourceNavigaror

GUI ブラウジングツール

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

とスタティックリンクしてもよい。


この論文には Perl で AUTOLOAD を使ってコールグラフ生成する方法も書かれている。

etrace

同じく -finstrument-functions を使って出力をPythonで整形したもの。
http://ndevilla.free.fr/etrace/

ソースコード診断

splint

リント

Copy/Paste Detector - ソースのコピペ検出

http://pmd.sourceforge.net/cpd.html

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

を実行してくれる。賢い。

簡単な Makefile のテンプレート作成スクリプト

#!/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)
とすれば、Makefileでprintfデバッグができる。

http://d.hatena.ne.jp/mzp/20070328/make

makedepend

Makefileを生成
または gcc -M、gcc -MM(<>でインクルードしているファイルは除く)

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 オプションでできる。

scpp (selective c preprocessor)

無効な #if 〜 #endif の除去してくれる