https://www.sstic.org/media/SSTIC2019/SSTIC-actes/journey-to-a-rte-free-x509-parser/SSTIC2019-Article-journey-to-a-rte-free-x509-parser-ebalard_mouy_benadjila_3cUxSCv.pdf
Статья рассматривает проблемы парсинга сертификатов на Си. Это, само
собой, жопа, из-за сложности как структур, так и самого ASN.1.
Понравился раздел про developer constraints, которые они хотят
использовать.
* C99, без VLA -- вот и я тоже пишу на C99, но чтобы никаких эти VLA,
ибо это открывает врата в ад. Полностью отказываться от C99 из-за
этого VLA я не хочу
* Отсутствие динамического выделения памяти. В моих программах malloc
вообще редко когда встречается. Чаще всего я просто выделяю буферы
достаточного размера (речь про работу с данными по сети). Пускай часть
памяти и не будет использована полностью, но зато куда более простой
код, наверняка и эффективный, плюс меньше возможных ошибок связанных с
памятью кучи
* Ограниченное использование указателей на функции
* Отсутствие внешних зависимостей
* Использование const и static квалификаторов. Про static компилятор
подсказывает всегда, как и про const, но про него и так не забываю
* Использование беззнаковых целых чисел ограниченной длины (uint*_t).
Тоже предпочитаю их, когда явно есть возможность использования
* Строгие опции компиляции. Тут они используют -Weverything, который
даже в самой документации к Clang не рекомендуется. А я все свои
проекты всё равно с ним собираю. Лишь считанное количество
игнорирований есть в коде
* Нет рекурсиям