SlideShare a Scribd company logo
1 of 37
Эффективный C++
Андрей Карпов
CTO, Microsoft MVP, к.ф.-м.н.,
karpov@viva64.com
•IBM RPG - язык
программирования, синтаксис
которого был изначально сходен
с командным языком
механических табуляторов
компании IBM
•Широко использовался в 1960-х
и 1970-х годах
IBM 1401
Жив ли С и C++? Да что там, жив IBM RPG!
break в switch: проблема
....
case ADDRESS_HOME_LINE3:
group = GROUP_ADDRESS_LINE_3;
break;
case ADDRESS_HOME_STREET_ADDRESS:
group = GROUP_STREET_ADDRESS;
case ADDRESS_HOME_CITY:
group = GROUP_ADDRESS_CITY;
break;
case ADDRESS_HOME_STATE:
group = GROUP_ADDRESS_STATE;
break;
....
Chromium
break в switch: большая проблема
• Qt
• GDB
• Redis
• EA WebKit
• Unreal Engine 4
• Chromium
• ....
break в switch: промежуточные решения
• MISRA С: непустой case надо всегда завершать
оператором break
• [[gnu::fallthrough]]
• [[clang::fallthrough]]
• __attribute__((fallthrough))
• BOOST_FALLTHROUGH
break в switch: [[fallthrough]]
switch (i)
{
case 10:
f1();
break;
case 20:
f2();
break;
case 30:
f3();
[[fallthrough]]; // Предупреждение будет подавлено
case 40:
f4();
break;
Clang, GCC: -Wimplicit-fallthrough
С++17: удаленные возможности
• Удалены триграфы
• Ключевое слово register больше нельзя
использовать как спецификатор переменной
• Удалены префиксный и постфиксный инкременты
для типа bool
• Диагностика V552 в анализаторе PVS-Studio станет неактуальной
• Удален std::auto_ptr, вместо него стоит
использовать std::unique_ptr
??= #
??/ 
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~
Неконстантный string::data
• В C++17 у std::string появился метод data(),
возвращающий неконстантный указатель на внутренние
данные строки.
• Теперь я верю, что о нас заботятся по настоящему.
Решена ПРАКТИЧЕСКАЯ задача.
Писать &str.front() and &str[0] было некрасиво.
std::string str = "hello";
char *p = str.data();
p[0] = 'H';
std::cout << str << 'n'; // Hello
Новый атрибут [[nodiscard]]
[[nodiscard]] int Sum(int a, int b)
{
return a + b;
}
int main()
{
Sum(5, 6); // Будет выдано предупреждение
// компилятора/анализатора
return 0;
}
Свой класс строки - это норма
• Рано или поздно, в любом
состоявшемся проекте появляется свой
класс строки.
• Я ждал, появится ли он в PVS-Studio.
• Он появился, и это было обосновано.
• Это нормально. Не стесняйтесь это
делать.
Из моего доклада на C++ Russia 2016
std::string
• C++ Russia 2017: Антон Полухин, Как делать не надо: C++
велосипедостроение для профессионалов
https://youtu.be/rJWSSWYL83U
• vstring
• std::string
Constexpr if
template <typename T>
auto GetValue(T t)
{
if constexpr (std::is_pointer<T>::value)
{
return *t;
}
else
{
return t;
}
}
void foo()
{
int v = 10;
std::cout << GetValue(v) << 'n'; // 10
std::cout << GetValue(&v) << 'n'; // 10
}
Инициализатор в if и switch
if ((len=input.find("length=",start)!=std::string::npos))
length=atoi(&(input.c_str()[len+strlen("length=")]));
SETI@home
Инициализатор в if и switch
if (auto it = m.find(key); it != m.end())
{
....
}
__has_include
#if __has_include(<optional>)
#include <optional>
#define have_optional 1
#elif __has_include(<experimental/optional>)
#include <experimental/optional>
#define have_optional 1
#define experimental_optional 1
#else
#define have_optional 0
#endif
С++17: и так далее
• Рекомендую статью моего коллеги Егора Бредихина
"C++17"
https://www.viva64.com/ru/b/0533/
Зрелость инструментария
• Компиляторы
• Среды для разработки
• Динамические анализаторы
• Статические анализаторы
Динамические анализаторы
• Классика:
• Valgrind
• BoundsChecker
• Intel Parallel Inspector
• Новинки от Google:
• AddressSanitizer
• ThreadSanitizer
• MemorySanitizer
Статические анализаторы кода
• Coverity
• Klocwork
• Parasoft
• PVS-Studio
• SonarQube
• "Имя им легион": List of tools for static code analysis
https://en.wikipedia.org/wiki/List_of_tools_for_static_code_
analysis
Современный C++ не избавляет от
необходимости статического анализа
TDLib (C++)void FileGcWorker::run_gc(....,
std::vector<FullFileInfo> files, ....)
{
....
std::sort(files.begin(), files.end(),
[](const auto &a, const auto &b)
{
return a.atime_nsec < a.atime_nsec;
});
....
}
Статический анализ, это не заплатка для C
и C++
static bool AreEqual(VisualStyleElement value1,
VisualStyleElement value2)
{
return
value1.ClassName == value1.ClassName &&
value1.Part == value2.Part &&
value1.State == value2.State;
}
Mono (C#)
PVS-Studio
• Хочу пригласить Михаила Матросова
• Технический менеджер в московском R&D офисе компании Align
Technology
Общая информация
• Align Technology R&D
• 1.5M LOC C++
• Включая очень пыльный легаси :)
• 150 коммитов в день
• 5 разработчиков в месяц :)
Автоматизация
• CI сервер (Bamboo)
• Дневной билд на инкрементальный анализ (около 15 минут)
• Ночной билд на полный анализ (около 6 часов)
• L3 не проверяются
Процесс с точки зрения разработчика
• Заливаю изменения в транк
• На CI сервере автоматически запускается билд с
инкрементальным анализом
• Если анализ выявит нарушения PVS-Studio, я получаю
уведомление
• Исправляю нарушения. Могу проверить локально. Заливаю.
Процесс с точки зрения внедряльщика
• Каждое утро проверяю результаты полного анализа
• Если есть нарушения, значит либо
• кто-то из разработчиков пропустил уведомление, в этом случае пишу ему
письмо с напоминанием
• что-то пошло не так в процессе анализа, либо уведомление не было
послано, в этом случае разбираюсь
• Если какой-то разработчик часто пропускает уведомления,
провожу воспитательно-просветительскую беседу
Внедрение
• Полный анализ исходников
• Анализ каждого правила – насколько оно применимо на нашей
кодобазе
• Если правило даёт слишком много ложноположительных срабатываний,
оно убирается из анализа с помощью .pvsconfig файла
• Небольшое количество самых страшных нарушений исправить
сразу
• Все остальные нарушения подавить
Общее впечатление
• Инструмент достаточно прост во внедрении и конфигурации.
• Помог найти множество реальных проблем. Процесс налажен и
работает достаточно хорошо.
• Авторы быстро отвечают, оперативно фиксят проблемы. Могут
реализовать фичу по запросу.
• Анализатор частенько ошибается на сложном С++ коде.
Сказывается отсутствие проверенного парсера (clang). Нет
ощущения, что в дальнейшем это будет улучшаться. Сейчас
кажется, что подкладываются костыли по мере необходимости.
Ускорение сборки: распределённая
компиляция
• IncrediBuild - https://www.incredibuild.com/
• distcc - https://github.com/distcc/distcc
• Icecream - https://github.com/icecc/icecream
Ускорение сборки: кэш компилятора
• При компиляции препроцессированного файла на основе
его содержимого, флагов компиляции, вывода
компилятора, вычисляется хэш-значение
• При повторной компиляции с теми же флагами
неизмененного файла, из кэша будет взят уже готовый
объектный файл и подан на вход компоновщика
Ускорение сборки: кэш компилятора
Ускорение сборки: кэш компилятора
•Для Unix-подобных систем:
• ccache (GCC, Clang) - https://ccache.samba.org/
• cachecc1 (GCC) - http://cachecc1.sourceforge.net/
•Для Windows:
• clcache (MSVC) - https://github.com/frerich/clcache
• cclash (MSVC) - https://github.com/inorton/cclash
Ускорение сборки: замена
компонентов трансляции
• Многократное ускорение перекомпиляции проектов
• Zapcc vs Clang
Ускорение сборки: модули
• Ждём C++20
Инструменты профайлинга С++ кода
• Как говорится «передам по ссылке» ваше внимание вот этому
докладу
• Александр Зайцев. Инструменты профайлинга С++ кода.
Минск, конференция C++ CoreHard Spring 2018
• Видео станет доступно на YouTube через 3 месяца
И так далее
• C++ Core Guidelines
• Комьюнити, конференции
• Рынок труда
Ответы на вопросы
Андрей Карпов karpov@viva64.com
Сайт PVS-Studio https://www.viva64.com
Twitter @Code_Analysis

