Могу ли я вызвать memcpy() и memmove() с "числом байтов", установленным на ноль?

Нужно ли обрабатывать случаи, когда я не могу ничего переместить/скопировать с помощью memmove()/memcpy() в качестве краевых случаев

int numberOfBytes = ...
if( numberOfBytes != 0 ) {
    memmove( dest, source, numberOfBytes );
}

или я должен просто вызвать функцию без проверки

int numberOfBytes = ...
memmove( dest, source, numberOfBytes );

Требуется ли проверка в первом фрагменте?

Ответ 1

Из стандарта C99 (7.21.1/2):

Если аргумент, объявленный как size_t n, указывает длину массива для функция n может иметь нулевое значение при вызове этой функции. Если явно не указано в противном случае в описании конкретной функции в этом подпункте аргументы указателя при таком вызове все равно будут иметь действительные значения, как описано в 7.1.4. При таком вызове функция, которая находит символ, не находит никакого вхождения, функция, которая сравнивает две последовательности символов возвращает ноль, а функция, которая копирует символы, копирует нуль символы.

Итак, ответ - нет; проверка не требуется (или да, вы можете пройти ноль).

Ответ 2

Документация memmove и memcpy говорит следующее:

Функция не проверяет любой завершающий нулевой символ в источнике - он всегда копирует точно число байтов.

opengroup документация говорит в основном о том же вещь.

Итак, учитывая, что он копирует "точно число байтов", он копирует нулевые байты в num = 0, и поэтому нет необходимости рассматривать это как частный случай.

Ответ 3

Как сказано в @You, стандарт указывает, что memcpy и memmove должны обрабатывать этот случай без проблем; поскольку они обычно выполняются как-то вроде

void *memcpy(void *_dst, const void *_src, size_t len)
{
    unsigned char *dst = _dst;
    const unsigned char *src = _src;
    while(len-- > 0)
        *dst++ = *src++;
    return _dst;
}

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

Ответ 4

Нет, проверка не требуется. Полагаю, что, полагая, что ноль обрабатывается должным образом, является хорошим и очень разумным. Возможно, стоит комментировать.