С++ предоставляет разработчику огромную свободу действий и власть над происходящим в программе. Расплачиваться за это приходится легкостью написания кода, который на много часов отправит программиста в увлекательный мир отладки и анализа crash report'ов; поможет злоумышленникам вмешаться в работу системы или повредит данные пользователя. В своем докладе я рассмотрю наиболее популярные на сегодняшний день уязвимости и ошибки в программах: откуда они берутся и как избежать их появления в коде на C++. Вместе с тем, я рассмотрю различные аспекты безопасного гарантирующего корректность своей работы C++ кода и практические рекомендации по его написанию.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Тестирование графического интерфейса пользователя является одним из основных видов тестирования графических приложений. В докладе будут рассмотрены задачи и особенности такого тестирования.
Далее будут рассмотрены плюсы и минусы использования стандартной Qt библиотеки QTest, и представлен проект QSpec, как альтернатива QTest. Также будут представлены примеры использования QSpec и дальнейшие планы по развитию этого проекта.
Адрес проекта: https://github.com/ugeneunipro/QSpec
Модели памяти в С++ – Ordnung muss sein. Почему неправильно приготовленный поток может завершить приложение, и как этого избежать – рецепты от потоковедов. Как договариваться о совместном использовании ресурсов, и как избежать сторонних эффектов и подводных камней этих договоренностей. Обзор инструментария для изготовления многопоточных приложений.
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)corehard_by
В C++ приложениях, которые по тем или иным причинам используют JSON, как правило есть необходимость трансформировать данные из JSON представления в С++ структуры и наоборот. Речь пойдет об одной небольшой header-only библиотеке, которая позволяет облегчить этот рутинный кусок работы (https://bitbucket.org/sobjectizerteam/json_dto-0.1).
Разработка и тестирование интернета вещей. Тренды индустрииcorehard_by
Мы, прежде всего, поговорим о том, как бизнесс тренды Мобильной разработки и Интернета Вещей повлияют на технические тренды Development-а и Quality Assurance. Какие сложности нас подстерегают, какие знания и умения будут остро необходимы, какие типы тестирования станут наиболее востребоваными, а инструменты актуальными. Приведем многочисленные примеры “отечественных” проектов, в работе над которыми можно поучаствовать не в «гипотетических» монстрах, вроде Microsoft, IBM, Google, а в РБ или РФ, здесь и сейчас. Материал основан на последних отчетах профильных организаций и, конечно же, личном опыте. Уверен, каждый из нас, от юного разработчика и QA специалиста до Project/Resource Manager-а, извлечет свой «урок» из предложенного материала.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
о некоторых вопросах бинарной совместимости в C++corehard_by
При написании кода на C++ часто появляются вопросы о том, как он будет взаимодейтсвовать с внешним миром. Ответить на эти вопросы порой бывает нелегко, и причиной этому служит отсуствие описания ABI в стандарте C++. В докладе рассмотрим, что такое ABI, и как программисты C++ живут в отсутсвии стандарта на него.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Тестирование графического интерфейса пользователя является одним из основных видов тестирования графических приложений. В докладе будут рассмотрены задачи и особенности такого тестирования.
Далее будут рассмотрены плюсы и минусы использования стандартной Qt библиотеки QTest, и представлен проект QSpec, как альтернатива QTest. Также будут представлены примеры использования QSpec и дальнейшие планы по развитию этого проекта.
Адрес проекта: https://github.com/ugeneunipro/QSpec
Модели памяти в С++ – Ordnung muss sein. Почему неправильно приготовленный поток может завершить приложение, и как этого избежать – рецепты от потоковедов. Как договариваться о совместном использовании ресурсов, и как избежать сторонних эффектов и подводных камней этих договоренностей. Обзор инструментария для изготовления многопоточных приложений.
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)corehard_by
В C++ приложениях, которые по тем или иным причинам используют JSON, как правило есть необходимость трансформировать данные из JSON представления в С++ структуры и наоборот. Речь пойдет об одной небольшой header-only библиотеке, которая позволяет облегчить этот рутинный кусок работы (https://bitbucket.org/sobjectizerteam/json_dto-0.1).
Разработка и тестирование интернета вещей. Тренды индустрииcorehard_by
Мы, прежде всего, поговорим о том, как бизнесс тренды Мобильной разработки и Интернета Вещей повлияют на технические тренды Development-а и Quality Assurance. Какие сложности нас подстерегают, какие знания и умения будут остро необходимы, какие типы тестирования станут наиболее востребоваными, а инструменты актуальными. Приведем многочисленные примеры “отечественных” проектов, в работе над которыми можно поучаствовать не в «гипотетических» монстрах, вроде Microsoft, IBM, Google, а в РБ или РФ, здесь и сейчас. Материал основан на последних отчетах профильных организаций и, конечно же, личном опыте. Уверен, каждый из нас, от юного разработчика и QA специалиста до Project/Resource Manager-а, извлечет свой «урок» из предложенного материала.
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
Одной из проблем C++ является большое количество конструкций, поведение которых не определено или просто неожиданно для программиста. С такими ошибками мы часто сталкиваемся при разработке статического анализатора кода. Но, как известно, лучше всего находить ошибки ещё на этапе компиляции. На этом докладе мы поговорим о том, какие техники из современного C++ позволяют писать не только более простой и выразительный, но и безопасный код. Вы увидите ошибки в коде различных Open Source проектов и узнаете, как можно их избежать, используя новые стандарты
о некоторых вопросах бинарной совместимости в C++corehard_by
При написании кода на C++ часто появляются вопросы о том, как он будет взаимодейтсвовать с внешним миром. Ответить на эти вопросы порой бывает нелегко, и причиной этому служит отсуствие описания ABI в стандарте C++. В докладе рассмотрим, что такое ABI, и как программисты C++ живут в отсутсвии стандарта на него.
Хочется чего-то новенького, необычного? Тогда добро пожаловать в мир чудеc C++17:
if constexpr (auto& [number, ok] = variable; ok)
return "Hi"
else
return number + 42;
Вы услышите о новом стандарте C++, обнаружите для себя новые полезные классы, функции и возможности языка. Для каждой новинки я приведу примеры использования, расскажу о нюансах и подводных камнях.
А ещё вы узнаете о том, как проходят заседания комитета по стандартизации C++ и сможете задать интересующие вас вопросы связанные с нововведениями С++17 и С++Next.
В своих прошлых докладах (http://cpp-russia.ru/?p=198, и http://cpp-russia.ru/?page_id=1239) я рассказывал о C++ без исключений, как с эти жить, как работать. Этот доклад является продолжением этой серии. Я рекомендую освежить в памяти предыдущие доклады, чтобы наша работа была более продуктивной. Мы обсудим механизмы создания, копирования и перемещения объектов, механизмы аллокации и деаллокации памяти, а также обработку ошибок и исключений. Также мы обсудим проблемы и неудобства, которые испытывает программист, когда пишет код без исключений. В конце, я попытаюсь показать, как можно проектировать структуры данных, контейнеры для удобной работы в средах с исключениями и без исключений.
Аварийное завершение приложения — более чем неприятная ситуация. Особенно неприятно, если она случается уже на устройстве пользователя, когда нет возможности запустить отладчик и найти проблему. Тут и приходят на помощь разработчику системы отправки и анализа отчетов о падениях и техники postmortem debugging'а. Поговорим о существующих системах аналитики крэшей и чем они полезны для C++ разработчика.
Переполнение буфера и другие уязвимости ПО - Роман ОлейниковHackIT Ukraine
Презентация с форума http://hackit-ukraine.com/
Роман Олейников
ХНУ им. В.Н.Каразина.
Переполнение буфера и другие уязвимости ПО
Теория и практика защиты.О спикере: Проф. каф. безопасности информационных систем и технологий. Начальник отдела научных исследований АО "Институт информационных технологий", г.Харьков (основная должность); приглашенный профессор в университете г.Берген (Норвегия); приглашенный профессор в Samsung Advanced Technology Training Institute (Ю.Корея);профессор кафедры безопасности информационных технологий Харьковского национального университета радиоэлектроники;
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
Доклад посвящён преимуществам и недостаткам C++ в сравнении с C и ассемблером в контексте разработки критичных к производительности библиотек, использующих специфичные для платформы возможности. На примерах реализации оптимизированных компонентов аудио- и видеокодеков мы рассмотрим, как можно упростить исходный код с помощью нестандартных расширений компилятора и новых возможностей C++11. Внимание также будет уделено функциональности, которой не хватает в текущих реализациях компилятора. В качестве целевых платформ используются ARMv7+NEON/ARM64, но предварительного знакомства с ними не требуется.
Перехват беспроводных гаджетов — от квадрокоптеров до мышекPositive Hack Days
Автор: Артур Гарипов
Доклад посвящен общим аспектам применения SDR (software-defined radio) в анализе радиоэфира. Ведущий покажет, как происходят поиск и определение беспроводных устройств, анализ протоколов и их спуфинг, перехват управления беспроводным оборудованием, атака Mousejack.
C++ является одним из самых распространенных и широко используемых языков программирования. Python становится все более популярным языком программирования и используется в различных сферах IT. С++ отлично подходит для оптимизации по скорости исполнения, Python же ориентирован на скорость разработки. Создавая гибридное решение можно пользоваться преимуществами этих двух мощных инструментов, но не стоит забывать и про недостатки. В докладе будет освещены методы интеграции С++ и Python и выбора подходящего языка для соответствующих задач.
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
В этом докладе Дмитрий кратко рассказывает о таком звере, как LLVM, о котором много кто слышал, но немногие щупали.
Что такое компилятор на самом деле? Как происходит компиляция программы, как работают оптимизации и, наконец, откуда берется неопределенное поведение в детерменированных программах на C++?
Михаил Белопухов: OpenBSD: Куда катится крипто?Yandex
В своем докладе я расскажу о прошлом, настоящем и будущем использования криптографии и криптографического стека в OpenBSD. Мы коснемся поддержки AES-NI и AES-GCM, использования ChaCha20 в качестве замены ARC4 в PRNG. Кроме того, рассмотрим альтернативы алгоритмам, стандартизованным NIST: ChaCha20, Poly1305, Curve25519, и их использование в OpenSSH и OpenBSD.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Универсальный сигнатурный анализ кода на C#, Java, PHPИван Кочуркин
В данном докладе затронуты такие темы, как теория и проблемы парсинга, построение и обход абстрактных синтаксических деревьев (AST) и разработка предметно-ориентированного языка (DSL).
Рассматриваются такие проблемы парсинга, как разбор контекстно-зависимых языков, обработка ошибок и др. В качестве примера применения теории приведена грамматика PHP, разработанная для генератора парсеров ANTLR.
Далее рассматриваются структура унифицированного AST, методы его обхода и сопоставления с паттернами.
Завершающей частью презентации является описание DSL, разработанного с целью записи существующих и будущих паттернов. Также приведены примеры некоторых паттернов для лучшей усвояемости материала.
Хочется чего-то новенького, необычного? Тогда добро пожаловать в мир чудеc C++17:
if constexpr (auto& [number, ok] = variable; ok)
return "Hi"
else
return number + 42;
Вы услышите о новом стандарте C++, обнаружите для себя новые полезные классы, функции и возможности языка. Для каждой новинки я приведу примеры использования, расскажу о нюансах и подводных камнях.
А ещё вы узнаете о том, как проходят заседания комитета по стандартизации C++ и сможете задать интересующие вас вопросы связанные с нововведениями С++17 и С++Next.
В своих прошлых докладах (http://cpp-russia.ru/?p=198, и http://cpp-russia.ru/?page_id=1239) я рассказывал о C++ без исключений, как с эти жить, как работать. Этот доклад является продолжением этой серии. Я рекомендую освежить в памяти предыдущие доклады, чтобы наша работа была более продуктивной. Мы обсудим механизмы создания, копирования и перемещения объектов, механизмы аллокации и деаллокации памяти, а также обработку ошибок и исключений. Также мы обсудим проблемы и неудобства, которые испытывает программист, когда пишет код без исключений. В конце, я попытаюсь показать, как можно проектировать структуры данных, контейнеры для удобной работы в средах с исключениями и без исключений.
Аварийное завершение приложения — более чем неприятная ситуация. Особенно неприятно, если она случается уже на устройстве пользователя, когда нет возможности запустить отладчик и найти проблему. Тут и приходят на помощь разработчику системы отправки и анализа отчетов о падениях и техники postmortem debugging'а. Поговорим о существующих системах аналитики крэшей и чем они полезны для C++ разработчика.
Переполнение буфера и другие уязвимости ПО - Роман ОлейниковHackIT Ukraine
Презентация с форума http://hackit-ukraine.com/
Роман Олейников
ХНУ им. В.Н.Каразина.
Переполнение буфера и другие уязвимости ПО
Теория и практика защиты.О спикере: Проф. каф. безопасности информационных систем и технологий. Начальник отдела научных исследований АО "Институт информационных технологий", г.Харьков (основная должность); приглашенный профессор в университете г.Берген (Норвегия); приглашенный профессор в Samsung Advanced Technology Training Institute (Ю.Корея);профессор кафедры безопасности информационных технологий Харьковского национального университета радиоэлектроники;
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
Доклад посвящён преимуществам и недостаткам C++ в сравнении с C и ассемблером в контексте разработки критичных к производительности библиотек, использующих специфичные для платформы возможности. На примерах реализации оптимизированных компонентов аудио- и видеокодеков мы рассмотрим, как можно упростить исходный код с помощью нестандартных расширений компилятора и новых возможностей C++11. Внимание также будет уделено функциональности, которой не хватает в текущих реализациях компилятора. В качестве целевых платформ используются ARMv7+NEON/ARM64, но предварительного знакомства с ними не требуется.
Перехват беспроводных гаджетов — от квадрокоптеров до мышекPositive Hack Days
Автор: Артур Гарипов
Доклад посвящен общим аспектам применения SDR (software-defined radio) в анализе радиоэфира. Ведущий покажет, как происходят поиск и определение беспроводных устройств, анализ протоколов и их спуфинг, перехват управления беспроводным оборудованием, атака Mousejack.
C++ является одним из самых распространенных и широко используемых языков программирования. Python становится все более популярным языком программирования и используется в различных сферах IT. С++ отлично подходит для оптимизации по скорости исполнения, Python же ориентирован на скорость разработки. Создавая гибридное решение можно пользоваться преимуществами этих двух мощных инструментов, но не стоит забывать и про недостатки. В докладе будет освещены методы интеграции С++ и Python и выбора подходящего языка для соответствующих задач.
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
В этом докладе Дмитрий кратко рассказывает о таком звере, как LLVM, о котором много кто слышал, но немногие щупали.
Что такое компилятор на самом деле? Как происходит компиляция программы, как работают оптимизации и, наконец, откуда берется неопределенное поведение в детерменированных программах на C++?
Михаил Белопухов: OpenBSD: Куда катится крипто?Yandex
В своем докладе я расскажу о прошлом, настоящем и будущем использования криптографии и криптографического стека в OpenBSD. Мы коснемся поддержки AES-NI и AES-GCM, использования ChaCha20 в качестве замены ARC4 в PRNG. Кроме того, рассмотрим альтернативы алгоритмам, стандартизованным NIST: ChaCha20, Poly1305, Curve25519, и их использование в OpenSSH и OpenBSD.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Универсальный сигнатурный анализ кода на C#, Java, PHPИван Кочуркин
В данном докладе затронуты такие темы, как теория и проблемы парсинга, построение и обход абстрактных синтаксических деревьев (AST) и разработка предметно-ориентированного языка (DSL).
Рассматриваются такие проблемы парсинга, как разбор контекстно-зависимых языков, обработка ошибок и др. В качестве примера применения теории приведена грамматика PHP, разработанная для генератора парсеров ANTLR.
Далее рассматриваются структура унифицированного AST, методы его обхода и сопоставления с паттернами.
Завершающей частью презентации является описание DSL, разработанного с целью записи существующих и будущих паттернов. Также приведены примеры некоторых паттернов для лучшей усвояемости материала.
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
Поиск уязвимостей с использованием статического анализа кода, Андрей Карпов и Евгений Рыжков
В последнее время мы все слышим о новых и новых уязвимостях, обнаруженных в программном обеспечении. Уже стало очевидно, что писать код без уязвимостей человечество не может. Но могут ли современные инструменты разработки помочь обнаружить хотя бы некоторые ошибки? В докладе НЕ будет фраз типа «купите такой-то инструмент, чтобы не допускать уязвимостей в своем и чужом коде». На реальных примерах мы попробуем показать какие типы уязвимостей или по-другому программных дефектов могут быть найдены с помощью технологий анализа кода, а какие – пока нет. Ну и конечно как писать код так, чтобы снизить вероятность появления уязвимостей в своем коде.
Поиск уязвимостей с использованием статического анализа кодаAndrey Karpov
Уязвимости - это те же самые обыкновенные ошибки. Зачем их выделять? Делайте это, если хотите заработать больше денег. CWE - Common Weakness Enumeration. CVE - Common Vulnerabilities and Exposures. Теперь с помощью Valgrind вы ищете не утечку памяти, а отказ в обслуживании!
Similar to Теория и практика написания безопасного кода на C++ (20)
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
Использование сторонних библиотек в языке C++ никогда не было простым - необходимо было правильно собрать их, имея дело с различными системами сборки, но с появлением пакетного менеджера conan.io процесс стал намного проще, так что теперь осталось только сделать пакеты для нужным библиотек, и в этом поможет команда bincrafter-ов.
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
На предыдущих конференциях C++ CoreHard автор доклада рассказывал про Модель Акторов и опыт ее использования в C++. Но Модель Акторов -- это далеко не единственный способ борьбы со сложностью при работе с многопоточностью. Давайте попробуем поговорить о том, что еще можно применить и как это может выглядеть в C++.
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
Если вам важна скорость работы ваших программ, то вы обязаны понимать, как работает ваше "железо". Современный процессор -- это сложное устройство, многие механизмы которого могут неочевидным образом влиять на скорость исполнения вашего кода. В докладе дается обзорное представление основных структур современного процессора и подробно рассматривается работа иерархии памяти. Будут освещены следующие темы: организация кэш-памяти, принцип локальности, предподкачка данных, нежелательное общее владение данными, а также программные техники для эффективной работы с памятью.
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
Информационная безопасность все больше из отдельной сферы плавно перетекает в разработку ПО. А значит «обычным» программистам приходится понимать те требования и терминологию, которые специалисты по безопасности уже давно знают и используют. CWE, CERT, MISRA, SAST– для «обычных» программистов это непонятные аббревиатуры. Поэтому в обзорном докладе мы попробуем рассказать простым языком об этих понятиях так, чтобы все разработчики начали уверенно ориентироваться в этой теме.
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
Вот уже более двух лет мы создаём онлайн-специализацию по С++ на платформе Coursera. Её цель — обучить языку C++ с нуля до уровня, достаточного для решения практических задач, с которыми приходилось сталкиваться авторам в своей практике. В своём докладе я расскажу, как мы создаём наши онлайн-курсы, и уделю особое внимание техническим проблемам, которые нам пришлось решить в процессе создания автоматической системы проверки программ студентов.
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
В докладе обсуждаются способы улучшения времени сборки C++ проектов, опыт полученный в ходе ускорения сборки клиента и тулов World Of Tanks. Также описывается эффект, который они оказывают на организацию кодобазы (как позитивный, так и негативный) и затраты, которые необходимы для поддержки этих решений, т.к. не все они бесплатны. Методики, описываемые в докладе: ускорение линковки (Incremental Linking, Fastlink), ускорение компиляции(Include what you use, использование precompiled headers).
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
Доклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
Все мы знаем, что компиляторы в настоящее время достаточно умные. И нам как программистам зачастую не нужно думать о каких-то незначительных оптимизациях - мы полагаемся на оптимизации компилятора. Что ж, настало время выяснить, действительно ли настолько компиляторы умны и узнать, в каких местах программист всё же (может быть) умнее.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
What do threads, atomic variables, mutexes, and conditional variables have in common? They are the basic building blocks of any concurrent application in C++, which are even for the experienced C++ programmers a big challenge. This massively changed with C++17 and change even more with C++20/23. What did we get with C++17, what can we hope for with C++20/23? With C++17, most of the standard template library algorithms are available in sequential, parallel, and vectorised variants. With the upcoming standards, we can look forward to executors, transactional memory, significantly improved futures and coroutines. To make it short. These are just the highlights from the concurrent and parallel perspective. Thus there is the hope that in the future C++ abstractions such as executors, transactional memory, futures and coroutines are used and that threads, atomic variables, mutexes and condition variables are just implementation details.
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
Язык C++, претерпев долгую эволюцию, обрёл ряд черт, характерных для функциональной парадигмы: функции стали полноправными объектами, над которыми могут выполняться операции, а аппарат шаблонов позволяет проводить вычисления на типах на этапе компиляции. Математический фундамент этих двух главных аспектов составляют, соответственно, ламбда-исчисление и теория категорий. Расширение языка этими средствами способствовало реализации на языке C++ ряда инструментов, известных из функционального программирования. Некоторые из этих реализаций вошли в стандартную библиотеку (std::function, std::bind), другие - в сторонние библиотеки, в том числе в коллекцию библиотек Boost (functional, hana). Важную роль в арсенале функционального программирования играют операции свёртки и развёртки, которые очевиднее всего определяются для списков, но также естественным образом обобщаются на другие индуктивные и коиндуктивные структуры данных. Например, суммирование списка чисел можно представить себе как свёртку списка по операции сложения, а построение списка простых множителей заданного целого числа - как развёртку. Обобщения свёртки и развёртки известны как анаморфизмы и катаморфизмы. Также в функциональном программировании находит применение понятие гиломорфизма - композиция развёртки некоторого объекта в коллекцию с последующей свёрткой её в новый объект. В докладе продемонстрировано, что свёртки, развёртки и их композиции допускают довольно простую реализацию на языке C++.
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
Доклад посвящен часто используемому шаблону в моих проектах по анализу данных, когда обучение и настройка моделей происходят с использованием python, а вот их запуск в промышленное использование на языке C++. Предлагается рассмотреть несколько учебных примеров реализации такого подхода, от простой линейной регрессии до обработки изображений с помощью нейронных сетей.
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
This talk will be about the design and implementation of a reactive programming model inspired by ranges that allows easy implementation of asynchronous and distributed software systems by writing code that looks like a sequence of ordinary range transformations like filter, transform, etc. This programming model will be demonstrated along with the implementation of a simple asynchronous web service where the whole system logic is defined as a chain of range transformations.
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
Macros, templates, compile-time evaluation and code generation, reflection and metaclasses – C++ tends to hide the final code passed to the compiler under the tons of various names and aliases. Add here the preprocessor that shadows the actual running curve of your program with dozens of alternatives mixed in a non-trivial way. While this allows to avoid boilerplate code and reduce copy-paste and other errors, such an approach demands better tooling support to make the debugging process easier. To find an error in such a code, one has to continuously read-fix-run it and compare the results with some etalon, or to debug in order to find actual substitutions. But should you really wait until your code is run or even compiled to debug it? Or how to deal with the situations when the code can’t be run on the local machine? A text editor with code completion won’t help, while a smart IDE that “gets” your code can do a better job. In this talk we’ll see interesting approaches to solving cases like macro and typedef ‘debug’, understanding types when auto/decltype hide them, dealing with different code branches depending on the preprocessor’s pass-through, and other ideas. Some suggestions are already implemented as ready-to-use features in CLion and ReSharper C++, tools for C++ from JetBrains (that means I can show it in action), others are planned for the future. The aim of this talk is to share the workflows supported by the tools that can help C++ developers create better modern C++ code.
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
Text formatting has been a favorite problem of C++ library authors for a long time. The standard C++ iostreams have been criticized for being difficult to use due to their statefulness and slow due to runtime polymorphism. Despite its age, printf is still popular because of simplicity and speed. The Boost library offers two more alternatives, Boost.Format and Boost.LexicalCast. And finally, the P0645 standard proposal sponsored by Facebook is currently finding its way through the C++ committee. All these approaches are still firmly based on standard containers and iterators. But the Standard Library is changing radically with the advent of ranges, range adaptors and functional style programming in C++. Generating optimized code with metaprogramming is becoming standard fare. In this talk, I want to convince you that the combination of ranges with a bit of metaprogramming makes for a very elegant solution to the text formatting problem. We introduce a form of ranges with internal iteration, which are generating their elements one by one rather than exposing external iterators. We can use these generator ranges to represent the values to be formatted, conceptually turning them into lazily evaluated strings. These can be used just like regular strings are used today: in function returns; as standard algorithm input; embedded into other, equally lazily evaluated strings; and so on, before they are finally expanded for display. By choosing the right interfaces, we can optimize this expansion at compile-time, making it no less pretty to write, but more efficient to expand than any text formatting approaches that rely on format strings that must be parsed at runtime. I believe that this approach is the natural extension of a range-based future standard library to text formatting.
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
Память в компьютере - это не только гигабайты оперативной памяти в слоте, но и занятная абстракция. В докладе мы рассмотрим, как можно эту абстракцию использовать необычным образом для моделирования других абстракций - регистровых файлов периферийных устройств. Доклад будет полезен не только embedded-разработчикам, но и, возможно, заставит переосмыслить свой взгляд на память.
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
Как правило, можно положиться на то, что компилятор оптимизирует результирующий бинарный файл так, чтобы она работала максимально быстро. Но компилятор не знает на каких данных и на каком железе программа будет запущена. Плюс хотелось бы, чтобы компиляция занимала приемлемое время. Из-за этого результат может оказаться субоптимальным. Предлагаю на примерах для LLVM посмотреть как можно подсказать компилятору как оптимизировать программу и сделать результат лучше или хуже.
Мы напишем простейший веб-сервис из клиента и сервера на C++. На этом C++ часть закончится, и пойдет настройка окружения и инфраструктуры. Мы обеспечим детерминируемость сборки и прогона тестов. Облегчим последующее обновление зависимых библиотек. Автоматизируем статические проверки, верификацию кода, прогон тестов. Обеспечим доступность сервиса, настроим инфраструктуру, сбалансируем нагрузку, добавим автоматическое и ручное масштабирование. И под конец мы настроим continious delivery таким образом, что код будет на продакшене через 5 минут после реквеста, при этом даже невалидные изменения и ошибки программиста не смогут повлиять на его работу.
Теория и практика написания безопасного кода на C++
1. ТЕОРИЯ И ПРАКТИКА НАПИСАНИЯ
БЕЗОПАСНОГО КОДА НА C++
ЛАПИЦКИЙ АРТЕМ
LAPITSKY.ARTEM@GMAIL.COM
2.
3. 2
COREHARD // ВВЕДЕНИЕ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ПОЧЕМУ МОЙ КОД МОЖЕТ БЫТЬ НЕБЕЗОПАСНЫМ?
С++ – это конгломерат различных языков
• C, classes, template metaprogramming, preprocessor, STL
• Множество способов решения одной задачи
• Подводные камни на стыке различных подмножеств языка
Высокая ответственность программиста
• Как можно меньше ограничивать разработчика (в том числе и в
возможности выстрелить себе в ногу) – часть философии языка
• В стандарте более двухсот упоминаний ситуаций undefined
behavior и около ста – unspecified behavior
4. 3
COREHARD // ВВЕДЕНИЕ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ПОЧЕМУ МОЙ КОД МОЖЕТ БЫТЬ НЕБЕЗОПАСНЫМ? (2)
Возможности, которые слишком легко использовать неверно
• Адресная арифметика, перегрузка операторов, функции с
переменным числом аргументов, приведение типов в стиле C…
Наследие C
• Синтаксис и философия C;
• Сочетание языка высокого уровня и максимальной
эффективности;
• “You don't pay for what you don't use”;
• Небезопасные функции стандартной библиотеки.
5. 4
COREHARD // ВВЕДЕНИЕ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ЗАЧЕМ ПИСАТЬ БЕЗОПАСНЫЙ КОД?
Ошибки стоят дорого
• 4 июня 1996 года на 39-й секунде полета новейшая беспилотная
ракета-носитель «Ariane 5» взорвалась из-за возникшей ошибки
переполнения целого числа. Стоимость ракеты вместе со
спутниками составила более $8 млрд.
Время стоит дорого
• Отлаживать C/С++ программы – не самое быстрое (и приятное)
занятие;
• Применение практик написания безопасного кода ускоряет
процесс разработки.
6. 5
COREHARD // ВВЕДЕНИЕ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ЗАЧЕМ ПИСАТЬ БЕЗОПАСНЫЙ КОД? (2)
Меньше уязвимостей
• Одна из методик разработки защищенного программного
обеспечения;
• С меньшей вероятностью содержит уязвимости, которые
позволят злоумышленникам совершить недружественные
действия.
Выше надежность
• Обеспечение корректности работы программ;
• Путь к разработке надежного программного обеспечения.
10. 9
Безопасность границ памяти (bounds safety)
Безопасность времени жизни объектов (lifetime safety)
Безопасность типов (type safety)
Безопасность арифметических операций (arithmetic safety)
Безопасность относительно исключений (exception safety)
Безопасность работы в многопоточной среде (thread safety)
Защищенный код (security)
COREHARD // АСПЕКТЫ БЕЗОПАСНОСТИ КОДА
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
АСПЕКТЫ БЕЗОПАСНОСТИ КОДА
12. 11
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ (BOUNDS SAFETY)
Чтение или запись данных за пределами выделенной области
памяти позволяет очень скоро познакомиться с лучшим
другом C++ разработчика — undefined behavior.
13. 12
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
BUFFER OVERFLOW
Запись в память за пределами выделенного участка (buffer
overflow) может привести к
аварийному завершению приложения с ошибкой сегментации
памяти (SIGSEGV, ACCESS_VIOLATION);
неожиданному поведению из-за модификации данных, не
связанных с выполняемым в данный момент кодом;
порче пользовательских данных;
самому худшему — программа продолжит работать без
обнаруживаемых проблем.
14. 13
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
КАК РОЖДАЮТСЯ ОШИБКИ BUFFER OVERFLOW
Использование адресной арифметики;
Выход за пределы массива;
Использование небезопасных (unchecked) функций работы с
диапазонами данных;
Нарушение правил безопасности типов (type safety).
15. 14
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ИСПОЛЬЗОВАНИЕ АДРЕСНОЙ АРИФМЕТИКИ
struct big{
unsigned long long ull_1; /* typically 8 bytes */
unsigned long long ull_2; /* typically 8 bytes */
unsigned long long ull_3; /* typically 8 bytes */
int si_4; /* typically 4 bytes */
int si_5; /* typically 4 bytes */
};
/* ... */
size_t skip = offsetof(struct big, ull_2);
struct big *s = (struct big *)malloc(sizeof(struct big));
if (!s) {
/* Handle malloc() error */
}
memset(s + skip, 0, sizeof(struct big) - skip);
/* ... */
free(s);
s = NULL;
memset((char *)s + skip, 0, sizeof(struct big) - skip);
16. 15
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ИСПОЛЬЗОВАНИЕ АДРЕСНОЙ АРИФМЕТИКИ (2)
Не используйте адресную арифметику с полиморфным
типами — это undefined behavior! Исключение составляют
только классы со спецификатором final.
Base
Base
Derived Derived a[2]; Base *ptr = &a[0];
++ptr;
17. 16
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ИСПОЛЬЗОВАНИЕ АДРЕСНОЙ АРИФМЕТИКИ (3)
Не всегда интуитивно понятно;
Требует ручной реализации контроля границ буфера;
Нельзя использовать с объектами полиморфных классов;
В целом, хрупкий и ошибкоопасный инструмент языка,
требующий от разработчика предельной осторожности и
внимания;
Использование контейнеров стандартной библиотеки или
обертки над массивом gsl::span – гораздо лучший вариант.
T *ptr; int n;
assert(reinterpret_cast<std::uintptr_t>(ptr + n) == reinterpret_cast<std::uintptr_t>(ptr) + n * sizeof(T));
19. 18
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
operator[] стандартных контейнеров C++ не проверяет
границ, а функции std::<container>::at() — проверяют.
int values[10];
values[0] = 1; // OK!
values[-1] = 2; // Undefined behavior
values[10] = 42; // Undefined behavior
std::array<int, 10> values;
values[0] = 1; // OK!
values[11] = 2; // Undefined behavior
values.at(11) = 5; // OK! Throws std::out_of_range
values.at(-1) = 5; // OK! Throws std::out_of_range
ВЫХОД ЗА ПРЕДЕЛЫ МАССИВА
20. 19
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
Всегда следует проверять значение индекса (массива), который был получен
извне (переменные окружения; аргументы функции main; пользовательский
ввод; данные, прочитанные из файла или полученные по сети).
const size_t packet_types_count = 10;
const size_t packet_size[packet_types_count] = {/* ... */};
/* ... */
int32 packet_type = read_packet_type(connection);
if (packet_type >= 0 && packet_type < packet_types_count)
{
size_t size = packet_size[packet_type];
/* ... */
}
else
{
throw InvalidPacket();
}
ВЫХОД ЗА ПРЕДЕЛЫ МАССИВА (2)
21. 20
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
Аналогично, доступ к элементам динамических массивов по индексу требует
проверки индекса относительно размера массива.
void main(int argc, char *argv[])
{
static const int mode_arg_idx = 1;
/*...*/
if (argc > mode_arg_idx)
{
std::string mode_name = argv[mode_arg_idx];
/*...*/
}
/*...*/
}
ВЫХОД ЗА ПРЕДЕЛЫ МАССИВА (3)
22. 21
COREHARD // БЕЗОПАСНОСТЬ ГРАНИЦ ПАМЯТИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
Использование небезопасных (unchecked) функций стандартной
библиотеки повышает шансы возникновения ошибок переполнения
буфера;
Включение в стандарт библиотеки Ranges и STL2 значительно
упростит работу с диапазонами
https://ericniebler.github.io/range-v3/
UNCHECKED ФУНКЦИИ СТАНДАРТНОЙ БИБЛИОТЕКИ
28. 27
COREHARD // БЕЗОПАСНОСТЬ ВРЕМЕНИ ЖИЗНИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
БЕЗОПАСНОСТЬ ВРЕМЕНИ ЖИЗНИ (LIFETIME SAFETY)
Чтобы обеспечить безопасность времени жизни объектов
следует
Не использовать объекты до того, как они были успешно
проинициализированы;
Удалять созданные в куче объекты;
Удалять созданные в куче объекты только единожды;
Не использовать объекты после истечения их времени жизни.
29. 28
COREHARD // БЕЗОПАСНОСТЬ ВРЕМЕНИ ЖИЗНИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ИСПОЛЬЗУЙТЕ RAII
Всегда отдавайте предпочтение использование идиомы RAII ручному
управлению ресурсами.
// Manual resource management
Foo *bar = new Foo();
/*...*/
delete bar;
Foo *lots_of_bars = new Foo[100];
/*...*/
delete []lots_of_bars;
// RAII way
std::unique_ptr<Foo> bar = std::make_unique<Foo>();
std::vector<Foo> lots_of_bars(100);
30. 29
COREHARD // БЕЗОПАСНОСТЬ ВРЕМЕНИ ЖИЗНИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
НЕ СОЗДАВАЙТЕ ВИСЯЧИЕ ССЫЛКИ
Не выносите ссылки на локальные/временные объекты за пределы их
области видимости.
// returned reference is dangling
const std::string& get_value()
{
std::string value;
/* ... */
return value;
}
// str is dangling
const char *str;
{
std::string value;
/* ... */
str = value.c_str();
}
// captured reference is dangling
std::function<void()> f;
{
std::string value;
/* ... */
f = [&]() {
std::cout << value;
};
}
31. 30
COREHARD // БЕЗОПАСНОСТЬ ВРЕМЕНИ ЖИЗНИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
НЕ СОЗДАВАЙТЕ ВИСЯЧИЕ ССЫЛКИ (2)
Будьте осторожны с функциями, которые возвращают ссылки или прокси-
объекты.
// r, max_str, min_str are dangling
const std::string& max_str = std::max("hello"s, "world"s);
const std::string& min_str = std::min("hello"s, "world"s);
const int& r = std::clamp(-1, 0, 255);
// beware of std::vector<bool>
std::vector<bool> some_bools{ /* ... */ };
auto first_bool = some_bools[0];
some_bools.clear();
// first_bool is invalid
32. 31
COREHARD // БЕЗОПАСНОСТЬ ВРЕМЕНИ ЖИЗНИ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
УЧИТЫВАЙТЕ ВОЗМОЖНОСТЬ ИНВАЛИДАЦИИ ИТЕРАТОРОВ
Модификация контейнеров может привести к инвалидации итераторов,
которые были созданы ранее. Невалидный итератор — это также
разновидность висячей ссылки.
std::vector<int> numbers{ 0, 1, 2, 3, 4 };
auto number_it = numbers.begin();
numbers.push_back(5); // probably involves memory reallocation
//number_it may be invalid
35. 34
COREHARD // БЕЗОПАСНОСТЬ ТИПОВ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
БЕЗОПАСНОСТЬ ТИПОВ (TYPE SAFETY)
Не использовать reinterpret_cast (в том числе через union);
Отказаться от static_cast для приведения вниз по иерархии
(downcast);
Не использовать понапрасну const_cast;
Не использовать приведение типов в стиле C;
Вместо union использовать variant (например,
boost::variant);
Вместо функций с переменным числом аргументов использовать
(varargs) использовать variadic templates;
Соблюдать One Definition Rule.
36. 35
COREHARD // БЕЗОПАСНОСТЬ ТИПОВ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ИСПОЛЬЗОВАНИЕ REINTERPRET_CAST
Оператор позволяет убедить компилятор
интерпретировать биты объекта одного
типа как объект другого типа, никак с
первым типом не связанного;
В общем случае гарантии корректности
такого преобразования отсутствуют;
Подталкивает к тому, чтобы делать предположения о способе
представления данных в памяти, что само по себе ненадежно и
ведет к написанию некроссплатформенного кода;
Нельзя использовать для приведения полиморфных типов,
поскольку reinterpret_cast никак не учитывает особенности
размещения таких объектов;
37. 36
COREHARD // БЕЗОПАСНОСТЬ ТИПОВ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ИСПОЛЬЗОВАНИЕ CONST_CAST
Позволяет избавиться от спецификаторов const и volatile;
Добавляет неожиданные для разработчика side-эффекты;
В случае если полученная после преобразования non-const ссылка
связана с настоящей константой, ее модификация приведет к undefined
behavior;
Компилятор неявно выполняет const_cast для строковых литералов (к
char*), так как это необходимо для работы с функциями стандартной
библиотеки C. Но это не значит, что строковые литералы можно
модифицировать!;
Использование оправдано только при работе с библиотеками C и API,
которые не использует спецификатор const при отсутствии side-
эффектов.
38. 37
COREHARD // ПРОФИЛИ БЕЗОПАСНОГО КОДА
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ИСПОЛЬЗОВАНИЕ C-STYLE CAST
Производит одно из следующих преобразований:
const_cast
static_cast
static_cast + const_cast
reinterpret_cast
reinterpret_cast + const_cast
Нет возможности узнать, какое именно преобразование произошло или
как-то повлиять на этот выбор;
Поведение может быть разным при одних и тех же преобразованиях в
зависимости от наличия/отсутствия определения преобразуемых типов.
39. 38
COREHARD // БЕЗОПАСНОСТЬ ТИПОВ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
СОБЛЮДАЙТЕ ONE DEFINITION RULE
Нарушение ODR – undefined behavior. Ошибки, связанные с нарушением ODR
сложно диагностировать.
#pragma once
class Foo
{
/* ... */
private:
int a1;
#ifdef ENABLE_SUPER_FEATURE
int a2;
int a3;
#endif
};
#define ENABLE_SUPER_FEATURE
/* ... */
#include "Foo.h"
size_t GetFooSize1()
{
return sizeof(Foo);
}
// returns 12
Foo.h GetFooSize1.cpp GetFooSize2.cpp
/* ... */
#include "Foo.h"
size_t GetFooSize2()
{
return sizeof(Foo);
}
// returns 4
42. 41
COREHARD // БЕЗОПАСНОСТЬ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
БЕЗОПАСНОСТЬ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ
Необходимо учитывать возможность «unsigned integer
wrapping» при совершении арифметических операций;
Перед выполнением арифметических операций с целыми
числами стоит удостовериться в том, что не произойдет
переполнение. Переполнение знакового целого — undefined
behavior;
Результат операции целочисленного деления на 0 (или взятие
остатка от деления на 0) не определен;
0 программистов ругал сердитый шеф,
Потом уволил одного, и стало их FF.
(с) Компьютерра
43. 42
COREHARD // БЕЗОПАСНОСТЬ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
БЕЗОПАСНОСТЬ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ (2)
int a = std::numeric_limits<int>::max();
int b;
b = a + 1; // Undefined behavior
b = -a; // OK!
/* int: –2,147,483,648 .. 2,147,483,647 */
b = a / 0; // Undefined behavior
b = a % 0; // Undefined behavior
a = std::numeric_limits<int>::min();
b = a - 1; // Undefined behavior
b = -a; // Undefined behavior
unsigned int c = std::numeric_limits<unsigned int>::max();
++c; // OK! Wrapping around
assert(c == std::numeric_limits<unsigned int>::min());
assert(c == 0);
--c; // OK! Wrapping around
assert(c == std::numeric_limits<unsigned int>::max());
46. 45
COREHARD // УЯЗВИМОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
CWE/SANS TOP 25 MOST DANGEROUS SOFTWARE ERRORS
Rank Name
[3] Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')
[18] Use of Potentially Dangerous Function
[20] Incorrect Calculation of Buffer Size
[23] Uncontrolled Format String
[24] Integer Overflow or Wraparound
Top 25 Most Dangerous Software Errors – результат работы экспертов в
области безопасности ПО из SANS Institute и MITRE.
47. 46
COREHARD // ИНФОРМАЦИЯ ДЛЯ ИЗУЧЕНИЯ
ЛАПИЦКИЙ АРТЁМ // COREHARD // 18.06.2016
ЧТО ПОЧИТАТЬ?
С++ Core Guidelines
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
SEI CERT C++ Coding Standard
https://www.securecoding.cert.org/
OWASP C/C++ Technology Initiative
https://www.owasp.org/index.php/C%2B%2B
Common Weakness Enumeration by MITRE Corporation
http://cwe.mitre.org/