Fungsi aplikasi memori biasa dalam bahasa C termasuk malloc()
, realloc()
, calloc()
Walaupun ia mempunyai fungsi yang berbeza, semuanya Bersesuaian kepada fungsi pelepasan memori yang sama free()
, aplikasi memori dan keluaran dalam C++ menggunakan kaedah baru/padam, baru []/padam[]. Tidak kira sama ada bahasa C atau bahasa C++, semasa menulis kod sumber, anda mesti memilih kaedah pelepasan memori mengikut kaedah aplikasi memori yang berbeza untuk mengelakkan penggunaan keluaran memori yang salah. Contohnya: penggunaan campuran peruntukan/pelepasan memori C/C++, atau penggunaan campuran peruntukan/pelepasan memori skalar dan vektor.
Membebaskan memori yang salah boleh menyebabkan tingkah laku ralat yang tidak dijangka, atau malah menyebabkan program ranap. Perkara 5 "C++ (Edisi Kedua) Berkesan" "Baharu dan pemadaman yang sepadan mesti menggunakan bentuk yang sama" menunjukkan: "Jika unsur-unsur dalam objek dilepaskan secara tidak betul, ia boleh menyebabkan keseluruhan objek atau bahkan keseluruhan struktur memori menyala. timbunan itu rosak, mengakibatkan kebocoran memori atau ranap program."
Terdapat juga maklumat kelemahan yang berkaitan dengan ini dalam pangkalan data CVE. Dari Januari 2018 hingga April 2019, terdapat sejumlah 3 maklumat kerentanan berkaitan dalam pangkalan data CVE. Maklumat kerentanan adalah seperti berikut:
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)。 |
Sampel datang daripada Samate Juliet Test Suite untuk C/C++ v1.3 (https: //samate. nist.gov/SARD/testsuite.php), nama fail sumber: CWE762_Mismatched_Memory_Management_Routines__new_array_delete_char_01.cpp.
Dalam kod contoh di atas, baris 31 menggunakan new[]
untuk mencipta tatasusunan objek, dan dalam baris 34 Baris menggunakan delete
untuk pelepasan Memandangkan new[]
yang sepadan delete[]
tidak digunakan semasa melepaskan tatasusunan objek, terdapat masalah "kaedah pelepasan memori yang salah".
Gunakan Pelindung Kod untuk mengesan kod sampel di atas Anda boleh mengesan kecacatan "kaedah pelepasan memori yang salah", dan tahap paparan adalah sederhana. Seperti yang ditunjukkan dalam Rajah 1:
Rajah 1: Contoh pengesanan kaedah pelepasan memori yang salah
Dalam kod pembaikan di atas, kaedah pembaikan yang diberikan oleh Samate ialah: buat tatasusunan objek melalui new[]
pada baris 31, dan gunakan delete[]
pada baris 33 untuk melepaskan . Ini mengelakkan kaedah pelepasan memori yang salah.
Gunakan Pengawal Kod untuk mengesan kod yang telah dibaiki, dan anda boleh melihat bahawa kecacatan "kaedah pelepasan memori yang salah" tidak lagi wujud. Seperti yang ditunjukkan dalam Rajah 2:
Rajah 2: Hasil pengesanan selepas pembaikan
Atas ialah kandungan terperinci [Defect Weekly] Isu 31: Keluaran memori yang salah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!