Ознакомьтесь с Стандарт безопасного кодирования CERT C и Стандарт безопасного кодирования CERT C ++ .
Безопасное программирование включает в себя методы, которые снижают вероятность неправильного использования самими разработчиками кода.
Вот мои два цента - Избегайте использования указателей там, где это возможно. На мой взгляд, указатель следует использовать только тогда, когда значение NULL имеет особое значение. Этот принцип распространяется на несколько идиом кодирования
Суть в том, что если есть указатели, есть большая вероятность, что они будут неправильно использованы кем-то, кто в конечном итоге унаследует код.
Я брошу парочку и сделаю эту вики сообщества:
Никогда, никогда, никогда не используйте gets
.
Не предполагайте, что строка завершается нулем, если вы действительно не знаете, что это так.
Никогда просто не объявляйте большой буфер фиксированного размера и просто предполагайте, что он будет «достаточно большим» для того, что вы делаете.
Утверждения, утверждения, утверждения. Если есть даже теоретическая возможность, что что-то может быть не так, продолжайте и утверждайте, что это так. Если что-то не совсем так, как вы этого ожидали, вы хотите, чтобы ваша программа умерла немедленно и эффектно. Убедитесь, что ваши утверждения не будут оптимизированы.
Будьте очень осторожны с буферами. Есть некоторые функции (например, get), которые записывают в буфер, не зная, насколько он большой. Не используйте эти функции. Всегда проверяйте размер буфера именно там, где он вам нужен, а не полагайтесь на предварительно вычисленные значения.
Всегда проверяйте коды возврата. Если вы не можете сделать ничего значимого при ошибке (например, malloc), тогда подтвердите успех или, лучше, напишите функцию-оболочку, которая утверждает успех, чтобы она не могла вернуть значение ошибки и никогда не использовать оригинал. Чтобы быть экстра-параноидальным, пусть ваш компилятор выдает предупреждение, если вы неявно игнорируете возвращаемое значение.
Рассматривайте любые данные, поступающие в программу, как возможную вредоносную атаку, потому что это так. Сюда входят файлы конфигурации, а также вводимые пользователем данные.
«Преждевременная оптимизация - корень всех зол». Сначала сделай это правильно. Даже не думайте о том, чтобы сделать это быстрее, если: а) вам это абсолютно необходимо; б) вы профилировали код и точно не знаете, в чем заключаются ваши узкие места.
Попросите кого-нибудь проверить ваш код.
Это лишь некоторые отправные точки. Написать безопасный код сложно.