Безопасные строковые функции в Mac OS X и Linux - PullRequest
23 голосов
/ 31 декабря 2010

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

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

Ответы [ 5 ]

11 голосов
/ 31 декабря 2010

Существует две стратегии безопасного манипулирования строками. Сопровождающие 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.

4 голосов
/ 31 декабря 2010

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

3 голосов
/ 31 декабря 2010

Вы можете использовать опцию gcc -D_FORTIFY_SOURCE=2, для Linux вы можете пойти дальше, для этого вам следует прочитать Безопасное программирование с помощью gcc & glibc .

2 голосов
/ 01 января 2011

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

2 голосов
/ 31 декабря 2010

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

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

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

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

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

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