Существуют ли эквивалентные защищенные строковые функции в Mac OSX и Linux так же, как в Windows (strcpy_s, strncpy_s..etc)?
Как насчет функций, которые преобразуют между многобайтовыми и широкими символами?
Существуют ли эквивалентные защищенные строковые функции в Mac OSX и Linux так же, как в Windows (strcpy_s, strncpy_s..etc)?
Как насчет функций, которые преобразуют между многобайтовыми и широкими символами?
Существует две стратегии безопасной манипуляции строк. Сторонники 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
.
OSX имеет strlcpy
и strlcat
. Насколько мне известно, в настоящее время Linux их нет, но достаточно легко реализовать эти функции, скажем, с OpenBSD.
Вы можете использовать опцию gcc -D_FORTIFY_SOURCE=2
, для Linux вы можете перейти более продвинутой, для этого вы должны прочитать Защищенное программирование с помощью gcc и glibc,
Если вам нужно использовать буферы char (NTBS = Nul terminated byte strings), то нет строковых безопасных строковых функций. Даже strlen() безопасен.
Скорее, существуют строковые небезопасные строковые функции, такие как gets() и большинство использования sprintf(). Они небезопасны, потому что вы не можете надежно предсказать размер буфера, который вам нужен.
Другой класс строковых функций можно безопасно использовать при условии, что вы отслеживаете максимальные размеры буфера, которые требуются и которые требуются правильно.
Один из способов помочь сделать это на С++ - использовать хороший класс, такой как StringPiece в пакете Google RE2, который является указателем и длиной, где указатель указывает на NTBS. Сохраняя правильную длину в StringPiece один раз, класс затем может отслеживать длину различных операций. Вы можете написать такой класс самостоятельно. Это не сделает правильный код, но он изолирует критические точки (а именно, правильные аргументы для конструктора).
В этом случае инкапсуляция - ваш друг.
Доступны стандартные функции C для преобразования между многобайтовыми и широкими символами: mbtowc()
, mbstowcs()
, wctomb()
, wcstombs()
и т.д.