Я приступил к работе над последней тенденцией, которая является Test Driven Development (TDD). Большая часть разработки я делаю на C или С++. Мне кажется, что существует очень очевидный конфликт между обычными методами TDD и распространенными методами безопасного кодирования. При этом TDD сообщает вам, что вы не должны писать новый код для чего-то, для которого у вас нет теста на неудачу. Для меня это означает, что я не должен писать защищенный код, если у меня нет модульных тестов, чтобы проверить, защищен ли мой код.
Это вызывает две проблемы:
-
Как я могу эффективно выполнять модульные тесты для проверки переполнения буфера,, переполнения кучи, ошибок индекса массива, ошибок в строках формата, ANSI vs Unicode vs MBCS с ошибками размера строк, безопасной обработки строк (из Howard и LeBlanc "Написание защищенного кода" )?
-
В какой момент в стандартной TDD-практике эти тесты должны быть включены, поскольку большая часть безопасности не работает.
Удивительно, но я нашел очень мало исследований, посвященных TDD и безопасности. Большинство из того, что я встретил, - это документы TDD, которые упоминают на очень высоком уровне, что TDD "сделает ваш код более безопасным".
Я ищу любые прямые ответы на вышеизложенные вопросы, любые исследования, которые относятся к этому (я уже смотрел и не нашел много) или в любом месте, в котором живет гуру TDD, поэтому я могу постучать в их дверь ( фактически) и посмотреть, есть ли у них хорошие ответы.
Спасибо!
EDIT:
Тема Fuzzing появилась, и я думаю, что это отличный подход к этой проблеме (в целом). Это вызывает вопросы: ли Fuzzing вписывается в TDD? Где в TDD-процессе работает fuzzing?
Параллельное тестирование модулей (возможно, автоматическое) также перешло мне в голову. Это может быть способом получить результаты, похожие на путаницу, ранее в процессе тестирования. Я точно не знаю, где это входит в TDD.
ИЗМЕНИТЬ 2:
Спасибо всем за ваши ответы. На данный момент я очень заинтересован в том, как мы можем использовать параметризованные тесты для использования в качестве псевдо-фьюзеров для наших функций. Но как мы определяем, какие тесты следует писать для тестирования безопасности? И как мы можем быть уверены, что мы адекватно покрываем пространство атаки?
Хорошо известная проблема в обеспечении безопасности программного обеспечения: если вы защищаете от 5 сценариев атаки, злоумышленник будет искать и использовать 6-ю атаку. Это очень сложная игра в кошки-мышки. Предоставляет ли TDD какое-либо преимущество против этого?