GNU/Linux >> Belajar Linux >  >> Linux

valgrind - Alamat ---- adalah 0 byte setelah blok berukuran 8 dialokasikan

strcpy menambahkan karakter null terminator '\0' . Anda lupa mengalokasikan ruang untuk itu:

*filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);

Anda perlu menambahkan spasi untuk 5 karakter:4 untuk ".tde" akhiran, dan satu lagi untuk '\0' terminator. Kode Anda saat ini hanya mengalokasikan 4, jadi penulisan terakhir dilakukan ke ruang segera setelah blok yang telah Anda alokasikan untuk nama file baru (yaitu 0 byte setelahnya).

Catatan: Kode Anda memiliki masalah umum - kode memberikan hasil realloc langsung ke pointer yang sedang dialokasikan kembali. Ini bagus ketika realloc berhasil, tetapi membuat kebocoran memori saat gagal. Memperbaiki kesalahan ini memerlukan penyimpanan hasil dari realloc dalam variabel terpisah, dan memeriksanya untuk NULL sebelum menetapkan nilai kembali ke *filename :

char *tmp = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5);
if (tmp != NULL) {
    *filename = tmp;
} else {
    // Do something about the failed allocation
}

Menetapkan langsung ke *filename membuat kebocoran memori, karena penunjuk *filename telah menunjuk ke bawah akan ditimpa jika gagal, menjadi tidak dapat dipulihkan.


Linux
  1. Fail2Ban Howto:Memblokir Alamat IP Menggunakan Fail2ban dan IPTables

  2. Cara portabel untuk mendapatkan ukuran file (dalam byte) di shell?

  3. Apakah realloc menjaga penyelarasan memori posix_memalign?

  1. Ukuran blok yang bagus untuk kloning disk dengan diskdump (dd)

  2. Tentukan ukuran perangkat blok

  3. bagaimana ukuran halaman ditentukan dalam ruang alamat virtual?

  1. Pengecualian ukuran blok ilegal – CKR_ENCRYPTED_DATA_LEN_RANGE [SoftHSM]

  2. Perbedaan Antara Ukuran Blok Dan Ukuran Cluster?

  3. Bagaimana cara menghentikan perubahan alamat MAC setelah memutuskan sambungan?