Подтвердить что ты не робот

Безопасные строковые функции в Mac OS X и Linux

Существуют ли эквивалентные защищенные строковые функции в Mac OSX и Linux так же, как в Windows (strcpy_s, strncpy_s..etc)?

Как насчет функций, которые преобразуют между многобайтовыми и широкими символами?

4b9b3361

Ответ 1

Существует две стратегии безопасной манипуляции строк. Сторонники Linux/glibc отказываются добавлять безопасные функции, утверждая, что вы должны держать длину своих строк под рукой и использовать memcpy.

С другой стороны, Mac OSX включает в себя strlcpy и strlcat из BSD. snprintf и asprintf можно использовать на обеих платформах с таким же эффектом:

size_t strlcpy(char *d, char const *s, size_t n)
{
    return snprintf(d, n, "%s", s);
}

size_t strlcat(char *d, char const *s, size_t n)
{
    return snprintf(d, n, "%s%s", d, s);
}

Вы также можете рассмотреть возможность использования реализованной в BSD реализации . Если ваш код будет скомпилирован на нескольких платформах, вы можете проверить наличие glibc с помощью предопределенных макросов библиотеки:

#if defined __GNU_LIBRARY__ || defined __GLIBC__

    size_t strlcpy(char *, char const *, size_t);
    size_t strlcat(char *, char const *, size_t);

#endif 

Конверсия между кодировками символов наиболее легко обрабатывается с помощью интерфейса iconv.

Ответ 2

OSX имеет strlcpy и strlcat. Насколько мне известно, в настоящее время Linux их нет, но достаточно легко реализовать эти функции, скажем, с OpenBSD.

Ответ 4

Если вам нужно использовать буферы char (NTBS = Nul terminated byte strings), то нет строковых безопасных строковых функций. Даже strlen() безопасен.

Скорее, существуют строковые небезопасные строковые функции, такие как gets() и большинство использования sprintf(). Они небезопасны, потому что вы не можете надежно предсказать размер буфера, который вам нужен.

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

Один из способов помочь сделать это на С++ - использовать хороший класс, такой как StringPiece в пакете Google RE2, который является указателем и длиной, где указатель указывает на NTBS. Сохраняя правильную длину в StringPiece один раз, класс затем может отслеживать длину различных операций. Вы можете написать такой класс самостоятельно. Это не сделает правильный код, но он изолирует критические точки (а именно, правильные аргументы для конструктора).

В этом случае инкапсуляция - ваш друг.

Ответ 5

Доступны стандартные функции C для преобразования между многобайтовыми и широкими символами: mbtowc(), mbstowcs(), wctomb(), wcstombs() и т.д.