Экспонировать память только для чтения - PullRequest
2 голосов
/ 07 марта 2009

В Си функция может раскрыть память, которой она «управляет» на более низком уровне, как только для чтения тем, кто вызывает эту функцию (выставляя свой адрес). return * const неэффективно, но мне было интересно, пропустил ли я тик программирования?

Спасибо.

const uint8_t * get_value(int index) 
{
static uint8_t data[2] = {0, 0};
return (const uint8_t *)&data[index];
}

int main(void)
{
uint8_t * value;
value = get_value(1);

*value += 1;
return 0;
}

@ j_random_hacker Предложил хороший компромисс на мой вопрос, который создает дополнительный барьер, который я ищу, для предотвращения случайного неправильного использования этих данных.

typedef struct
{
    const uint8_t * value;
    const uint8_t size;

} readonly_t;

readonly_t get_value(int index, int size) 
{
    static uint8_t data[2] = {0, 0};
    uint8_t rsize;

    /* ... validate index, size params */

    readonly_t r = { &data[index], rsize };
    return r;
}

Ответы [ 4 ]

6 голосов
/ 07 марта 2009

Это C! Вы не можете :) Всегда есть способ обойти это. Просто сделайте это const и надеюсь, что кто-нибудь не изменит его.

Если вы размещаете надстройку или что-то еще, вы должны запустить ее в отдельном процессе, чтобы ограничить ее доступ к памяти.

1 голос
/ 07 марта 2009

Не возвращать указатель, возвращать указатель на значение объекта, как в:

uint8_t get_value(int index) 
{
    static uint8_t data[2] = {0, 0};
    return data[index];
}
1 голос
/ 07 марта 2009
0 голосов
/ 09 марта 2009

Защита памяти не является языковой конструкцией в 'C, она связана с аппаратным обеспечением. Например, если память, на которую указывает указатель, находится в некоторой области ПЗУ или что-то еще, запись невозможна. И наоборот, мы можем даже сделать часть ReadOnly на аппаратном уровне, тогда вы можете ожидать некоторое исключение памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...