Более безопасные альтернативы стандартной библиотеке C - PullRequest
13 голосов
/ 28 января 2009

Стандартная библиотека C общеизвестно плоха, когда речь заходит о безопасности ввода / вывода. Многие функции имеют переполнения буфера (gets, scanf), или могут забивать память, если не заданы правильные аргументы (scanf), и так далее. Время от времени я сталкиваюсь с предприимчивым хакером, который написал свою собственную библиотеку, в которой отсутствуют эти недостатки.

Каковы лучшие из этих библиотек, которые вы видели? Использовали ли вы их в рабочем коде, и если да, то, что считалось чем-то большим, чем просто хобби?

Ответы [ 7 ]

8 голосов
/ 28 января 2009

Я использую библиотеку GLib , в ней много хороших стандартных и нестандартных функций.

См. https://developer.gnome.org/glib/stable/

и, может быть, вы влюбитесь ...:)

Например:

https://developer.gnome.org/glib/stable/glib-String-Utility-Functions.html#g-strdup-printf

объясняет, что g_strdup_printf :

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

4 голосов
/ 28 января 2009

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

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

3 голосов
/ 28 января 2009

Я считаю, что Apache Portable Runtime (апрель) библиотека безопаснее, чем стандартная библиотека C. Я использую его, как часть модуля apache, но также и для независимых процессов.

3 голосов
/ 28 января 2009

В качестве примера того, о чем я говорю, Д.Дж. Бернштейн, более известный как djb, автор djbdns и qmail, создал djblib, который предоставляет быструю, надежную и безопасную альтернативу многим функциям стандартной библиотеки языка Си.

2 голосов
/ 28 января 2009
0 голосов
/ 28 января 2009

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

Является ли это действительно хорошая идея, несколько спорна, но есть TR24731 опубликованный стандартный комитет C - для более безопасного набора функций C. Там определенно есть что-то хорошее. См. Этот вопрос: Используете ли вы безопасные функции TR 24731 в своем коде C? , который содержит ссылки на технический отчет.

0 голосов
/ 28 января 2009

Может быть, первый вопрос, который нужно задать, - действительно ли вам нужен простой C? (возможно, такой язык, как .net или java - вариант - тогда, например, переполнение буфера больше не проблема)

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

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

...