ソフトウェアエンジニア現役続行

雑多なことを綴ります

C言語

gcovを使ってテストカバー率を測定する

gcovというツールを使ってC言語のテストカバー率を測定することができます。gcovはgccパッケージに同梱されています。たとえば次のようにHoge.cをtestHoge.cでテストするとき↓ [Oswald@fedora14 tmp]$ cat Hoge.c int plus1(int i) { return i+1; }int minus…

fflushとfsyncとfdatasync

どれもバッファリングされているデータをフラッシュする関数ですが、それぞれの違いを再確認しました。 int fflush(FILE *stream); Cライブラリが与えているユーザー空間のバッファしかフラッシュしない。データが物理的にディスクに保存されることを保証し…

関数のスタック使用量を計算する方法

POSIXが使える環境でC言語のプログラムを書いていて、特定の関数が使用するスタックの量を調べる必要がありました。別スレッドを生成してその特定の関数を実行させることで、スタックの使用量を調べることができます。あらかじめ別スレッドのためのスタック…

header競合

asm/statfs.h と sys/statfs.h を両方インクルードすると、headerがコンフリクト(競合)してコンパイルできません。次のように asm/statfs.h と sys/statfs.h をインクルードして・・・、 [Oswald@fedora tmp]$ cat conflict_headers.c #include #include i…

localtime()は同じポインタを見ている

C言語でlocaltime()を使っていてハマりました。以下のようなケースで、です。 #include #include int main (void) { time_t t1, t2; struct tm *tm1, *tm2; t1 = time(NULL); // 現在時刻を取得 t2 = t1 + 24 * 60 * 60; // 24時間後の時刻を取得 tm1 = loca…

glibcの実装を見る方法2

glibcとは、gnuの標準Cライブラリのことです。 以前、glibcの実装を見る方法というエントリを書きました。このときは、サーバがCVSサーバであったため、CVSコマンドでソースコードを持ってくる方法を書きました。 しかし久々にアクセスしたら、今はGITサーバ…

glibcの実装を見る方法

glibcとはGNUが提供する標準Cライブラリのことです。Linuxのマシンには標準で入っています。 「strcspnってどんな実装になっているのだろう?」と思ったことがあり、「いや、そもそも標準Cライブラリの実装ってどこで見ることが出来るのだろう」に発展しまし…

繰り返し処理には要注意

プログラミングでメシが食えるか!?―成功するプログラマーの技術と仕事術という本を読みました。軽いタッチの本でスラスラと読める本です。 その中で、読んでいてギクっとしたのが、繰り返し処理に関する記述です。 以下がダメな実装例です。 for (i=0; i ※pp…

関数内でmallocするときの注意

関数内でmallocするときは、割り当てたアドレスの値を返すようにしなければなりません。僕もやってしまったことがあるのですが、よくありがちなミスとしては以下のようなものがあります。 #include #include void alloc_func (char *ptr) { ptr = malloc (51…

タイムアウトを設定してsystem関数を使いたい

LinuxのC言語では「タイムアウトを設定してsystem関数を使いたい」と思っても、これが思うように出来ません。「プロセスをforkさせて、子プロセスでsystem関数を実行して、親プロセスがタイムアウト時に子プロセスを殺せば良い」と思うかも知れませんが、そ…

演算の相対的コスト

演算の相対的なコストについて以下にまとめました。 以前読んだC実践プログラミングからの情報です。 1000 printfとscanf 800 mallocとfree 500 三角関数(sin,cos,...) 100 浮動小数点数(すべての演算) 30 整数の除算 20 整数の乗算 10 関数呼び出し 6 …

空ファイルの作成方法

空ファイルを作るには、Linuxのシェルなら [oswald@localhost ~]$ touch /tmp/sample.txt とするだけで良かったのですが、C言語の場合も #include int main(void) { FILE *fp; fp = fopen("/tmp/sample.txt", "w"); fclose(fp); return 0; } のように、書き…

構造体のfree

構造体のポインタを宣言して、そこにmallocしてメモリを割り当てたとします。 そして構造体の要素にもポインタがある場合、そこにもmallocしてメモリを割り当てたとします。これらをfreeしたいときは、構造体のポインタだけfreeするのでは不十分です。構造体…

ポインタ同士の加算、減算

プログラミング言語Cを読了しました。C言語の基礎を学ぶ、復習するにはとても良い本です。特にmallocをはじめとする標準ライブラリ関数の内部実装を知ることが出来たのは、今後の開発で役立ちそうです。説明の分かりにくさはあるのですが、この分かりにくい…

静的変数(static変数)の初期化

C言語では、自動変数は明示的に初期化をしないと、その自動変数の値は未定義です。なので自動変数には明示的に初期化をする必要があります。一方、静的変数(static変数)は明示的に初期化をしないと、0(数値型)またはNULL(ポインタ型)に初期化されます…