Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk menggunakan AddressSanitizer untuk menyahpepijat ralat akses memori C++?

Bagaimana untuk menggunakan AddressSanitizer untuk menyahpepijat ralat akses memori C++?

WBOY
WBOYasal
2024-06-02 17:38:01331semak imbas

AddressSanitizer (ASan) mengesan ralat memori dengan menyemak setiap capaian memori dalam program C++. Untuk mendayakan ASan, tambahkan bendera -fsanitize=address pada arahan compile. Apabila didayakan, ASan akan melaporkan ralat seperti membaca pembolehubah yang tidak dimulakan, menulis di luar had atau menggunakan memori yang dibebaskan. ASan juga boleh digunakan untuk mengesan kebocoran memori, pembangun boleh mendayakan ciri ini menggunakan bendera -fsanitize=leak.

Bagaimana untuk menggunakan AddressSanitizer untuk menyahpepijat ralat akses memori C++?

Cara menggunakan AddressSanitizer untuk menyahpepijat ralat capaian memori C++

Pengenalan
AddressSanitizer (ASan) ialah alat yang membantu mengesan ralat yang tidak berkaitan dengan memori dalam program C++, seperti pembolehubah membaca, menulis di luar program. sempadan atau menggunakan memori yang dibebaskan. ASan berfungsi dengan memeriksa setiap capaian memori program dan melaporkan sebarang pelanggaran peraturan keselamatan.

Dayakan ASan
Untuk mendayakan ASan, cuma tambahkan bendera -fsanitize=address pada arahan compile. Bendera ini memautkan perpustakaan ASan ke dalam program dan membolehkan pemeriksaan tambahan pada akses memori. -fsanitize=address 标志。此标志会将 ASan 库链接到程序,并启用对内存访问的附加检查。

g++ -fsanitize=address main.cpp -o main

运行程序
启用 ASan 后,可以像往常一样运行程序。但是,现在 ASan 会检测并报告任何内存访问错误。如果程序出现错误,ASan 将打印一条错误消息并终止程序。错误消息将包含有关错误的详细信息,例如错误发生的代码行以及哪个内存地址被非法访问。

示例
让我们考虑一个简单的 C++ 程序,它使用未初始化的变量:

int main() {
  int x;
  std::cout << x << std::endl;  // 未初始化的变量
}

使用 ASan 编译并运行此程序会产生以下输出:

==14569==ERROR: AddressSanitizer: stack-use-after-scope on address 0x7fffffffd7e0 at pc 0x40102e bp 0x7fffffffd770 sp 0x7fffffffd7d0
  READ of size 4 at 0x7fffffffd7e0 thread T0
    #0 0x40102c in main /home/user/asan_example.cpp:5
    #1 0x7f40a7bddc9c in __libc_start_main /build/glibc-eXfix9/glibc-2.35/csu/../csu/libc-start.c:314

此错误消息告诉我们:

  • 发生了堆栈使用超出范围的错误。
  • 错误发生在 main 函数的第 5 行。

通过仔细检查代码,我们可以看到错误是由尝试使用未初始化的变量 x 引起的。

实战案例:内存泄露
ASan 还可用于检测内存泄露,这是指程序分配了内存但未释放造成的问题。内存泄露会导致程序的内存使用随时间推移而不断增加,最终导致崩溃或性能下降。

要检测内存泄露,需要使用 -fsanitize=leakrrreee

Jalankan programSelepas membolehkan ASan, anda boleh menjalankan program seperti biasa. Walau bagaimanapun, ASan kini mengesan dan melaporkan sebarang ralat capaian memori. Jika ralat berlaku dalam atur cara, ASan akan mencetak mesej ralat dan menamatkan atur cara. Mesej ralat akan mengandungi maklumat terperinci tentang ralat, seperti baris kod tempat ralat berlaku dan alamat memori yang diakses secara haram. . ralat penggunaan tindanan di luar julat berlaku.

  • Ralat berlaku pada baris 5 fungsi utama.

  • Dengan memeriksa kod dengan teliti, kita dapat melihat bahawa ralat disebabkan oleh cubaan menggunakan pembolehubah yang tidak dimulakan x. 🎜🎜Kes Praktikal: Kebocoran Memori🎜🎜ASan juga boleh digunakan untuk mengesan kebocoran memori, yang merujuk kepada masalah yang disebabkan oleh program yang memperuntukkan memori tetapi tidak melepaskannya. Kebocoran memori menyebabkan penggunaan memori program meningkat dari semasa ke semasa, akhirnya membawa kepada ranap atau penurunan prestasi. 🎜🎜Untuk mengesan kebocoran memori, gunakan bendera kompilasi -fsanitize=leak. Bendera ini membolehkan pemeriksaan tambahan pada penggunaan memori dan melaporkan sebarang blok memori yang masih diperuntukkan apabila program ditamatkan. 🎜🎜🎜Kesimpulan🎜🎜AddressSanitizer ialah alat berkuasa yang membantu mengesan ralat berkaitan memori dalam program C++. Dengan mendayakan ASan dan menggunakan mesej ralat yang jelas, pembangun boleh mengenal pasti dan membetulkan ralat ini dengan cepat dan tepat, meningkatkan kebolehpercayaan dan keselamatan program. 🎜

    Atas ialah kandungan terperinci Bagaimana untuk menggunakan AddressSanitizer untuk menyahpepijat ralat akses memori C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    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