SlideShare a Scribd company logo
1 of 50
Безопасность на максималках: как
писать надёжный C/C++ код для
встраиваемых систем
Докладчик:
Георгий Грибков
Докладчик
Георгий Грибков
Программист C++, один из
разработчиков статического анализатора
кода PVS-Studio
Разрабатывает набор диагностических
правил, проверяющих код на
соответствие стандартам
MISRA C и MISRA C++
gribkov@viva64.com
2
1.Стандарты кодирования: предпосылки
появления
2.MISRA и AUTOSAR: что под капотом
3.Использование стандартов в ваших проектах
Содержание
3
Предпосылки
4
 Популярность языка C
Проблематика
5
 Популярность языка C
 ПОПУЛЯРНОСТЬ языка C
Проблематика
6
 Популярность языка C
 ПОПУЛЯРНОСТЬ языка C
 Популярность языка С++
Проблематика
7
 Популярность языка C
 ПОПУЛЯРНОСТЬ языка C
 Популярность языка С++
 Несовершенство этих языков
Проблематика
8
 Доступность компиляторов
 Стандартизированность
 Переносимость
 Длительный опыт использования
 Эффективность
 Поддержка средствами анализа
Чем вызвана такая популярность
9
 Неполная спецификация стандартом
 Undefined, unspecified, implementation-defined
behavior
 Неправильное обращение с языком
if ( i = 0 ) или if ( i == 0 )?
Слабые места C и C++
10
Слабые места C и C++
11
Что, если ответственность высока?
12
 4 июня 1996 года европейская ракета-носитель Ariane 5
превратилась в конфетти на 37 секунде полета
Пример очень дорогой ошибки
13
 Расследование показало, что причиной аварии
послужила программная ошибка (целочисленное
переполнение)
 На борту ракеты были четыре спутника
 Убытки составили 370 000 000 $
Пример очень дорогой ошибки
14
15
Вывод: надо что-то делать!!!
Стандарты кодирования:
что под капотом
16
 MISRA – это набор рекомендаций
Актуальные версии:
 MISRA C:2012 – 143 правила
 MISRA C++:2008 – 228 правил
MISRA: что это такое
17
 MISRA – это «Motor Industry Software Reliability Association»:
MISRA: что это такое
18
 Bentley Motor Cars
 Ford Motor Company
 Jaguar Land Rover
 Delphi Diesel Systems
 HORIBA MIRA
 Protean Electric
 Visteon Engineering Services
 The University
of Leeds
 Ricardo UK
 ZF TRW
 AUTOSAR – это AUTomotive Open System Architecture
Немного про AUTOSAR
19
 AUTOSAR – это AUTomotive Open System Architecture
Немного про AUTOSAR
20
 BMW Group
 Bosch
 Continental
 Daimler AG
 Ford
 General Motors
 PSA Peugeot Citroën
 Toyota
 Volkswagen
 …и еще более 200
партнёров
 AUTOSAR – это AUTomotive Open System Architecture
 AUTOSAR – это методология разработки
 AUTOSAR C++ – часть этой методологии
Актуальная версия:
 AUTOSAR C++: 19-03 – более 350 правил
Немного про AUTOSAR
21
MISRA C++ и AUTOSAR C++
22
MISRA C++ AUTOSAR C++
C++03 ✓ ✓
C++11 ☓ ✓
C++14 ☓ ✓
Где используются MISRA и AUTOSAR
23
1.Mandatory – обязательные к следованию
2.Required – допустимы отклонения
3.Advisory – следование опционально
Категории правил:
24
Обязательные правила:
 Не используйте значение неинициализированной
переменной
 Не используйте указатель на FILE после закрытия потока
 Не пишите недостижимый код
 Счетчик цикла не должен иметь floating-point тип
 …
Примеры правил
25
Необходимые правила:
 Не используйте goto и longjmp
 Каждый switch должен заканчиваться default
 Тела операторов if, else, for, while, do, switch должны быть
завернуты в скобки
 Не используйте вариативные функции
 …