More Related Content

What's hot

Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
Нескучное тестирование с pytest
Нескучное тестирование с pytestНескучное тестирование с pytest
Нескучное тестирование с pytestRoman Imankulov
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокAndrey Karpov
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаAndrey Karpov
 
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Иван Стеценко: ЯП Zephir. Панацея или лечение?Иван Стеценко: ЯП Zephir. Панацея или лечение?
Иван Стеценко: ЯП Zephir. Панацея или лечение?Oleg Poludnenko
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxPlatonov Sergey
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийOOO "Program Verification Systems"
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestRina Uzhevko
 
Top10 доводов против языка Ruby
Top10 доводов против языка RubyTop10 доводов против языка Ruby
Top10 доводов против языка Rubyguest5f907e
 
Sampling profiling
Sampling profilingSampling profiling
Sampling profilingSlach
 

What's hot (19)

Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
Нескучное тестирование с pytest
Нескучное тестирование с pytestНескучное тестирование с pytest
Нескучное тестирование с pytest
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
Статический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибокСтатический анализ кода: борьба с удорожанием ошибок
Статический анализ кода: борьба с удорожанием ошибок
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
 
Иван Стеценко: ЯП Zephir. Панацея или лечение?
Иван Стеценко: ЯП Zephir. Панацея или лечение?Иван Стеценко: ЯП Zephir. Панацея или лечение?
Иван Стеценко: ЯП Zephir. Панацея или лечение?
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Worried code
Worried codeWorried code
Worried code
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Component Inspector
Component InspectorComponent Inspector
Component Inspector
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTest
 
