Programming組込みC開発者

C言語での異なるストレージ種別(自動、静的、グローバル)における変数の初期化方法は?これがプログラムの安全性と正確性にどのように影響するか?

Hintsage AIアシスタントで面接を突破

回答

C言語では、ストレージ指定子に応じて変数は異なる方法で初期化されます:

  • 自動(ローカル)変数:明示的に初期値を設定しない限り、未初期化(ゴミ)値を持ちます。内容は以前のスタックメモリです。
  • 静的ローカルおよびグローバル変数 (static, extern):常に初期化され、ゼロ(スカラーの場合は0、ポインタの場合はNULL)またはリンク時に設定された値になります。

違いの例:

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は未初期化 }

このトピックの微妙な点を知らないことで発生した実際のエラーの例


物語

銀行ソフトウェアでの関数内のカウンターの初期化を怠った結果、時には巨大な負の数となり、クライアントに誤ったボーナスが付与されるという問題が発生し、実データでのみバグが発見されました。


物語

画像のマルチメディア処理機能は、静的配列が常にゼロで満たされていると仮定していました。別のコンパイラに移行した後、セグメンテーションフォルトが発生し、メモリの一部がプロセスに物理的に割り当てられていないことが明らかになりました。


物語

暗号化ライブラリの開発者は、グローバルセクションからのバッファがゼロで満たされていると考え、一時的なパスワードバッファを初期化しなかったため、古い機密データが残っているメモリのケースが発生しました。これにより、ダンプ時にパスワードが漏洩しました。