Maison > Article > Opération et maintenance > [Defect Weekly] Numéro 31 : Mauvaise 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++的内存申请/释放,或混合使用标量和矢量的内存申请/释放。
错误地释放内存可能会导致程序出现意料之外的错误行为,甚至导致程序崩溃。在《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. Les méfaits des méthodes de libération de mémoire incorrectes
Une 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.
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 . |
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 : #🎜🎜##🎜🎜##🎜🎜##🎜🎜##🎜🎜#Figure 1 : Exemple de détection d'une mauvaise méthode de libération de mémoire#🎜🎜# à 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!