Примеры правил
26
…и все остальные:
 Суффикс ‘L’ должен всегда быть заглавным (42L)
 Не используйте адресную арифметику (кроме [] и ++)
 Не используйте оператор «запятая»
 Не изменяйте параметр функции внутри тела
 …
Примеры правил
27
Философия
28
Еще есть много всего!
 Классификация правил по разным признакам
 Применимость к генерированному коду
 Полный список undefined/unspecified/etc… поведений
 Чек-листы по настройке анализаторов, процессу
проверки, и т.д
 Матрица пересечений с другими стандартами
 Примеры документации
А что есть помимо правил?
29
Использование стандартов в ваших
проектах
30
 Проверять вручную? Кошмар!
 Используйте статические
анализаторы кода
 Статический анализ – это
автоматизированный процесс
code review
Проверка кода на соответствие
31
 Начните использовать стандарт ДО начала проекта
 Если уже есть код – подумайте несколько раз
Внедрение
32
 Прячем старые ошибки – работаем в привычном темпе
 С этого момента видим только новые предупреждения
 Получаем пользу от анализатора СРАЗУ
 Спрятанные ошибки не забываем! Возвращаемся и
потихоньку правим.
Используйте подавление сообщений!
33
Как работать с suppress-базой
34
 Локально на компьютерах разработчиков (плагины для
IDE, системы мониторинга компиляции)
Как и где стоит проводить проверку
35
 В системах непрерывной интеграции (command-line
утилиты, плагины для CI-систем, системы мониторинга)
Как и где стоит проводить проверку
36
Как и где стоит проводить проверку
37
Вам понадобятся:
 Код, соответствующий уровням Mandatory и Required
 План обеспечения соответствия (guide enforcement plan)
 Документация по всем отклонениям
 Документация по всем предупреждениям компиляторов
и статических анализаторов
 Резюме о соответствии правилам (guideline compliance
summary)
Как доказать соответствие вашего проекта?
38
Пример guide enforcement plan:
План обеспечения соответствия
39
Правило Компилятор Анализатор Обзор кода
“A” “B” “A” “B”
…
5.1 No errors No errors --- --- Procedure x
5.2 No errors No errors Warning V2561 No messages
…
10.4 Warning 458 No errors No warnings No messages
…
 Иногда четко следовать стандарту невозможно.
Пример:
const unsigned char *PORT = 0x10u;
 Специфика отклонений разная
Тщательно документируйте отклонения
40
 Документация отклонения должна содержать:
 Номер нарушенного правила
 Локацию нарушения
 Обоснованность
 Доказательство безопасности
 Потенциальные последствия
Тщательно документируйте отклонения
41
Пример guideline compliance summary
Резюме о соответствии правилам
42
Правило Категория MISRA Соответствие
…
5.1 Mandatory Соответствует
5.2 Required Есть отклонения
…
10.4 Advisory Не используется
…
 Весь C/C++ код соответствует Mandatory и Required
 План обеспечения соответствия полностью заполнен
 Все отклонения задокументированы
 Все предупреждения компиляторов и анализаторов
исправлены или размечены
 Заполнено резюме о соответствии
Поздравляю! Вы достигли безопасности на максималках!!!
Итог:
43
MISRA Compliance: 2016
Achieving compliance with MISRA Coding Guidelines
Подробнее про соответствие стандартам MISRA
44
1. Долой сложные ветвления, goto и рекурсию
2. Все циклы должны быть ограничены
3. Динамические аллокации памяти – в топку
4. Всякая функция должна умещаться на листе
бумаги
5. Не больше двух runtime-ассертов на функцию
The Power of 10: золотые правила NASA
45
The Power of 10: золотые правила NASA
46
6. Данные должны объявляться в самом низком
scope
7. Функция что-то возвращает? Обязательно
проверить!
8. Не используйте препроцессинг
9. Никаких вложенных указателей
10. «Правило нуля предупреждений»
Статья по теме:
The Power of 10: золотые правила NASA
47
Заключение
48
 Иногда классических способов обеспечения
качества недостаточно
 Внутри MISRA и AUTOSAR C++
 Использование стандартов в ваших разработках
