Проблема переполнения K & R 3-2 - PullRequest
2 голосов
/ 23 апреля 2011

Я перебираю K & R и 3-2 выглядит так, как будто бы легко попасть в переполнение буфера

Написать функцию escape (s, t), которая преобразует символы, такие как перевод строки и табуляцияв видимые escape-последовательности, такие как \ n и \ t, так как копирует строку t в s.Используйте переключатель

Если я заменю байт '\ n' на '\' и 'n', размер s потенциально может быть немного больше, чем исходная строка.

Я мог бы просто написать эту программу и игнорировать переполнение, но я бы предпочел этого не делать.

У меня проблема с нахождением головы вокруг того, как с этим справиться?

Я думаю, чтофиксированный размер буфера, возможно, что-то из лимита .h и сброс буфера в stdio, когда он заполнится?

Ответы [ 3 ]

4 голосов
/ 23 апреля 2011

Я считаю, что весь смысл упражнения заключается в том, чтобы научить вас, что когда вы имеете дело с чем-то подобным, вам необходимо:

  1. Снимать слишком высоко (сделать буфер вдвое больше, чем размероригинал)
  2. Возьмите дополнительное время (дополнительный проход) и предварительно рассчитайте необходимый размер буфера.
1 голос
/ 23 апреля 2011

попробуйте добавить параметр размера, чтобы вы знали размер целевого буфера.Если вы передадите указатель на этот параметр, вы можете вернуть какое-то значение ошибки, если буфер слишком мал и пропустить необходимый размер обратно через параметр размера.Что-то вроде:

int escape(size_t *size, char *out, const char *in);
1 голос
/ 23 апреля 2011

с никогда не будет длиннее двойной длины t. Поскольку это упражнение, очевидно, предназначено для того, чтобы помочь вам научиться использовать switch, я думаю, было бы неплохо предположить, что вызывающая сторона передает строку в s, которая имеет достаточную длину. Или, если s имеет тип char ** (или аналогичный), то вы должны выделить строку, и в этом случае вы можете выделить строку правильного размера.

В реальной функции у вас, вероятно, будет другой параметр, который указывает максимальную длину строки назначения.

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