Открыть список
Как стать автором
Обновить
36
Карма
0
Рейтинг
Георгий Грибков @GGribkov

C++ Developer

Как статический анализ кода помогает в сфере GameDev

Всё, что можно автоматически узнать о функциях, имея их объявления/определения, анализатор узнаёт автоматически. По возможности и необходимости, конечно.


Аннотации же нужны для предоставления эвристической информации, которую обычно нельзя "вытянуть" программно. Аннотации призваны отвечать на вопросы вроде:


  • Является ли функция assert'ом?
  • Создана ли она только для ввода/вывода в файл?
  • Меняет ли она состояние памяти?
  • Является ли она аналогом memcpy?
  • Может ли она считать небезопасные данные?
  • … и тому подобное.

Поэтому такие вещи мы делаем руками. Это позволяет не только улучшить работу анализатора с популярными функциями, но и расширить его кругозор со стандартных функций до их аналогов (например, провести ему аналогию между malloc и calloc, realloc, _aligned_malloc, _recalloc, strdup и т.д). И еще много плюшек даёт.


Надеюсь, я правильно понял ваш вопрос :)

Анализ кода проекта DeepSpeech или почему не стоит писать в namespace std

А можно это утверждение как-то аргументировать более развернуто?

Конечно, можно. Для начала рассмотрим цитату из стандарта C++17, п 20.5.4.2.1:


The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.

То есть, можно добавлять специализацию для любого шаблона из стандартной библиотеки, если специализация добавляется для кастомного типа (и удовлетворяет остальным ограничениям стандарта).


Теперь рассмотрим аналогичную выдержку из драфта стандарта C++20, п 16.5.4.2.1:


Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.

То есть, раньше была формулировка "специализация любого шаблона из стандартной библиотеки", а теперь — "специализация любого шаблона класса из стандартной библиотеки". Следовательно, специализации шаблонов функций исключили из списка того, что можно добавить в namespace std.

Поиск багов как образ жизни: обзор №2

А что можно увидеть, если сделать всё по вашему плану?

Что такое MISRA и как её готовить

Наверное, никак. Вряд ли можно доверять таблицам, не имея доступу к исходному коду.

VVVVVV??? VVVVVV!!! :)

Аххахахах, вот это действительно сильно написано :D

Публикация кода VVVVVV показала, насколько грубо устроены игры внутри

PVS-Studio на них есть :) Мимо такой игры мы пройти не смогли.
Если вам интересно посмотреть, какие ошибки мы там нашли, предлагаю почитать статью:
VVVVVV??? VVVVVV!!!

По заказам Embedded-разработчиков: ищем ошибки в Amazon FreeRTOS

Тут пропал пробел перед этой частицей. Спасибо за внимательность!

Бесплатный PVS-Studio для тех, кто развивает открытые проекты

Еще как можно)
Вот руководство по запуску анализа на Travis CI:
habr.com/ru/company/pvs-studio/blog/458072
А вот пример:
habr.com/ru/company/pvs-studio/blog/464645

PVS-Studio — двигатель прогресса

Если не секрет — с чем связана ваша заинтересованность в старых изданиях MISRA C? Ведь более современные версии стандарта содержат как новые правила, так и переосмысленные и доработанные старые. Ситуация здесь примерно такая же, как у разных изданий технической литературы — читать стоит самое последнее, ведь так?

P. S. Мы сейчас усиленно занимаемся поддержкой MISRA C:2012 и MISRA C++:2008.
На момент написания комментария в PVS-Studio есть 50 готовых MISRA-диагностик и еще около 20 на подходе (одна диагностика анализатора — это обычно несколько правил MISRA). И хотя наш анализатор уже можно использовать для проверки соответствия стандарту MISRA, мы продолжаем стремиться к полному покрытию всех правил. Поэтому ваше ожидание не проходит зря :)

Топ 10 ошибок в C++ проектах за 2018 год

PVS-Studio умеет встраиваться в различные IDE. Например, в виде плагина для Visual Studio или IntelliJ IDEA. Поэтому искать ошибки и просматривать отчет можно не выходя из IDE. Поэтому перейти к определению символа можно без всяких проблем.

Топ 10 ошибок в C++ проектах за 2018 год

Файл вполне может содержать терминальные нули. Например, это может использоваться, чтобы удобно разбить содержимое буфера на строки.
Да, содержимое файла может быть длиннее буфера. Именно поэтому вторым параметром функция fgets принимает число, ограничивающее количество считываемых символов.

Топ 10 ошибок в C++ проектах за 2018 год

Если ты ничего не введешь и нажмешь Enter, то fgets считает символ переноса строки и вернет указатель на "\n\0".
Но в примере, который демонстрируется на видео, вводится не пустая строка, а строка, которая начинается с символа '\0'. Можно подробнее почитать об этом по ссылке на оригинальную статью.

Какие ошибки прячутся в коде Infer.NET?

Я заметил, что ошибки, связанные с именами вида 'var1', 'var2', встречаются практически в каждом проверенном проекте. Создается впечатление: «Назвал переменные очень похоже — жди беды». Неужели ошибки такого рода превратились в пандемию? Самое обидное, что их и правда бывает сложно обнаружить с помощью Code Review. Конечно, их можно избежать, просто давая сущностям более различимые имена, но соблазн бывает велик)

Информация

В рейтинге
4,733-й
Откуда
Тула, Тульская обл., Россия
Зарегистрирован
Активность