Подведем итоги
49
END
Q&A50

More Related Content

What's hot

Severity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеSeverity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеDeutsche Post
 
Риски в тестировании
Риски в тестированииРиски в тестировании
Риски в тестированииISsoft
 
Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...
Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...
Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...Andrey Ladutko
 
Тестирование систем процессинга банковских карт. Особенности и сложности
Тестирование систем процессинга банковских карт. Особенности и сложностиТестирование систем процессинга банковских карт. Особенности и сложности
Тестирование систем процессинга банковских карт. Особенности и сложностиSQALab
 
Тестирование как управление рисками продукта
Тестирование как управление рисками продуктаТестирование как управление рисками продукта
Тестирование как управление рисками продуктаSQALab
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...HappyDev
 
A runtime verification system for Software Defined Networks
A runtime verification system for Software Defined NetworksA runtime verification system for Software Defined Networks
A runtime verification system for Software Defined NetworksIosif Itkin
 
Применение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОПрименение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОAndrey Karpov
 

What's hot (8)

Severity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятноеSeverity и Priority для неначинающих: очевидное и невероятное
Severity и Priority для неначинающих: очевидное и невероятное
 
Риски в тестировании
Риски в тестированииРиски в тестировании
Риски в тестировании
 
Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...
Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...
Automation for-non-automation - Автоматизация для не-автоматизаторов - хотелк...
 
Тестирование систем процессинга банковских карт. Особенности и сложности
Тестирование систем процессинга банковских карт. Особенности и сложностиТестирование систем процессинга банковских карт. Особенности и сложности
Тестирование систем процессинга банковских карт. Особенности и сложности
 
Тестирование как управление рисками продукта
Тестирование как управление рисками продуктаТестирование как управление рисками продукта
Тестирование как управление рисками продукта
 
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
Виталий Шибаев - Креативный менеджмент глазами разработчика: как выжить в agi...
 
A runtime verification system for Software Defined Networks
A runtime verification system for Software Defined NetworksA runtime verification system for Software Defined Networks
A runtime verification system for Software Defined Networks
 
Применение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПОПрименение статического анализа кода в преподавании и в разработке свободного ПО
Применение статического анализа кода в преподавании и в разработке свободного ПО
 

Similar to Безопасность на максималках: как писать надёжный C/C++ код для встраиваемых систем

Автоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителяхАвтоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителяхMATLAB
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
 
Automation from the trenches
Automation from the trenchesAutomation from the trenches
Automation from the trenchesGleb Rybalko
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиAndrey Karpov
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
DevSecOps против восстания машин
DevSecOps против восстания машинDevSecOps против восстания машин
DevSecOps против восстания машинAndrey Karpov
 
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )Mobile Developer Day
 
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )Mobile Developer Day
 
Повышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаПовышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаAleksandr Makhomet
 
Paper 67 (supplementary file) sqadays 2010-burmistrov_fomin_3011
Paper 67 (supplementary file)   sqadays 2010-burmistrov_fomin_3011Paper 67 (supplementary file)   sqadays 2010-burmistrov_fomin_3011
Paper 67 (supplementary file) sqadays 2010-burmistrov_fomin_3011Alexei Lupan
 
Developer experience и API как продукт
Developer experience и API как продуктDeveloper experience и API как продукт
Developer experience и API как продуктAnastasia Goryacheva
 
Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.
Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.
Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.Club QA Kostroma
 
Software Testing Body of Knowledge (Russian)
Software Testing Body of Knowledge (Russian)Software Testing Body of Knowledge (Russian)
Software Testing Body of Knowledge (Russian)Iosif Itkin
 

Similar to Безопасность на максималках: как писать надёжный C/C++ код для встраиваемых систем (20)

Автоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителяхАвтоматическая генерация C кода и тестирование на целевых вычислителях
Автоматическая генерация C кода и тестирование на целевых вычислителях
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
Automation from the trenches
Automation from the trenchesAutomation from the trenches
Automation from the trenches
 
Automation from the trenches
Automation from the trenchesAutomation from the trenches
Automation from the trenches
 
