Тестирование С++ 17 в критически важных системах безопасности
В настоящее время я думаю о C++ в критическом для безопасности программном обеспечении (DO-178C DAL-D) и определениях стандарта кодирования. Я смотрел на MISRA C++, которому снова исполнилось 10 лет, и пропускает все функции C++ 11... 17.
Хотя консервативность в отношении безопасности часто является плохой идеей, новые особенности языка могут быть полезными для безопасности.
Во время обзоров нужно спорить о том, почему вы приняли определенные решения. И всегда можно утверждать, что новые возможности языка делают код более понятным... таким образом, меньше ошибок в недоразумениях; особенно если компилятор способен проверить и проверить ваши предположения.
Но трудно найти функции языка, которые несут аспекты безопасности более заметно, чем "сделать вещи более ясными". Какие аспекты современного C++ действительно помогают в безопасности?
Я создаю небольшой проект для тестирования этих идей и в настоящее время полностью сосредоточен на "дайте компилятору проверить ваши предположения". Например, мы только начали использовать [[nodiscard]]
и обнаружили, по крайней мере, две ошибки таким образом в течение первого часа. Но какие аспекты современного C++ были разработаны и должны использоваться с учетом безопасности?
Ответы
Ответ 1
Сначала это приходит мне на ум:
- atomic и memory_model: они позволяют писать переносимый код в контекстно-зависимых контекстах.
- unique_ptr: упрощает обработку памяти
- override позволяет находить ошибки во время компиляции.
- constexpr, если код написан ближе к тому, где он используется, что помогает записывать меньше ошибок (иногда, чтобы специализировать поведение в соответствии с параметром шаблона, вы должны написать класс с
n
специальностями. Теперь вы можете использовать if constexpr
с n
ветвями вместо).
и т.д.... в некотором смысле, учитывая преимущества четкости кода и переносимости, я думаю, что каждая функция С++ 11/14/17 помогает.
Ответ 2
И всегда можно утверждать, что новые возможности языка делают код более понятным... таким образом, меньше ошибок в недоразумениях; особенно если компилятор способен проверить и проверить ваши предположения.
По моему не очень скромному мнению, существует несколько особенностей языка, то есть стандартные возможности языка программирования общего назначения, которые оба выходят за рамки допустимых стандартов и стоят времени и энергии, чтобы спорить с вами в ходе оценки. Если вы нацелены на более высокий уровень абстракции (что тоже хорошо для безопасности, хотя вряд ли кто-нибудь открыто признает это, потому что это сделает половину индустрии безопасности безработной, а другую половину сильно устаревшей), тогда вы Лучше прибегнуть к языку, специфичному для домена, и приложить усилия к безупречной компиляции (к источнику) к стандартной совместимой платформе. Если вы не работаете в инженерной культуре, которая позволяет это, то вы можете прибегнуть к некоторым исправлениям, которые предлагает другой ответ, но всегда трудно убедительно переносить намерение и значение неспецифических мер с другой безопасностью инженеров (выделенный язык, специфичный для домена, намного проще как для поддержки, так и для объекта).
Тем не менее, я думаю, что прогресс в параллельном программировании современных C++ скоро будет входить в стандарты.