Pertanyaan Apakah ada cara untuk (sebenarnya) melindungi objek dari yang dimodifikasi?


Itu const kualifikasi tipe menyebabkan kompilator untuk mengeluarkan pesan kesalahan dalam hal upaya untuk memodifikasi objek yang dinyatakan sebagai const, tetapi itu tidak cukup proteksi. Misalnya program berikut memodifikasi kedua elemen dari array yang dideklarasikan sebagai const:

#include <stdio.h>

int main(void)
{
    const char buf[2] = { 'a','b' };
    const char *const ptr = buf;
    unsigned long addr = (unsigned long)ptr;

    *(char *)addr = 'c';
    addr = addr + 1;
    *(char *)addr = 'd';

    printf("%c\n", buf[0]);
    printf("%c\n", buf[1]);
    return 0;
}

Jadi, ternyata kompilator tidak cukup penjaga untuk melindungi objek dari yang dimodifikasi. Bagaimana kita bisa mencegah hal semacam ini?


7
2018-04-12 13:28


asal


Jawaban:


Saya tidak berpikir lebih banyak perlindungan bisa maupun harus disediakan.

Bahasa pemrograman C memungkinkan Anda melakukan hampir semua hal yang Anda inginkan dengan bebas, terutama mengakses objek dari pointer. Namun, kebebasan tidak pernah gratis, jadi programmer C harus selalu berhati-hati (dan hindari casting jika tidak diperlukan).


3
2018-04-12 13:52



Alat standar untuk menemukan overruns memori watchpoints, atau breakpoint data seperti yang disebut dalam MS Visual Studio.

Jika Anda perlu melindungi objek Anda hanya untuk debugging, gunakan debugger Anda untuk mengatur titik pengamatan di dalam objek Anda. Bug akan ditemukan saat runtime (bukan waktu kompilasi) - ketika program Anda mencoba menulis ke alamat yang ditentukan, debugger akan menghentikannya.

Anda mungkin bisa aturlah arloji Anda dalam kode Anda, tetapi jumlah mereka terbatas (maksimumnya adalah 4 pada platform x86), jadi ini tidak dapat menjadi fitur tujuan umum dari program Anda.


0
2018-04-12 15:15



Saya pikir filosofi di balik perlindungan adalah kenyamanan orang yang menggunakan kode Anda sebagai perpustakaan siap dalam kode sendiri. Kalau tidak, jika memungkinkan untuk membuat objek benar-benar tidak dapat dimodifikasi dalam bahasa C, akan ada beberapa cracker yang dapat memodifikasi apa pun yang mereka inginkan :) :)


0
2018-04-12 15:33