Standards in Microsoft 2012 (Russ)
Standards in Microsoft 2012 (Russ)Standards in Microsoft 2012 (Russ)
Standards in Microsoft 2012 (Russ)
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасностиSAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
SAST, CWE, SEI CERT и другие умные слова из мира информационной безопасности
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
DevSecOps против восстания машин
DevSecOps против восстания машинDevSecOps против восстания машин
DevSecOps против восстания машин
 
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
 
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
гибкий подход к тестированию ‘умных’ электронных систем.( а. вдовин, Auriga )
 
Team workflow
Team workflowTeam workflow
Team workflow
 
Повышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаПовышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кода
 
Paper 67 (supplementary file) sqadays 2010-burmistrov_fomin_3011
Paper 67 (supplementary file)   sqadays 2010-burmistrov_fomin_3011Paper 67 (supplementary file)   sqadays 2010-burmistrov_fomin_3011
Paper 67 (supplementary file) sqadays 2010-burmistrov_fomin_3011
 
Developer experience и API как продукт
Developer experience и API как продуктDeveloper experience и API как продукт
Developer experience и API как продукт
 
Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.
Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.
Club QA Kostoma. First Meeting. Доклад. Что должен знать тестировщик.
 
Software Testing Body of Knowledge (Russian)
Software Testing Body of Knowledge (Russian)Software Testing Body of Knowledge (Russian)
Software Testing Body of Knowledge (Russian)
 
MS TFS 2010 - Обзор и архитектура
MS TFS 2010 - Обзор и архитектураMS TFS 2010 - Обзор и архитектура
MS TFS 2010 - Обзор и архитектура
 

More from Andrey Karpov

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программистаAndrey Karpov
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developerAndrey Karpov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Andrey Karpov
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesAndrey Karpov
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewAndrey Karpov
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Andrey Karpov
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesAndrey Karpov
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?Andrey Karpov
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaAndrey Karpov
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)Andrey Karpov
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Andrey Karpov
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerAndrey Karpov
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareAndrey Karpov
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineAndrey Karpov
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsAndrey Karpov
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++Andrey Karpov
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?Andrey Karpov
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youAndrey Karpov
 

More from Andrey Karpov (20)

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста
 
60 terrible tips for a C++ developer
60 terrible tips for a C++ developer60 terrible tips for a C++ developer
60 terrible tips for a C++ developer
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
 
PVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error ExamplesPVS-Studio in 2021 - Error Examples
PVS-Studio in 2021 - Error Examples
 
PVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature OverviewPVS-Studio in 2021 - Feature Overview
PVS-Studio in 2021 - Feature Overview
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
PVS-Studio в 2021
PVS-Studio в 2021PVS-Studio в 2021
PVS-Studio в 2021
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
 
Best Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' MistakesBest Bugs from Games: Fellow Programmers' Mistakes
Best Bugs from Games: Fellow Programmers' Mistakes
 
Does static analysis need machine learning?
Does static analysis need machine learning?Does static analysis need machine learning?
Does static analysis need machine learning?
 
Typical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and JavaTypical errors in code on the example of C++, C#, and Java
Typical errors in code on the example of C++, C#, and Java
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
 
Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?Game Engine Code Quality: Is Everything Really That Bad?
Game Engine Code Quality: Is Everything Really That Bad?
 
C++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical ReviewerC++ Code as Seen by a Hypercritical Reviewer
C++ Code as Seen by a Hypercritical Reviewer
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source SoftwareThe Use of Static Code Analysis When Teaching or Developing Open-Source Software
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
 
Static Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal EngineStatic Code Analysis for Projects, Built on Unreal Engine
Static Code Analysis for Projects, Built on Unreal Engine
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded SystemsSafety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
 
The Great and Mighty C++
The Great and Mighty C++The Great and Mighty C++
The Great and Mighty C++
 
Static code analysis: what? how? why?
Static code analysis: what? how? why?Static code analysis: what? how? why?
Static code analysis: what? how? why?
 
