ホームページ  >  記事  >  運用・保守  >  [Defect Weekly] 第 31 号: 間違ったメモリ解放

[Defect Weekly] 第 31 号: 間違ったメモリ解放

WBOY
WBOY転載
2023-05-23 23:07:351383ブラウズ

1. 間違ったメモリ解放方法

C 言語の一般的なメモリ アプリケーション関数には、malloc()realloc()、# などがあります。 ##calloc()、関数は異なりますが、すべて同じメモリ解放関数 free() に対応します。C でのメモリの適用と解放には、new/delete、new [] が使用されます。 /delete[]メソッド。 C言語であってもC言語であっても、ソースコードを記述する際には、メモリの利用方法の違いに応じてメモリの解放方法を選択し、間違ったメモリ解放を行わないようにする必要があります。例: C/C メモリ割り当て/解放の混合使用、またはスカラー メモリとベクトル メモリ割り当て/解放の混合使用。

2. 間違ったメモリ解放方法の害

メモリを間違って解放すると、プログラムに予期せぬ誤った動作が発生したり、プログラムがクラッシュしたりする可能性があります。 「Effective C (Second Edition)」の項目 5「対応する new と delete は同じ形式を採用する必要がある」は次のように指摘しています。「オブジェクト内の要素が誤って解放されると、オブジェクト全体、さらにはオブジェクト上のメモリ構造全体が破壊される可能性があります。」ヒープが損傷する可能性があります。破損し、メモリ リークやプログラムのクラッシュを引き起こします。」

これに関連する脆弱性情報も CVE データベースにあります。 2018 年 1 月から 2019 年 4 月までに、CVE データベースには合計 3 件の関連脆弱性情報がありました。脆弱性情報は次のとおりです。

##CVECVE-2018-14948dilawar sound2017-11-27 および以前のバージョンの wav-file.cc ファイルには、不正なメモリ解放方法の脆弱性があります (new[]/消去) 。 CVE-2018-14947PDF2JSON バージョン 0.69 の XmlFonts.cc ファイルの「XmlFontAccu::CSStyle」関数に不正なメモリ解放の脆弱性があります (新しい[] /削除)。 CVE-2018-14946PDF2JSON バージョン 0.69 の ImgOutputDev.cc ファイルの HtmlString クラスに、不正なメモリ メソッドの脆弱性 (malloc/delete) が存在します。
脆弱性の概要

3. サンプル コード

この例は、Samate Juliet Test Suite for C/C v1.3 (https:/) からのものです。 /samate.nist.gov/SARD/testsuite.php)、ソースファイル名: CWE762_Mismatched_Memory_Management_Routines__new_array_delete_char_01.cpp。

3.1 欠陥コード[Defect Weekly] 第 31 号: 間違ったメモリ解放

上記のコード例では、31 行目は new[] を使用して作成されています。オブジェクト配列は、34 行目の delete を使用して解放されます。オブジェクト配列を解放するときに new[]

が使用されないため、対応する

delete[]

が存在します。メモリ解放方法が間違っている」問題。

[Defect Weekly] 第 31 号: 間違ったメモリ解放コードガードを使用して上記サンプルコードを検出すると、「メモリ解放方法が間違っている」不具合が検出でき、表示レベルは中程度です。図 1 に示すように:

図 1: 間違ったメモリ解放方法の検出例

3.2 修復コード[Defect Weekly] 第 31 号: 間違ったメモリ解放

#上記の修復コードで、Samate によって指定された修復方法は次のとおりです。 31 行目の new[] を通じてオブジェクト配列を作成し、33 行目で次のコマンドを使用します。

delete[]

を解除してください。これにより、間違ったメモリ解放方法が回避されます。

Code Guard を使用して修復されたコードを検出すると、「間違ったメモリ解放方法」の欠陥が存在しないことがわかります。図 2 に示すように: [Defect Weekly] 第 31 号: 間違ったメモリ解放

図 2: 修復後の検出結果

4. 間違ったメモリ解放方法を回避する方法

間違ったメモリ解放方法を避けるためには、以下の点に注意する必要があります。

(1) メモリ解放の際は、メモリの適用方法を明確にし、プログラム構造が複雑にならないようにする結果として、間違ったリリース方法が使用されます。

###(2) ソース コードの静的解析ツールを使用すると、この種の問題を効果的に検出できます。 ###

以上が[Defect Weekly] 第 31 号: 間違ったメモリ解放の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。