Защита памяти от изменения - PullRequest
0 голосов
/ 23 сентября 2011

Есть ли способ защитить область памяти?

У меня есть такая структура:

#define BUFFER 4
struct
{
    char s[BUFFER-1];
    const char zc;
} str = {'\0'};

printf("'%s', zc=%d\n", str.s, str.zc);

Предполагается, что она работает со строками длины BUFFER-1 и гарантирует, чтоон заканчивается на '\ 0'.

Но компилятор выдает ошибку только для:

str.zc='e'; /*error */

Не если:

str.s[3]='e'; /*no error */

Если компиляция с gcc и некоторым флагом можетделай, это тоже хорошо.

Спасибо, Беко

1 Ответ

0 голосов
/ 23 сентября 2011

Чтобы обнаружить ошибки во время выполнения, взгляните на опцию -fstack-protector-all в gcc. Он может иметь ограниченное применение при попытке обнаружить очень маленькие переполнения, подобные описанному вами.

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

...