障害(バグ)の直接原因・根本原因(1)初期化漏れを知る!

目安時間:約 8分

障害(バグ)の直接原因にはどのようなものがあるのかを紹介していくシリーズ。

 

これらの直接原因を知ることは、同じような障害(バグ)の問題解析にも役立ちます。

 

また、根本原因を知ることは、自分が設計やプログラミングをする際に同様の障害(バグ)発生を未然に防ぐことにもつながります。

 

ぜひ、品質を向上させるためにも、お役立ていただければと思います。

 

第一弾は、「初期化漏れ」です。

 

初期化漏れによって、プログラム動作にどのような影響が生じるのかを学んでください。

 

 

スポンサーリンク

 

初期化漏れとはどのようなバグなのか?

初期化漏れとはどのような障害(バグ)なのでしょうか?

 

初期化漏れとは、変数の初期値を設定していない状態のことです。

 

本来は、初期値の設定をすべきであるが、されていない状態初期化漏れと呼びます。

 

とても単純なミスですが、なかなか気付かれずに、総合テストまで発覚しないケースも多々あります。それだけ、恐ろしい障害(バグ)であり、多発している障害原因の一つでもあります。

 

 

初期化漏れによるプログラム動作の影響とは?

初期化漏れにより、プログラムにどのような影響がでるのでしょうか?障害(バグ)とはどのようなものでしょうか?

 

あくまで一例に過ぎませんが、以下のようなケースが挙げられます。

 

  • 想定した計算結果が異なる
  • 想定した回数より多く(少なく)処理される
  • 想定した配列の値が使用されない
  • バッファオーバーフローを引き起こす
  • 文字化けや想定した文字列とは異なる
  • 処理は全て正常に終了しているはずが、関数の戻り値では異常終了になる

 

など様々です。

 

しかし、勘違いして欲しくないのは、初期化漏れにより上記のケースが多く発生しますが、他の直接原因の場合であっても、上記の障害(バグ)が発生しうるということです。

 

 

 

スポンサーリンク

 

初期化漏れの根本原因とは?

初期化が必要なケースは多岐にわたります。

 

まず、初期値を設定しておかなければいけない変数はどのようなものでしょうか?

 

  • 計算をするために一時的に格納しておく変数
  • ループ回数などの回数に使用する変数
  • 配列の添字などに使用する変数
  • 文字列を格納しておく変数(バッファ)

 

など。

 

ですが、変数は、全て初期値の設定が必要であると覚えたほうが安全です。

 

初心者のプログラマーは、変数を宣言すると、自動で0やNULLが設定されると勘違いしています。

 

この勘違いにより、あえて、初期値を設定していないケースが見受けられます。

 

特別に0やNULL以外の値を設定するようなケースであれば、初期値を設定するのですが、そうでなければあえて初期値の設定をしていないソースをよく見かけます。

 

まず、認識していただきたいのは、変数の宣言は、外部変数、内部変数共に、メモリ空間を確保するに過ぎないのです。初期化はされません

 

例えば、外部変数(グローバル変数)であれば、メモリの所定の空き番地に指定されたサイズ分の領域が確保されます。

 

int hensuu1;

 

これが外部変数の場合、このように宣言すると、4バイトの領域がメモリ空間のどこかに確保されるということです。そして、この時点では、その4バイトの領域の値は何になっているのか分からないのです。たまたま、0やNULLの場合もあるでしょう。しかし、その保証はどこにもありません。

 

内部変数(ローカル変数)も同様です。確保される領域が外部変数とは異なりますが、理屈は同じです。内部変数の場合は、スタック領域と呼ばれるところに確保されます。

 

ですので、明示的に、変数に対して、初期値を設定する必要があるのです。どの値に設定しておいたらよいのか分からない場合もあるかもしれません。

 

そのときは、数値であれば、「0」、文字列であれば、「NULL」を設定しておけば問題ありません。

 

また、見落としがちなこととして、変数を明示的に設定する場合は問題ないのですが、変数を設定しなくてもよいケースの場合、その変数の内容がどうなっているのかを考慮していないことがよくあります。エラーケースの場合などありがちです。

 

例えば、以下のソースの場合を考えてみましょう。

 

 

C言語の一例ですが、kansuu1という関数でパラメータの内容をチェックしています。

 

para1というパラメータの内容が0以外であれば、1を返す関数ですが、0の場合は、どんな値が返されるのでしょうか?

 

通常は、para1に0以外が渡されるのかもしれませんが、0が来た場合、単体テストでは、もしかするとretは0だったかもしれません。しかし、retに0が設定される保証はどこにもありません。

 

このように、retに設定されない場合の考慮がされていないケースがあります。このケースも、自動で変数に値が設定されると勘違いしていることに含まれるかもしれませんが、いわゆる考慮不足の部類になります。

 

以上のように、初期化漏れの根本原因はひとつではありませんが、概ね以下のようなものであると考えます。

 

  • 初期化が自動的にされると勘違いしている
  • 変数の設定をしないケースを考慮していない
  • 初期化するという考えがそもそもない

 

これらの根本原因を踏まえて、未然に同様の障害(バグ)を防ぐように心がけてください。

 

そもそもの障害(バグ)の直接原因・根本原因とは何か?については、障害(バグ)の2つの原因「直接原因」と「根本原因」を知るで確認してください。

 

スポンサーリンク


カテゴリ:問題管理 

ITエンジニアからコーチ・コンサル・カウンセラー・セラピストなどで起業してみませんか?
<管理人からのお知らせ>

ITエンジニアからコーチ、コンサル、カウンセラー、セラピストなどの起業家に転身している方が増えています。

管理人は、現在ネット集客コンサルタントとして活動しています。

ITエンジニアとしての強みを生かし、ネット集客システムを構築しながら、起業家に転身してみませんか?

Webから自動的にお客様(クライアント)を獲得し、安定的に稼げる方法をメルマガでお伝えしています。

興味があれば、下のメルマガ登録用バナーからメルマガ登録してください。

人気記事
プロフィール

こんにちは、管理人のあっきーです。

SE・プログラマになって30年の現役戦士です。

私が、30年のシステム開発経験で培ってきた困ったときの乗り越え方を教えます。

但し、対処法ではなく、私がお伝えするのは「思考法」です。

困ったときにこうすればよいという「行動」を教えても、その人にあうのかどうかはわかりません。ですから、「考え方」をお伝えするのです。

詳しいプロフィールは、
こちら。

最近の投稿
アーカイブ
カテゴリー
広告
ブログランキング参加しています。

ページの先頭へ