Zero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for youZero, one, two, Freddy's coming for you
Zero, one, two, Freddy's coming for you
 

Безопасность на максималках: как писать надёжный C/C++ код для встраиваемых систем

  • 1. Безопасность на максималках: как писать надёжный C/C++ код для встраиваемых систем Докладчик: Георгий Грибков
  • 2. Докладчик Георгий Грибков Программист C++, один из разработчиков статического анализатора кода PVS-Studio Разрабатывает набор диагностических правил, проверяющих код на соответствие стандартам MISRA C и MISRA C++ gribkov@viva64.com 2
  • 3. 1.Стандарты кодирования: предпосылки появления 2.MISRA и AUTOSAR: что под капотом 3.Использование стандартов в ваших проектах Содержание 3
  • 5.  Популярность языка C Проблематика 5
  • 6.  Популярность языка C  ПОПУЛЯРНОСТЬ языка C Проблематика 6
  • 7.  Популярность языка C  ПОПУЛЯРНОСТЬ языка C  Популярность языка С++ Проблематика 7
  • 8.  Популярность языка C  ПОПУЛЯРНОСТЬ языка C  Популярность языка С++  Несовершенство этих языков Проблематика 8
  • 9.  Доступность компиляторов  Стандартизированность  Переносимость  Длительный опыт использования  Эффективность  Поддержка средствами анализа Чем вызвана такая популярность 9
  • 10.  Неполная спецификация стандартом  Undefined, unspecified, implementation-defined behavior  Неправильное обращение с языком if ( i = 0 ) или if ( i == 0 )? Слабые места C и C++ 10
  • 13.  4 июня 1996 года европейская ракета-носитель Ariane 5 превратилась в конфетти на 37 секунде полета Пример очень дорогой ошибки 13
  • 14.  Расследование показало, что причиной аварии послужила программная ошибка (целочисленное переполнение)  На борту ракеты были четыре спутника  Убытки составили 370 000 000 $ Пример очень дорогой ошибки 14
  • 17.  MISRA – это набор рекомендаций Актуальные версии:  MISRA C:2012 – 143 правила  MISRA C++:2008 – 228 правил MISRA: что это такое 17
  • 18.  MISRA – это «Motor Industry Software Reliability Association»: MISRA: что это такое 18  Bentley Motor Cars  Ford Motor Company  Jaguar Land Rover  Delphi Diesel Systems  HORIBA MIRA  Protean Electric  Visteon Engineering Services  The University of Leeds  Ricardo UK  ZF TRW
  • 19.  AUTOSAR – это AUTomotive Open System Architecture Немного про AUTOSAR 19
  • 20.  AUTOSAR – это AUTomotive Open System Architecture Немного про AUTOSAR 20  BMW Group  Bosch  Continental  Daimler AG  Ford  General Motors  PSA Peugeot Citroën  Toyota  Volkswagen  …и еще более 200 партнёров
  • 21.  AUTOSAR – это AUTomotive Open System Architecture  AUTOSAR – это методология разработки  AUTOSAR C++ – часть этой методологии Актуальная версия:  AUTOSAR C++: 19-03 – более 350 правил Немного про AUTOSAR 21
  • 22. MISRA C++ и AUTOSAR C++ 22 MISRA C++ AUTOSAR C++ C++03 ✓ ✓ C++11 ☓ ✓ C++14 ☓ ✓
  • 24. 1.Mandatory – обязательные к следованию 2.Required – допустимы отклонения 3.Advisory – следование опционально Категории правил: 24
  • 25. Обязательные правила:  Не используйте значение неинициализированной переменной  Не используйте указатель на FILE после закрытия потока  Не пишите недостижимый код  Счетчик цикла не должен иметь floating-point тип  … Примеры правил 25
  • 26. Необходимые правила:  Не используйте goto и longjmp  Каждый switch должен заканчиваться default  Тела операторов if, else, for, while, do, switch должны быть завернуты в скобки  Не используйте вариативные функции  … Примеры правил 26
  • 27. …и все остальные:  Суффикс ‘L’ должен всегда быть заглавным (42L)  Не используйте адресную арифметику (кроме [] и ++)  Не используйте оператор «запятая»  Не изменяйте параметр функции внутри тела  … Примеры правил 27
  • 29. Еще есть много всего!  Классификация правил по разным признакам  Применимость к генерированному коду  Полный список undefined/unspecified/etc… поведений  Чек-листы по настройке анализаторов, процессу проверки, и т.д  Матрица пересечений с другими стандартами  Примеры документации А что есть помимо правил? 29
  • 30. Использование стандартов в ваших проектах 30
  • 31.  Проверять вручную? Кошмар!  Используйте статические анализаторы кода  Статический анализ – это автоматизированный процесс code review Проверка кода на соответствие 31
  • 32.  Начните использовать стандарт ДО начала проекта  Если уже есть код – подумайте несколько раз Внедрение 32
  • 33.  Прячем старые ошибки – работаем в привычном темпе  С этого момента видим только новые предупреждения  Получаем пользу от анализатора СРАЗУ  Спрятанные ошибки не забываем! Возвращаемся и потихоньку правим. Используйте подавление сообщений! 33
  • 34. Как работать с suppress-базой 34
  • 35.  Локально на компьютерах разработчиков (плагины для IDE, системы мониторинга компиляции) Как и где стоит проводить проверку 35
  • 36.  В системах непрерывной интеграции (command-line утилиты, плагины для CI-систем, системы мониторинга) Как и где стоит проводить проверку 36
  • 37. Как и где стоит проводить проверку 37
  • 38. Вам понадобятся:  Код, соответствующий уровням Mandatory и Required  План обеспечения соответствия (guide enforcement plan)  Документация по всем отклонениям  Документация по всем предупреждениям компиляторов и статических анализаторов  Резюме о соответствии правилам (guideline compliance summary) Как доказать соответствие вашего проекта? 38
  • 39. Пример guide enforcement plan: План обеспечения соответствия 39 Правило Компилятор Анализатор Обзор кода “A” “B” “A” “B” … 5.1 No errors No errors --- --- Procedure x 5.2 No errors No errors Warning V2561 No messages … 10.4 Warning 458 No errors No warnings No messages …
  • 40.  Иногда четко следовать стандарту невозможно. Пример: const unsigned char *PORT = 0x10u;  Специфика отклонений разная Тщательно документируйте отклонения 40
  • 41.  Документация отклонения должна содержать:  Номер нарушенного правила  Локацию нарушения  Обоснованность  Доказательство безопасности  Потенциальные последствия Тщательно документируйте отклонения 41
  • 42. Пример guideline compliance summary Резюме о соответствии правилам 42 Правило Категория MISRA Соответствие … 5.1 Mandatory Соответствует 5.2 Required Есть отклонения … 10.4 Advisory Не используется …
  • 43.  Весь C/C++ код соответствует Mandatory и Required  План обеспечения соответствия полностью заполнен  Все отклонения задокументированы  Все предупреждения компиляторов и анализаторов исправлены или размечены  Заполнено резюме о соответствии Поздравляю! Вы достигли безопасности на максималках!!! Итог: 43
  • 44. MISRA Compliance: 2016 Achieving compliance with MISRA Coding Guidelines Подробнее про соответствие стандартам MISRA 44
  • 45. 1. Долой сложные ветвления, goto и рекурсию 2. Все циклы должны быть ограничены 3. Динамические аллокации памяти – в топку 4. Всякая функция должна умещаться на листе бумаги 5. Не больше двух runtime-ассертов на функцию The Power of 10: золотые правила NASA 45
  • 46. The Power of 10: золотые правила NASA 46 6. Данные должны объявляться в самом низком scope 7. Функция что-то возвращает? Обязательно проверить! 8. Не используйте препроцессинг 9. Никаких вложенных указателей 10. «Правило нуля предупреждений»
  • 47. Статья по теме: The Power of 10: золотые правила NASA 47
  • 49.  Иногда классических способов обеспечения качества недостаточно  Внутри MISRA и AUTOSAR C++  Использование стандартов в ваших разработках Подведем итоги 49