3

私はFreeBSD のコーディング スタイルを読んでいて、とても気に入っています (縦にコンパクトなコードが好きなので)。ただし、これがあります:

すべての変数
を初期化する 常に変数を初期化する必要があります。いつも。毎回。フラグ -W を指定した gcc は、初期化されていない変数に対する操作をキャッチする場合がありますが、そうでない場合もあります。

正当化
信じられないほど多くの問題が、初期化されていないポインタまたは変数に最終的に遡ります。

変数に適切な初期値がない場合は、値を設定しないでおいたほうがよいのではないでしょうか。そうすれば、コンパイラはおそらく初期化されていない読み取りをキャッチします。これはトラップT *p = NULL表現であり、非常に役立つ可能性があります (またはそうでない可能性があります)。int personal_number = 0 /* but 0 is a valid personal number!!*/


明確にするために、 abasuのコメントに応えて、私の例は、利用可能な無効な値がない場合を説明しようとしています。質問したところ、ありえない値を使用してエラーやその他の状態をマークするのは素晴らしいとの回答がありましたしかし、常にそうであるとは限りません。例はたくさんあります: 8 ビットのピクセル値、速度ベクトルなど。


私が見ることができる「常に変数を初期化する」の有効な代替手段の1つは次のとおりです。

//logical place for declarations
T a;

/*code, for example to set up the environment for evaluating a*/

a = fooForA();

/*more code*/

fooThatUsesA(a);

これにより、初期化を忘れた場合に警告が表示され、バグが修正され、警告が削除されます。

4

4 に答える 4

5

すべての整数は有効な個人番号ですか?

そうでない場合は、無効な値を使用して初期化しますpersonal_number

そうであれば、personal_number自分自身を初期化していなくても、有効な個人番号である値を保持していますが、その値は不明です。したがって、0とにかく初期化します-問題(前の有効な番号、後の有効な番号)を導入していません。唯一の違いは、番号がわかっていることです。

もちろん、どちらの場合も、初期化に整数リテラルを使用するのではなく、次のようにする方がよいでしょう。

enum { INVALID_PERSONAL_NUMBER = -1 }

int personal_number = INVALID_PERSONAL_NUMBER;
于 2013-05-10T09:24:00.163 に答える
2

コンパイラは、多くの場合、初期化されていない変数の読み取りをキャッチしません。代わりに、彼らはその情報を使用して残りのコードについて推測し、最適化を実行する可能性が高く、新しいバグやさらに悪いバグが発生する可能性があります。

int get_personal_number(const char *name)
{
    int personal_number;
    if (name != NULL) {
        /* look up name in some array */
        personal_number = ...
    }
    return personal_number;
}

最適化コンパイラは、それが不可能であると推測し、チェックを排除します。同様の問題がセキュリティ バグの原因となっています。たとえば、 http: //blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.htmlを参照してください。nameNULL

代わりに、宣言時に最終的に正しい値で変数を初期化するように関数を書き直してください。これには、三項式などを使用して、多くの小さな関数を記述する必要がある場合がありますが、いずれにせよ、一般的にはこれがより優れたスタイルです。

于 2013-05-10T09:32:33.893 に答える
1

変数に適切な初期値がない場合は、値を設定しないでおいたほうがよいのではないでしょうか。

私の意見では、そうです。最新のコンパイラは、初期化されていない変数のエラーをキャッチするのに非常に優れており、clang 静的アナライザーは不気味なほど完璧です。後で実行時の問題を引き起こすようなものを入れるよりも、コンパイラに問題をキャッチしてもらう方がはるかに優れています。たとえば、ポインタを NULL に初期化すると、コンパイラの警告は抑制されますが、逆参照しようとしてもコア ダンプは停止しません。

ただし、最新のコンパイラを使用している場合は、おそらく C99 を使用しているため、適切な値がわかるまで変数を宣言する必要はありません。それが私がすることです。

于 2013-05-10T10:59:02.383 に答える