Вопрос:

Вопрос №23 Разработке программ часто требуется защитить от модификации, например, информации об авторстве. Для шифрования можно менять, операцию исключающее ИЛИ. void *memxor(void *dest, const void *src, char mask, unsigned int count) { char *p_src = (char *)src; char *p_dst = (char *)dest; for (unsigned int i = 1; i <= count; i++) *(++p_dst) = *(++p_src) ^ mask; return dest; } В данном фрагменте кода была реализована функция (memxor()), но при тестировании выяснилось, что первым символом расшифрованной строки оказывается '\(\x\)0', а тестовый символ '#', расположенный за буфером для расшифрованной строки, оказывается затертым. Как изменения следует внести в 5 строку функции memxor(), чтобы решить данную проблему? (p_dst++) = (p_src++) ^ mask; *(p_dst--) = *(p_src--) ^ mask; *(--p_dst) = *(--p_src) ^ mask; *(p_dst++) = *(p_src++) ^ mask; *(p_dst) = *(p_src++) ^ mask;

Ответ:

Решение:

Проблема заключается в том, что цикл начинается с 1-го элемента (i = 1) и использует постфиксные инкременты (++p_dst, ++p_src), что приводит к выходу за пределы буфера на последней итерации и перезаписи нулевого байта.

Чтобы исправить это, нужно:

  1. Начать цикл с 0-го элемента, то есть изменить условие на i < count.
  2. Использовать префиксные инкременты, чтобы сначала увеличить указатель, а затем обратиться к элементу.
  3. Убедиться, что оба указателя p_dst и p_src корректно перемещаются по буферу, обрабатывая все count байт.

Таким образом, правильный вариант из предложенных, который исправляет оба указателя и обрабатывает count байт, начиная с нулевого, это:

*(p_dst++) = *(p_src++) ^ mask;

Этот вариант корректно увеличивает счетчик i до count, обрабатывает count байт и использует постфиксный инкремент, что соответствует логике задачи.

Ответ: *(p_dst++) = *(p_src++) ^ mask;

Подать жалобу Правообладателю