Top10 доводов против языка Ruby
Top10 доводов против языка RubyTop10 доводов против языка Ruby
Top10 доводов против языка Ruby
 
Sampling profiling
Sampling profilingSampling profiling
Sampling profiling
 

Similar to Эффективный C++

Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20DefconRussia
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioAndrey Karpov
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)Alexander Gornik
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterAleksandr Tarasov
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Tatyanazaxarova
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#Andrey Karpov
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rusGarrikus
 

Similar to Эффективный C++ (20)

Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 
static - defcon russia 20
static  - defcon russia 20static  - defcon russia 20
static - defcon russia 20
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
About Python
About PythonAbout Python
About Python
 
разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
Jbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot StarterJbreak 2016: Твой личный Spring Boot Starter
Jbreak 2016: Твой личный Spring Boot Starter
 
Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська Статический анализ: ошибки в медиаплеере и безглючная аська
Статический анализ: ошибки в медиаплеере и безглючная аська
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
Python и Cython
Python и CythonPython и Cython
Python и Cython
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
Deep c slides_oct2011_rus
Deep c slides_oct2011_rusDeep c slides_oct2011_rus
Deep c slides_oct2011_rus
 

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++

  • 1. Эффективный C++ Андрей Карпов CTO, Microsoft MVP, к.ф.-м.н., karpov@viva64.com
  • 2. •IBM RPG - язык программирования, синтаксис которого был изначально сходен с командным языком механических табуляторов компании IBM •Широко использовался в 1960-х и 1970-х годах IBM 1401 Жив ли С и C++? Да что там, жив IBM RPG!
  • 3. break в switch: проблема .... case ADDRESS_HOME_LINE3: group = GROUP_ADDRESS_LINE_3; break; case ADDRESS_HOME_STREET_ADDRESS: group = GROUP_STREET_ADDRESS; case ADDRESS_HOME_CITY: group = GROUP_ADDRESS_CITY; break; case ADDRESS_HOME_STATE: group = GROUP_ADDRESS_STATE; break; .... Chromium
  • 4. break в switch: большая проблема • Qt • GDB • Redis • EA WebKit • Unreal Engine 4 • Chromium • ....
  • 5. break в switch: промежуточные решения • MISRA С: непустой case надо всегда завершать оператором break • [[gnu::fallthrough]] • [[clang::fallthrough]] • __attribute__((fallthrough)) • BOOST_FALLTHROUGH
  • 6. break в switch: [[fallthrough]] switch (i) { case 10: f1(); break; case 20: f2(); break; case 30: f3(); [[fallthrough]]; // Предупреждение будет подавлено case 40: f4(); break; Clang, GCC: -Wimplicit-fallthrough
  • 7. С++17: удаленные возможности • Удалены триграфы • Ключевое слово register больше нельзя использовать как спецификатор переменной • Удалены префиксный и постфиксный инкременты для типа bool • Диагностика V552 в анализаторе PVS-Studio станет неактуальной • Удален std::auto_ptr, вместо него стоит использовать std::unique_ptr ??= # ??/ ??' ^ ??( [ ??) ] ??! | ??< { ??> } ??- ~
  • 8. Неконстантный string::data • В C++17 у std::string появился метод data(), возвращающий неконстантный указатель на внутренние данные строки. • Теперь я верю, что о нас заботятся по настоящему. Решена ПРАКТИЧЕСКАЯ задача. Писать &str.front() and &str[0] было некрасиво. std::string str = "hello"; char *p = str.data(); p[0] = 'H'; std::cout << str << 'n'; // Hello
  • 9. Новый атрибут [[nodiscard]] [[nodiscard]] int Sum(int a, int b) { return a + b; } int main() { Sum(5, 6); // Будет выдано предупреждение // компилятора/анализатора return 0; }
  • 10. Свой класс строки - это норма • Рано или поздно, в любом состоявшемся проекте появляется свой класс строки. • Я ждал, появится ли он в PVS-Studio. • Он появился, и это было обосновано. • Это нормально. Не стесняйтесь это делать. Из моего доклада на C++ Russia 2016
  • 11. std::string • C++ Russia 2017: Антон Полухин, Как делать не надо: C++ велосипедостроение для профессионалов https://youtu.be/rJWSSWYL83U • vstring • std::string
  • 12. Constexpr if template <typename T> auto GetValue(T t) { if constexpr (std::is_pointer<T>::value) { return *t; } else { return t; } } void foo() { int v = 10; std::cout << GetValue(v) << 'n'; // 10 std::cout << GetValue(&v) << 'n'; // 10 }
  • 13. Инициализатор в if и switch if ((len=input.find("length=",start)!=std::string::npos)) length=atoi(&(input.c_str()[len+strlen("length=")])); SETI@home
  • 14. Инициализатор в if и switch if (auto it = m.find(key); it != m.end()) { .... }
  • 15. __has_include #if __has_include(<optional>) #include <optional> #define have_optional 1 #elif __has_include(<experimental/optional>) #include <experimental/optional> #define have_optional 1 #define experimental_optional 1 #else #define have_optional 0 #endif
  • 16. С++17: и так далее • Рекомендую статью моего коллеги Егора Бредихина "C++17" https://www.viva64.com/ru/b/0533/
  • 17. Зрелость инструментария • Компиляторы • Среды для разработки • Динамические анализаторы • Статические анализаторы
  • 18. Динамические анализаторы • Классика: • Valgrind • BoundsChecker • Intel Parallel Inspector • Новинки от Google: • AddressSanitizer • ThreadSanitizer • MemorySanitizer
  • 19. Статические анализаторы кода • Coverity • Klocwork • Parasoft • PVS-Studio • SonarQube • "Имя им легион": List of tools for static code analysis https://en.wikipedia.org/wiki/List_of_tools_for_static_code_ analysis
  • 20. Современный C++ не избавляет от необходимости статического анализа TDLib (C++)void FileGcWorker::run_gc(...., std::vector<FullFileInfo> files, ....) { .... std::sort(files.begin(), files.end(), [](const auto &a, const auto &b) { return a.atime_nsec < a.atime_nsec; }); .... }
  • 21. Статический анализ, это не заплатка для C и C++ static bool AreEqual(VisualStyleElement value1, VisualStyleElement value2) { return value1.ClassName == value1.ClassName && value1.Part == value2.Part && value1.State == value2.State; } Mono (C#)
  • 22. PVS-Studio • Хочу пригласить Михаила Матросова • Технический менеджер в московском R&D офисе компании Align Technology
  • 23. Общая информация • Align Technology R&D • 1.5M LOC C++ • Включая очень пыльный легаси :) • 150 коммитов в день • 5 разработчиков в месяц :)
  • 24. Автоматизация • CI сервер (Bamboo) • Дневной билд на инкрементальный анализ (около 15 минут) • Ночной билд на полный анализ (около 6 часов) • L3 не проверяются
  • 25. Процесс с точки зрения разработчика • Заливаю изменения в транк • На CI сервере автоматически запускается билд с инкрементальным анализом • Если анализ выявит нарушения PVS-Studio, я получаю уведомление • Исправляю нарушения. Могу проверить локально. Заливаю.
  • 26. Процесс с точки зрения внедряльщика • Каждое утро проверяю результаты полного анализа • Если есть нарушения, значит либо • кто-то из разработчиков пропустил уведомление, в этом случае пишу ему письмо с напоминанием • что-то пошло не так в процессе анализа, либо уведомление не было послано, в этом случае разбираюсь • Если какой-то разработчик часто пропускает уведомления, провожу воспитательно-просветительскую беседу
  • 27. Внедрение • Полный анализ исходников • Анализ каждого правила – насколько оно применимо на нашей кодобазе • Если правило даёт слишком много ложноположительных срабатываний, оно убирается из анализа с помощью .pvsconfig файла • Небольшое количество самых страшных нарушений исправить сразу • Все остальные нарушения подавить
  • 28. Общее впечатление • Инструмент достаточно прост во внедрении и конфигурации. • Помог найти множество реальных проблем. Процесс налажен и работает достаточно хорошо. • Авторы быстро отвечают, оперативно фиксят проблемы. Могут реализовать фичу по запросу. • Анализатор частенько ошибается на сложном С++ коде. Сказывается отсутствие проверенного парсера (clang). Нет ощущения, что в дальнейшем это будет улучшаться. Сейчас кажется, что подкладываются костыли по мере необходимости.
  • 29. Ускорение сборки: распределённая компиляция • IncrediBuild - https://www.incredibuild.com/ • distcc - https://github.com/distcc/distcc • Icecream - https://github.com/icecc/icecream
  • 30. Ускорение сборки: кэш компилятора • При компиляции препроцессированного файла на основе его содержимого, флагов компиляции, вывода компилятора, вычисляется хэш-значение • При повторной компиляции с теми же флагами неизмененного файла, из кэша будет взят уже готовый объектный файл и подан на вход компоновщика
  • 31. Ускорение сборки: кэш компилятора
  • 32. Ускорение сборки: кэш компилятора •Для Unix-подобных систем: • ccache (GCC, Clang) - https://ccache.samba.org/ • cachecc1 (GCC) - http://cachecc1.sourceforge.net/ •Для Windows: • clcache (MSVC) - https://github.com/frerich/clcache • cclash (MSVC) - https://github.com/inorton/cclash
  • 33. Ускорение сборки: замена компонентов трансляции • Многократное ускорение перекомпиляции проектов • Zapcc vs Clang
  • 35. Инструменты профайлинга С++ кода • Как говорится «передам по ссылке» ваше внимание вот этому докладу • Александр Зайцев. Инструменты профайлинга С++ кода. Минск, конференция C++ CoreHard Spring 2018 • Видео станет доступно на YouTube через 3 месяца
  • 36. И так далее • C++ Core Guidelines • Комьюнити, конференции • Рынок труда
  • 37. Ответы на вопросы Андрей Карпов karpov@viva64.com Сайт PVS-Studio https://www.viva64.com Twitter @Code_Analysis