Advertisement
JavierGumin

Valgrind

Jun 4th, 2025
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.30 KB | None | 0 0
  1. /*
  2. ==12345== LEAK SUMMARY:
  3. ==12345== definitely lost: 1024 bytes in 1 blocks
  4. ==12345== indirectly lost: 2048 bytes in 2 blocks
  5. ==12345== possibly lost: 0 bytes in 0 blocks
  6. ==12345== still reachable: 4096 bytes in 1 blocks
  7.  
  8. Definitely Lost
  9. ➤ Memori yang dialokasikan tetapi tidak dibebaskan dan tidak ada pointer yang mengarah padanya.
  10. ➤ Ini indikasi memory leak paling parah dan pasti.
  11.  
  12. Indirectly Lost
  13. ➤ Memori yang tidak langsung hilang karena pointer yang mengarah ke struktur data induknya juga hilang.
  14.  
  15. Possibly Lost
  16. ➤ Valgrind menemukan pointer, tapi tidak bisa memastikan apakah masih bisa diakses dengan aman.
  17.  
  18. Still Reachable
  19. ➤ Memori masih bisa diakses pada saat program selesai, tetapi tidak dibebaskan. Biasanya tidak menyebabkan kebocoran besar, tapi tetap disarankan dibebaskan.
  20.  
  21.  Langkah-langkah Analisis Pseudocode:
  22.  
  23. 1. Jalankan program dengan Valgrind: valgrind --leak-check=full ./program
  24. 2. Catat fungsi/fungsi mana yang disebut di bagian "stack trace" kebocoran.
  25. 3. Telusuri dari atas ke bawah: perhatikan alokasi malloc, calloc, realloc.
  26. 4. Cari apakah pointer tersebut:
  27.    a. Dilepaskan (free) atau tidak.
  28.    b. Diperbarui (misalnya overwrite pointer).
  29. 5. Tandai lokasi yang mencurigakan.
  30. 6. Uji ulang setelah menambahkan free().
  31.  
  32. [Run Program w/ Valgrind]
  33.          ↓
  34. [Valgrind Shows Leak Summary]
  35.          ↓
  36. [Periksa Fungsi & Baris dari Trace]
  37.          ↓
  38. [Identifikasi malloc() tanpa free()]
  39.          ↓
  40. [Tambahkan free() / Perbaiki Alur]
  41.          ↓
  42. [Uji Ulang]
  43. */
  44.  
  45. #include <stdio.h>    // Header untuk fungsi input/output, seperti printf
  46. #include <stdlib.h>   // Header untuk fungsi manajemen memori, seperti malloc dan free
  47.  
  48. // Fungsi yang awalnya mengandung memory leak
  49. void create_dynamic_memory_leak() {
  50.     int *ptr = (int *)malloc(sizeof(int));  // Alokasikan memori sebesar satu integer dan simpan alamatnya di pointer ptr
  51.     if (ptr == NULL) {                       // Cek apakah malloc gagal mengalokasikan memori (mengembalikan NULL)
  52.         printf("Memory allocation failed\n"); // Jika gagal, tampilkan pesan error
  53.         return;                             // Keluarkan fungsi agar tidak lanjut ke penggunaan memori yang tidak valid
  54.     }
  55.     *ptr = 42;                             // Isi memori yang dialokasikan dengan nilai 42
  56.     printf("Value: %d\n", *ptr);           // Cetak nilai yang disimpan di lokasi memori yang ditunjuk ptr
  57.  
  58.     //  Perbaikan: membebaskan memori
  59.     free(ptr);                             // Bebaskan memori yang sudah tidak digunakan untuk mencegah memory leak
  60. }
  61.  
  62. // Fungsi yang awalnya mengakses memori tidak terinisialisasi
  63. void access_uninitialized_memory() {
  64.     int x = 10;                           // Deklarasi variabel integer x dan inisialisasi dengan nilai 10
  65.     int *ptr = &x;                       // Pointer ptr diinisialisasi dengan alamat variabel x (memori valid)
  66.     printf("Initialized value: %d\n", *ptr); // Cetak nilai yang ditunjuk oleh ptr, yaitu nilai dari x
  67. }
  68.  
  69. int main() {
  70.     create_dynamic_memory_leak();       // Panggil fungsi untuk demonstrasi alokasi dan dealokasi memori dinamis
  71.     access_uninitialized_memory();       // Panggil fungsi untuk demonstrasi pointer yang sudah terinisialisasi dengan benar
  72.     return 0;                           // Akhiri program dengan kode sukses 0
  73. }
  74.  
  75.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement