エムゲーム・ジャパン ゲーム ミィア ブログ サークル マイエム Login

兵どもの夢の跡

ブログチャンネル
yuki002さん
 
 ブログトップ   マイブログ   ランダムブログ    
ブログ型ブログ型タイトル一覧タイトル一覧
17.メモリ・リーク[ソフトウェア考]  
詳細/おすすめ(3277/0) | ソーシャルブックマーク(0)  2009/08/12 17:10

メモリ・リーク とは

直訳すると【メモリー漏れ】ですが、そんな生易しい問題ではありません。

 

 

通常、データという物は可変型と固定型の2種類に分類できます。

整数型や浮動小数点型など、メモリー占有サイズは固定です。

対する文字列型の場合、サイズ固定では都合が悪いのです。

 

通常、文字列を扱う変数は そのサイズを十分な余裕を見積もってサイズを決定します。

これは真のデータサイズより はるかに大きいサイズにしておきます。

たとえば…

 

  char Str[] = "こんにちは。";

 

と 文字列サイズで初期化してしまうと、上の例では 13バイトの領域が確保され、

そこに 【こんにちは。:0】 が入ります。

 

  全角文字(2バイト) × 6文字 + NULL(ターミネタ) = 13バイト

 

と言うことなのです。

この変数に 【 あんたバカぁ?】 を代入すると どうなるでしょう。

13バイトの領域に15バイトは入りません。

通常はエラーに… と思うでしょうが、実際にはサイズを無視して代入を行ってしまうのです。

それは NULL 以外にサイズ決定要素が無いからです。

あらかじめ サイズを与えておかないと、エラー判定ができないのです。

 

上記の例では 変数は単独で考えていますが、現実には単独の変数が使われる事は稀です。

実際には…

 

  int  Count = 325;

  char Str[] = "こんにちは。";

  double RealSize 1.598715e16;

 

などのように、変数が順次定義されるものなのです。

この例では初期化を伴なっていますが、実際にはサイズのみ確保されます。

また初期化を伴なった文字列型では 固定文字列として定義します。

つまり読み出し専用という事です。

そうしないと 代入が行われ、その変数に続く変数が破壊されてしまうからです。

この破壊を メモリ・リーク と言います。

 

また、メモリ・リークを想定して、あらかじめ文字列変数は十分に大きなサイズを確保します。

 

 

 

バッファ オーバーラン と バッファ アンダーラン

 

先ほど 文字列変数には十分に大きな領域を割り当てると言いました。

この領域をバッファとも言います。

そして 領域を埋め尽くし、続く領域を破壊する事を バッファ オーバーラン と言います。

 

また、バッファの特定アドレスからマイナスオフセット方向にアクセスする場合もあります。

この場合は 文字列変数の前の変数が破壊されます。

これを バッファ アンダーラン と言います。

 

この現象は文字列変数が固定だから起こるのです。

このエラーは深刻で、変数領域がシステム領域に近いと、システムが破壊されたりします。

また ウィルスなど、このような方法でメモリーを傷付けPCを動作不能に陥れます。

 

このような現象は、あらかじめ 文字列の長さが分かっていれば、

必要なだけメモリーを確保すれば起こりません。

事実、最新の文字列処理方法は、必ずサイズを必要とし、その分だけメモリーを確保するので

プログラム自体をコンパクト化でき、より巨大なデータを扱えるようになっています。

現実に確保できるメモリーは搭載メモリーサイズに依存なのですが。

 

ウイルスなど、システムの脆弱性を狙って感染するのですが、

システム破壊が目的なら 固定サイズの文字列変数に対して行われ、

リモート制御による乗っ取りであれば サイズ可変の変数ポインタに対して感染工作が行われるのです。

そして バッファとは言ってもCPUからは普通にアクセスできる領域なので、

文字変数に書き込まれたウイルスをコードとして処理してしまいます。

その処理がバックドアであったり 感染用メールの作成送信であったりするわけです。

 

 

 

まとめ

 

通常、メモリリークはプログラマの仕様理解不足から起こります。

そして OSなど 重要な部分ではセキュリティの致命的欠陥となります。

ウィルス感染などでは、メモリリークが狙われ感染が拡大します。

その原因は全てポインタの安易な操作から起こる事で、

プログラマはハードを含めた処理系を知った上でコーディングする事が大切なのです。

そういう意味でも C系言語は高級アセンブラと言えるわけです。

 

 

この記事のURL /  カテゴリ /  コメント  / おすすめ  / 通報
   カテゴリが追加できません!
   カテゴリが追加できません!