alloc系のコーディングルール

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はこんなルールで進めてみます。

例によってつっこみ歓迎です。あと、もっと良いコーディングルールを知ってたら教えてください。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください