В чем преимущество strlmove перед strmove в C? - PullRequest
0 голосов
/ 04 ноября 2008

Чтобы обрезать ведущие пробелы, мы используем strmove. Но нам посоветовали использовать strlmove вместо strmove. Я прочитал и использовал strlcpy и strlcat. Делает ли strlmove подобный функционал и в чем все его преимущества?

Редактировать 1: Спасибо, Майк Б и Крис Янг. Вот как мы используем strlcpy.

size_t strlcpy(char *dst, const char *src, size_t size)
{
    strncpy(dst, src, size - 1);
    dst[size - 1] = '\0';
    return(strlen(src));
}

Так что я просто подумал об использовании strlmove () также таким же образом. Я хочу подтвердить, определены ли какие-либо спецификации в отношении реализации strlmove (). Я знаю, что это одно из лучших мест, которое я могу спросить.

Редактирование 2: strlmove () реализован так же, как strlcpy () и strlcat () с использованием memmove ().

size_t strlmove(char *dst, const char *src, size_t size)
{
    //Error if the size is 0
    //If src length is greater than size; 
    //   memmove(dst, src, size-1) and dst[size] = \0;
    //Otherwise
    //   memmove(dst, src, length(src));
    return source len;
}

Ценю оказанную помощь и поддержку.

Спасибо, Мэтью Лию

Ответы [ 5 ]

4 голосов
/ 04 ноября 2008

strmove, strlmove, strlcpy, strlcat - это все не стандартные функции C, поэтому я не могу комментировать то, что они делают, не зная, какую именно нестандартную библиотеку вы используете. Стандарт C предоставляет strcpy, strcat, strncat, strncpy, memmove, memcpy и т. Д.

Имеет смысл использовать strncpy вместо strcpy для безопасности, если вы не знаете, что исходная строка будет помещаться в целевой буфер. Однако strncpy имеет серьезную проблему с производительностью в том, что всегда записывает количество байтов, указанное для размера. То есть:

char buf[4096];
strncpy(buf, "Hello", sizeof buf);

напишет 'H', 'e', ​​'l', 'l', 'o' и заполнит оставшиеся 4091 байт буфера '\ 0'. Еще одна вещь, о которой следует помнить с помощью strncpy, это то, что она не завершит строку нулем, если параметр size меньше, чем длина строки источника плюс ее ноль. Например:

char buf[5];
strncpy(buf, "Hello", sizeof buf);

запишет 'H', 'e', ​​'l', 'l', 'o' в buf, и оно не будет заканчиваться нулем.

2 голосов
/ 04 ноября 2008

Как Крис Янг упоминает , эти процедуры не являются стандартными (или, насколько я знаю в широком, общем использовании), поэтому я не могу быть уверен на 100% с большей спецификой, но:

Обычно strl() варианты подпрограмм str() принимают дополнительный параметр, который указывает размер буфера назначения. Подпрограмма гарантирует, что она не будет записывать данные после конца буфера (так как она знает размер). Обычно strl() функции также гарантируют, что они поместят завершающий нулевой символ в конец строки или в конец буфера (потенциально обрезая любую созданную там строку), так что вы также гарантированно получите завершенную строку, которая будет быть в целом нормально, чтобы перейти к другим str() функциям. Обратите внимание, что если длина буфера задана как 0 (ноль), функция не поместит завершающий нулевой символ (так как в буфере нет места для чего-либо).

По моему мнению, почти всегда лучше использовать функцию strl() (или strn()) вместо соответствующей подпрограммы str() для предотвращения переполнения буфера.

1 голос
/ 04 ноября 2008

Быстрый поиск в Google показывает, что единственное упоминание о функции strlmove находится в stackoverflow :). Так что это, вероятно, не очень распространенная функция.
Но если мы предположим, что эта функция по своей природе близка к strlcpy , эта функция будет отличаться от strmove использованием параметра size для перемещения ограниченного количества байтов, а делает строку назначения NULL прекращено .

0 голосов
/ 05 ноября 2008

Как сказал Крис, используемые вами в настоящее время функции не являются стандартными. ... еще хуже то, что они все еще крайне неэффективны и по-прежнему подвержены ошибкам. Вы можете легко создать пару API, которые используют memcpy / memmove и take (char *), которые будут работать везде и, вероятно, будут быстрее, чем не-std. переменные, которые вы сейчас используете.

Однако, если вы хотите, чтобы кто-то другой выполнял тяжелую работу, и получили бесплатную безопасность / удобство использования, вы можете посмотреть на что-то вроде ustr ..., которое должно быть легко интегрируемым, является стандартным , C, безопасный, быстрый и может иметь дело с постоянными / автоматическими / utf8 / динамическими строками. Есть и другие варианты.

0 голосов
/ 04 ноября 2008

Существует одна большая разница между strncpy и strlcpy, по крайней мере, в версии Theo de Raadt, которую вы пропустили в своей реализации. Если длина данной строки меньше размера буфера, то strncpy дополняет остаток буфера нулевыми байтами. Во многих случаях это может быть лишь незначительной разницей, но поскольку многие программисты на c склонны использовать очень большие буферы для обеспечения безопасности сайта, это может иметь значение.

<code>
strncpy(buffer, "bla", 1024);

запишет 1021 '\ 0' в буфер, хотя одного будет достаточно. strlcpy записывает только один '\ 0'.

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