Более безопасные альтернативы стандартной библиотеке C
Стандартная библиотека C, как известно, неудовлетворительна, когда дело доходит до безопасности ввода/вывода. Многие функции имеют переполнение буфера (gets
, scanf
) или могут сжимать память, если не заданы правильные аргументы (scanf
) и т.д. Каждый раз и некоторое время я сталкиваюсь с предприимчивым хакером, который написал свою собственную библиотеку, которой не хватает этих недостатков.
Каковы лучшие из этих библиотек, которые вы видели? Использовали ли вы их в производственном коде, и если да, то что было больше, чем хобби?
Ответы
Ответ 1
Я использую библиотеку 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(), но более безопасна, поскольку она вычисляет максимальное требуемое пространство и выделяет память для хранения результата.
Ответ 2
Это не отвечает на ваш вопрос о наиболее безопасных библиотеках, но большинство функций, уязвимых для переполнения буфера, которые вы упомянули, имеют более безопасные версии, которые берут длину буфера в качестве аргумента для предотвращения дыры безопасности, которые открываются при использовании стандартных методов.
Если вы не смягчили уровень предупреждений, вы обычно получаете предупреждения о компиляторе, когда используете устаревшие методы, предлагая вместо этого использовать более безопасные методы.
Ответ 3
В качестве примера того, о чем я говорю, D.J. Бернштейн, более известный как djb, автор djbdns
и qmail
, создал djblib
, который обеспечивает быструю, безопасная альтернатива многим библиотечным функциям C.
Ответ 4
Я считаю, что Apache Portable Runtime (apr) библиотека более безопасна, чем стандартная библиотека C. Я использую его, ну, как часть модуля apache, но также и для независимых процессов.
Ответ 5
Для Windows существует "безопасная" библиотека C/С++.
Ответ 6
Может быть, первый вопрос, который нужно задать, - это действительно ли вам нужно C? (возможно, язык, например .net или java, является опцией - тогда, например, переполнение буфера больше не является проблемой)
Другой вариант - это, возможно, написать части вашего проекта на С++, если другие языки более высокого уровня не являются опцией. Затем вы можете иметь интерфейс C, который инкапсулирует код С++, если вам действительно нужен C.
Потому что, если вы добавите все расширенные функции, встроенные в стандартную библиотеку С++, ваш код C будет только немного быстрее (и содержит намного больше ошибок, чем существующая и протестированная среда).
Ответ 7
Вы всегда можете реализовать любую понравившуюся вам библиотеку и использовать ее - сложная часть гарантирует, что она доступна на платформах, в которых вам нужно программное обеспечение для работы. Вы также можете использовать обертки вокруг стандартных функций, если это необходимо.
Является ли это действительно хорошей идеей, является несколько спорным, но TR24731 опубликован стандартным комитетом C - для более безопасного набора функций C. Там определенно какой-то хороший материал. См. Этот вопрос: Используете ли вы безопасные функции TR 24731 в коде C?, который включает ссылки на технический отчет.