Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ==12345== LEAK SUMMARY:
- ==12345== definitely lost: 1024 bytes in 1 blocks
- ==12345== indirectly lost: 2048 bytes in 2 blocks
- ==12345== possibly lost: 0 bytes in 0 blocks
- ==12345== still reachable: 4096 bytes in 1 blocks
- Definitely Lost
- ➤ Memori yang dialokasikan tetapi tidak dibebaskan dan tidak ada pointer yang mengarah padanya.
- ➤ Ini indikasi memory leak paling parah dan pasti.
- Indirectly Lost
- ➤ Memori yang tidak langsung hilang karena pointer yang mengarah ke struktur data induknya juga hilang.
- Possibly Lost
- ➤ Valgrind menemukan pointer, tapi tidak bisa memastikan apakah masih bisa diakses dengan aman.
- Still Reachable
- ➤ Memori masih bisa diakses pada saat program selesai, tetapi tidak dibebaskan. Biasanya tidak menyebabkan kebocoran besar, tapi tetap disarankan dibebaskan.
- Langkah-langkah Analisis Pseudocode:
- 1. Jalankan program dengan Valgrind: valgrind --leak-check=full ./program
- 2. Catat fungsi/fungsi mana yang disebut di bagian "stack trace" kebocoran.
- 3. Telusuri dari atas ke bawah: perhatikan alokasi malloc, calloc, realloc.
- 4. Cari apakah pointer tersebut:
- a. Dilepaskan (free) atau tidak.
- b. Diperbarui (misalnya overwrite pointer).
- 5. Tandai lokasi yang mencurigakan.
- 6. Uji ulang setelah menambahkan free().
- [Run Program w/ Valgrind]
- ↓
- [Valgrind Shows Leak Summary]
- ↓
- [Periksa Fungsi & Baris dari Trace]
- ↓
- [Identifikasi malloc() tanpa free()]
- ↓
- [Tambahkan free() / Perbaiki Alur]
- ↓
- [Uji Ulang]
- */
- #include <stdio.h> // Header untuk fungsi input/output, seperti printf
- #include <stdlib.h> // Header untuk fungsi manajemen memori, seperti malloc dan free
- // Fungsi yang awalnya mengandung memory leak
- void create_dynamic_memory_leak() {
- int *ptr = (int *)malloc(sizeof(int)); // Alokasikan memori sebesar satu integer dan simpan alamatnya di pointer ptr
- if (ptr == NULL) { // Cek apakah malloc gagal mengalokasikan memori (mengembalikan NULL)
- printf("Memory allocation failed\n"); // Jika gagal, tampilkan pesan error
- return; // Keluarkan fungsi agar tidak lanjut ke penggunaan memori yang tidak valid
- }
- *ptr = 42; // Isi memori yang dialokasikan dengan nilai 42
- printf("Value: %d\n", *ptr); // Cetak nilai yang disimpan di lokasi memori yang ditunjuk ptr
- // Perbaikan: membebaskan memori
- free(ptr); // Bebaskan memori yang sudah tidak digunakan untuk mencegah memory leak
- }
- // Fungsi yang awalnya mengakses memori tidak terinisialisasi
- void access_uninitialized_memory() {
- int x = 10; // Deklarasi variabel integer x dan inisialisasi dengan nilai 10
- int *ptr = &x; // Pointer ptr diinisialisasi dengan alamat variabel x (memori valid)
- printf("Initialized value: %d\n", *ptr); // Cetak nilai yang ditunjuk oleh ptr, yaitu nilai dari x
- }
- int main() {
- create_dynamic_memory_leak(); // Panggil fungsi untuk demonstrasi alokasi dan dealokasi memori dinamis
- access_uninitialized_memory(); // Panggil fungsi untuk demonstrasi pointer yang sudah terinisialisasi dengan benar
- return 0; // Akhiri program dengan kode sukses 0
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement