C言語では、ストレージ指定子に応じて変数は異なる方法で初期化されます:
違いの例:
void example() { int a; // 自動、未初期化 static int b; // 0として初期化された printf("a=%d, b=%d ", a, b); } int c; // グローバル、0として初期化された
エラーは初期化に関する誤った仮定から生じます。安全のために、変数を常に明示的に初期化してください。
関数のブロック外で宣言された自動ローカル変数は0として初期化されるか?
回答:
いいえ!関数の最初に変数が宣言されていても、明示的な初期化がなければ、ゴミ値が入っています:
void f() { int x; printf("%d ", x); // UB: xは未初期化 }
物語
銀行ソフトウェアでの関数内のカウンターの初期化を怠った結果、時には巨大な負の数となり、クライアントに誤ったボーナスが付与されるという問題が発生し、実データでのみバグが発見されました。
物語
画像のマルチメディア処理機能は、静的配列が常にゼロで満たされていると仮定していました。別のコンパイラに移行した後、セグメンテーションフォルトが発生し、メモリの一部がプロセスに物理的に割り当てられていないことが明らかになりました。
物語
暗号化ライブラリの開発者は、グローバルセクションからのバッファがゼロで満たされていると考え、一時的なパスワードバッファを初期化しなかったため、古い機密データが残っているメモリのケースが発生しました。これにより、ダンプ時にパスワードが漏洩しました。