alloc系のコーディングルール
2008/01/29
Starbug1(BTS)は、Cで書いてます。10月頃から始めて、身内関連では、2つのプロジェクトで実践投入されるところまで来ました。
Cを長期的に書いていくので、個人コーディングルールとかも考えたりもしています。ちょっと前に考えたルールを書いてみます。
allocした領域を指す変数の名前は、接尾辞に _a を付ける
やはり、cで困ることは、mallocなどで確保した領域のfreeし忘れだと思います。Starbug1はcgiであるとは言え、freeし忘れはできる限り無くしたいと思っています。言語がサポートしてくれていないので、変数名の命名規則によって間違いを発見しやすくするようにしました。要するにアプリケーション ハンガリアン記法です。wikipedia
allocしたブロック内でfreeする
これは、良く言われていることだと思います。呼び先でfreeしたりしなかったりすると管理不能になるので、一貫させる。
関数呼出しの先で確保した領域を戻り値で貰うのではなく、確保した領域を引数にして、関数呼出しの先ではデータを設定してもらうだけにする必要があります。
引数が増えて面倒ですが、わかりやすくするためです。
allocとfreeはラップして直には触らない
allocは、xallocでラップして、freeは、xfreeでラップするようにします。
例
下は、イメージです。
for (i = 0; i < ITEM_COUNT; i++) { ListItem* item_a = xalloc(sizeof(ListItem)); /* 略 */ /* 略 */ if (strlen(item_a->name) > 0) { /* 略 */ /* 略 */ db_register_list_item(item_a); } xfree(item_a); /* 略 */ /* 略 */ }
- 対応してなければfreeし忘れ。xallocとxfreeを検索すれば(正規表現なら x(alloc|free) とかで)、対応のずれがわかりやすい。
- 変数名が ‘_a’ で終わってる変数を使ったら後始末(xfree)が必要というのがわかる。(だから、breakとかする時にも気を付けないといけないというのもわかりやすい)
これが徹底されれば、危険なコードは危険な見た目に見えるようになるのではないかと思います。Starbug1はこんなルールで進めてみます。
例によってつっこみ歓迎です。あと、もっと良いコーディングルールを知ってたら教えてください。