Maison  >  Article  >  Opération et maintenance  >  [Defect Weekly] Numéro 31 : Mauvaise libération de mémoire

[Defect Weekly] Numéro 31 : Mauvaise libération de mémoire

WBOY
WBOYavant
2023-05-23 23:07:351320parcourir

1. Mauvaise méthode de libération de mémoire

Les fonctions courantes d'application de mémoire en langage C incluent malloc( ), realloc(), calloc(), bien qu'ils aient des fonctions différentes, ils correspondent tous à la même fonction de libération de mémoire free() L'application et la libération de mémoire en C++ utilisent new/delete, nouvelle méthode []/delete[]. Qu'il s'agisse du langage C ou du langage C++, lors de l'écriture du code source, vous devez choisir la méthode de libération de mémoire en fonction des différentes méthodes d'application de la mémoire pour éviter d'utiliser la mauvaise version de mémoire. Par exemple : utilisation mixte de l'allocation/libération de mémoire C/C++, ou utilisation mixte de l'allocation/libération de mémoire scalaire et vectorielle. malloc()realloc()calloc(),它们虽然功能不同,但都对应同一个内存释放函数 free(),C++中对内存的申请和释放采用new/delete、new []/delete[] 方式。不管是 C 语言还是 C++ 语言,当编写源代码时要根据内存申请的方法不同来对应地选择内存释放方法,避免使用错误的内存释放。例如:混合使用C/C++的内存申请/释放,或混合使用标量和矢量的内存申请/释放。

2、 错误的内存释放方法的危害

错误地释放内存可能会导致程序出现意料之外的错误行为,甚至导致程序崩溃。在《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)。

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] Numéro 31 : Mauvaise libération de mémoire

在上述示例代码中,第31行使用 new[] 创建对象数组,在第34行使用 delete 进行释放,由于在释放对象数组时,没有使用 new[] 对应的 delete[],因此存在“错误的内存释放方法”问题。

使用代码卫士对上述示例代码进行检测,可以检出“错误的内存释放方法”缺陷,显示等级为中。如图1所示:

[Defect Weekly] Numéro 31 : Mauvaise libération de mémoire

图1:错误的内存释放方法的检测示例

3.2 修复代码

[Defect Weekly] Numéro 31 : Mauvaise libération de mémoire

在上述修复代码中,Samate 给出的修复方式为:在第31行通过 new[] 创建对象数组,并在第33行使用 delete[]

2. Les méfaits des méthodes de libération de mémoire incorrectes

[Defect Weekly] Numéro 31 : Mauvaise libération de mémoireUne libération de mémoire incorrecte peut provoquer un comportement erroné inattendu du programme, voire provoquer le programme s'écraser. L'article 5 de "Effective C++ (Second Edition)" "Les new et delete correspondants doivent adopter la même forme" souligne : "Si les éléments de l'objet sont libérés de manière incorrecte, cela peut entraîner la destruction de l'objet entier ou même de la structure mémoire entière. le tas doit être endommagé. La corruption peut entraîner des fuites de mémoire ou même des plantages de programmes.

Il existe également des informations de vulnérabilité liées à cela dans la base de données CVE. De janvier 2018 à avril 2019, il y avait un total de 3 informations de vulnérabilité associées dans la base de données CVE. Les informations sur la vulnérabilité sont les suivantes :

CVE Présentation de la vulnérabilité
CVE-2018-14948 Le fichier wav-file.cc dans Dilawar Sound2017-11-27 et versions précédentes Il existe une vulnérabilité de méthode de libération de mémoire incorrecte (new[]/delete).
CVE-2018-14947 La fonction 'XmlFontAccu::CSStyle' du fichier XmlFonts.cc dans PDF2JSON version 0.69 présente une vulnérabilité de libération de mémoire incorrecte ( nouveau[]/supprimer).
CVE-2018-14946 Le fichier ImgOutputDev.cc dans PDF2JSON version 0.69 présente une vulnérabilité de méthode de mémoire incorrecte (malloc/delete) dans la classe HtmlString .

3. Exemple de code

L'échantillon provient de Samate Juliet Test Suite for C. / C++ v1.3 (https://samate.nist.gov/SARD/testsuite.php), nom du fichier source : CWE762_Mismatched_Memory_Management_Routines__new_array_delete_char_01.cpp.

3.1 Code défaut

[Defects Weekly] Issue 31 : Wrong Memory Release

Dans l'exemple de code ci-dessus, la ligne 31 utilise new[] crée un tableau d'objets et le libère en utilisant delete à la ligne 34. Lors de la libération du tableau d'objets, la classe new[] correspondant delete[] n'est pas utilisé, il existe donc "Mémoire incorrecte problème de méthode de libération". #🎜🎜##🎜🎜#Utilisez Code Guard pour détecter l'exemple de code ci-dessus, et vous pouvez détecter le défaut de "mauvaise méthode de libération de mémoire", et le niveau d'affichage est moyen. Comme le montre la figure 1 : #🎜🎜##🎜🎜#【Discussion hebdomadaire sur les défauts #🎜🎜##🎜🎜##🎜🎜#Figure 1 : Exemple de détection d'une mauvaise méthode de libération de mémoire#🎜🎜#

#🎜🎜#3.2 Code de réparation# 🎜🎜 #

#🎜🎜#[Défauts hebdomadaires] Problème du chapitre 31 : faux libération de mémoire#🎜🎜##🎜🎜#Dans le code de réparation ci-dessus, la méthode de réparation donnée par Samate est : passer à la ligne 31 new[] code> crée un tableau d'objets et le libère en utilisant <code class="prettyprint code-in-text Prettyprinted">delete[] à la ligne 33. Cela évite les méthodes incorrectes de libération de mémoire. #🎜🎜##🎜🎜#Utilisez Code Guard pour détecter le code réparé, et vous pourrez voir que le défaut "mauvaise méthode de libération de mémoire" n'existe plus. Comme le montre la figure 2 : #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜# Figure 2 : Résultats de détection après réparation#🎜🎜##🎜🎜##🎜🎜#4 . Comment éviter les mauvaises méthodes de libération de mémoire #🎜🎜##🎜🎜##🎜🎜# Pour éviter les mauvaises méthodes de libération de mémoire, vous devez faire attention aux points suivants : #🎜🎜##🎜🎜# (1) Lors de la libération mémoire, soyez clair La méthode utilisée pour l'application de la mémoire évite d'utiliser la mauvaise méthode de libération en raison de la structure complexe du programme et de la négligence du personnel. #🎜🎜##🎜🎜# (2) L'utilisation d'outils d'analyse statique du code source permet de détecter efficacement ce type de problème. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Comment configurer Cisco 2960Article suivant:Comment configurer Cisco 2960