[Defect Weekly] Isu 31: Keluaran memori yang salah

WBOY
Lepaskan: 2023-05-23 23:07:35
ke hadapan
1317 orang telah melayarinya

1. Kaedah pelepasan memori yang salah

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.

2. Bahaya kaedah pelepasan memori yang salah

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)。

3. Kod sampel

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.

3.1 Kod Kecacatan

[Defect Weekly] Isu 31: Keluaran memori yang salah

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:

[Defect Weekly] Isu 31: Keluaran memori yang salah

Rajah 1: Contoh pengesanan kaedah pelepasan memori yang salah

3.2 Kod pembaikan

[Defect Weekly] Isu 31: Keluaran 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:

[Defect Weekly] Isu 31: Keluaran memori yang salah

Rajah 2: Hasil pengesanan selepas pembaikan

4 🎜>

Untuk mengelakkan kaedah pelepasan memori yang salah, anda perlu memberi perhatian kepada perkara berikut:

(1) Apabila melepaskan memori, jelaskan kaedah yang digunakan untuk aplikasi memori untuk mengelakkan struktur program yang kompleks dan kecuaian kakitangan Akibatnya, kaedah pelepasan yang salah digunakan.

(2) Menggunakan alat analisis statik kod sumber dapat mengesan jenis masalah ini dengan berkesan.

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!