Как можно обеспечить безопасное кодирование с помощью разработки через тестирование?

Я очень быстро знаком с последней тенденцией - разработкой через тестирование (TDD). Большинство разработок я делаю на C или C ++. Мне кажется, что существует очевидный конфликт между обычными методами TDD и обычными методами безопасного кодирования. По сути, TDD говорит вам, что вы не должны • Пишите новый код для чего-то, что у вас нет провального теста. Для меня это означает, что я не должен писать безопасный код, если у меня нет модульных тестов, чтобы убедиться, что мой код безопасен.

Это вызывает две проблемы:

  1. Как я могу эффективно писать модульные тесты для проверки переполнения буфера , Переполнение стека, переполнение кучи, ошибки индекса массива, ошибки форматной строки, несоответствие размера строки ANSI vs Unicode vs MBCS, безопасная обработка строк (из статьи Говарда и Леблана «Написание безопасного кода»)?

  2. В какой момент в стандартном TDD На практике следует включать эти тесты, поскольку большая часть безопасности не работает.

Удивительно, но я нашел очень мало исследований, посвященных TDD и безопасности. Большинство из того, что мне попадается, - это документы TDD, в которых упоминается на очень высоком уровне, что TDD «сделает ваш код более безопасным».

I ' Я ищу какие-либо прямые ответы на указанные выше вопросы, любые исследования, относящиеся к этому (я уже искал и не нашел много), или любое место, где живут гуру TDD, чтобы я мог постучать в их дверь (виртуально) и посмотреть, у них есть хорошие ответы.

Спасибо!

РЕДАКТИРОВАТЬ:

Поднялась тема фаззинга, который, я думаю, является отличным подходом к этой проблеме (в целом). Возникает вопрос: вписывается ли фаззинг в TDD? Где в процессе TDD подходит фаззинг?

Параметризованное модульное тестирование (возможно, автоматизированное) также приходило мне в голову. Это может быть способом получить результаты, похожие на фаззинг, раньше в процессе тестирования. Я не уверен, что именно это вписывается в TDD.

РЕДАКТИРОВАТЬ 2:

Спасибо всем за ваши ответы. На данном этапе, Мне очень интересно, как мы можем использовать параметризованные тесты, чтобы они служили псевдофаззерами для наших функций. Но как определить, какие тесты писать для тестирования безопасности? И как мы можем быть уверены, что адекватно прикрываем пространство атаки?

Это хорошо известная проблема в области безопасности программного обеспечения: если вы защитите от 5 сценариев атак, злоумышленник просто будет искать и использовать 6-ю атаку. Это очень сложная игра в кошки-мышки. Дает ли TDD какое-либо преимущество против этого?

21
задан LJNielsenDk 11 December 2013 в 23:42
поделиться