Могу ли я вызвать 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
Нет, проверка не требуется. Полагаю, что, полагая, что ноль обрабатывается должным образом, является хорошим и очень разумным. Возможно, стоит комментировать.