Heim > Artikel > Betrieb und Instandhaltung > [Defect Weekly] Problem 31: Falsche Speicherfreigabe
Zu den allgemeinen Speicheranwendungsfunktionen in der C-Sprache gehören malloc()
, realloc()
, calloc()
, obwohl sie unterschiedliche Funktionen haben, entsprechen sie alle derselben Speicherfreigabefunktion free()
, Speicheranwendung und -freigabe in C++ übernehmen die Methoden new/delete, new []/delete[]. Unabhängig davon, ob es sich um eine C-Sprache oder eine C++-Sprache handelt, müssen Sie beim Schreiben von Quellcode die Speicherfreigabemethode entsprechend den verschiedenen Speicheranwendungsmethoden auswählen, um die Verwendung der falschen Speicherfreigabe zu vermeiden. Zum Beispiel: gemischte Verwendung der C/C++-Speicherzuweisung/-freigabe oder gemischte Verwendung der Skalar- und Vektorspeicherzuweisung/-freigabe. malloc()
、 realloc()
、 calloc()
,它们虽然功能不同,但都对应同一个内存释放函数 free()
,C++中对内存的申请和释放采用new/delete、new []/delete[] 方式。不管是 C 语言还是 C++ 语言,当编写源代码时要根据内存申请的方法不同来对应地选择内存释放方法,避免使用错误的内存释放。例如:混合使用C/C++的内存申请/释放,或混合使用标量和矢量的内存申请/释放。
错误地释放内存可能会导致程序出现意料之外的错误行为,甚至导致程序崩溃。在《effective C++(第二版)》条目5“对应的 new 和 delete 要采用相同形式”中指出:“如果错误地释放对象中的元素,可能造成整个对象、甚至整个堆上的内存结构都发生损坏,从而发生内存泄漏,甚至导致程序崩溃”。
在CVE数据库中,也有与此相关的漏洞信息。自2018年1月至2019年4月,CVE数据库中共有3条相关漏洞信息。漏洞信息如下:
CVE | 漏洞概况 |
---|---|
CVE-2018-14948 | dilawar sound2017-11-27 及之前版本中的 wav-file.cc文件存在错误的内存释放方法漏洞 (new[]/delete)。 |
CVE-2018-14947 | PDF2JSON 0.69 版本中的 XmlFonts.cc 文件的‘XmlFontAccu::CSStyle’函数存在错误的内存释放漏洞(new[]/delete)。 |
CVE-2018-14946 | PDF2JSON 0.69 版本中的 ImgOutputDev.cc 文件的 HtmlString 类存在错误的内存方法漏洞 (malloc/delete)。 |
示例源于 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。
在上述示例代码中,第31行使用 new[]
创建对象数组,在第34行使用 delete
进行释放,由于在释放对象数组时,没有使用 new[]
对应的 delete[]
,因此存在“错误的内存释放方法”问题。
使用代码卫士对上述示例代码进行检测,可以检出“错误的内存释放方法”缺陷,显示等级为中。如图1所示:
图1:错误的内存释放方法的检测示例
在上述修复代码中,Samate 给出的修复方式为:在第31行通过 new[]
创建对象数组,并在第33行使用 delete[]
2. Der Schaden falscher Speicherfreigabemethoden
Eine falsche Speicherfreigabe kann zu unerwartetem fehlerhaftem Verhalten des Programms oder sogar zum Absturz des Programms führen. Punkt 5 von „Effective C++ (Second Edition)“ „Die entsprechenden Neu- und Löschvorgänge müssen dieselbe Form annehmen“ weist darauf hin: „Wenn die Elemente im Objekt falsch freigegeben werden, kann dies dazu führen, dass das gesamte Objekt oder sogar die gesamte Speicherstruktur beschädigt wird.“ Der Heap kann beschädigt werden, was zu Speicherverlusten oder sogar Programmabstürzen führt.
CVE | Vulnerability Overview |
---|---|
CVE-2018-14948 | In der Datei wav-file.cc in dilawar sound2017-11 liegt ein Fehler vor -27 und frühere Versionen: Sicherheitslücke bei der Speicherfreigabemethode (new[]/delete). |
CVE-2018-14947 | Die Funktion „XmlFontAccu::CSStyle“ der Datei XmlFonts.cc in PDF2JSON Version 0.69 weist eine Sicherheitslücke aufgrund falscher Speicherfreigabe auf ( neu[]/löschen). |
CVE-2018-14946 | Die Datei ImgOutputDev.cc in PDF2JSON Version 0.69 weist eine Sicherheitslücke bezüglich falscher Speichermethoden (malloc/delete) in der HtmlString-Klasse auf . |
new nicht verwendet wird . []
entspricht delete[]
, es liegt also ein Problem mit der „falschen Speicherfreigabemethode“ vor. 🎜🎜Verwenden Sie Code Guard, um den oben genannten Beispielcode zu erkennen. Sie können den Fehler „Falsche Speicherfreigabemethode“ erkennen und die Anzeigeebene ist mittel. Wie in Abbildung 1 gezeigt: 🎜🎜🎜🎜🎜Abbildung 1: Erkennungsbeispiel einer falschen Speicherfreigabemethode🎜delete[ in Zeile 33 ]
zum Freigeben. Dies vermeidet falsche Speicherfreigabemethoden. 🎜🎜Verwenden Sie Code Guard, um den reparierten Code zu erkennen, und Sie können sehen, dass der Fehler „Falsche Speicherfreigabemethode“ nicht mehr besteht. Wie in Abbildung 2 dargestellt: 🎜🎜🎜🎜🎜🎜Abbildung 2: Erkennungsergebnisse nach der Reparatur🎜🎜🎜4. So vermeiden Sie falsche Speicherfreigabemethoden🎜🎜🎜Um falsche Speicherfreigabemethoden zu vermeiden, müssen Sie auf die folgenden Punkte achten :🎜🎜(1) Klären Sie beim Freigeben von Speicher die für die Speicheranwendung verwendete Methode, um zu vermeiden, dass aufgrund komplexer Programmstruktur und Nachlässigkeit des Personals die falsche Freigabemethode verwendet wird. 🎜🎜(2) Mithilfe statischer Quellcode-Analysetools kann diese Art von Problem effektiv erkannt werden. 🎜Das obige ist der detaillierte Inhalt von[Defect Weekly] Problem 31: Falsche Speicherfreigabe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!