Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 33

Интересно, улучшается ли работа проектов после исправления таких замечаний? Со стороны кажется, будто эти предупреждения никак не мешают работе проекта

Об этом и говорит раздел «Ошибки, найденные до нас». Одна из приведенных ошибок приводила к неверному применению физических сил к объекту. А предупреждение, казалось бы, не сильно страшнее прочих выглядит.

Конечно улучшается. На качество проекта нужно смотреть не только со стороны конечного пользователя. Внутри команды разработки происходит много других процессов. И хорошо, если ошибки выявляются автоматически на раннем этапе. Тогда разработчики могут делать новые фичи, а не патчить старый код.
Читая ваши статьи у меня волосы перестают быть мягкими. я не понимаю как такие ошибки не были выявлены?
исходя из собственного опыта использования PVS-Studio — значимые ошибки правятся и так — у них видимый эффект. Анализатор находит скрытые ошибки — либо в коде который (почти) не используется, либо эффект практически не виден (как с Пи выше).
Редко бывает, что реальный баг отлавливается. Как-то так.
Просто примечание. Многие уязвимости, не что иное как ошибки в коде, эффект от существования которых (в стандартном режиме использования) практически не виден. :)
Было бы интересно не только посмотреть на ошибки, найденные анализатором, но и на изменения в игре после их исправления.

Например, как изменился бы ландшафт или инвентарь после исправления числа pi. Или положение камеры там.
Понятно, что большинство таких крупных косяков до выхода игры обнаруживаются и исправляются, но тем не менее, даже на небольшие изменения было бы здорово посмотреть.

Ребята из PVS, может появится такая возможность и подходящий проект? Думаю многим было бы интересно взглянуть на такое.
Если бы это были такие очевидные ошибки их бы исправили и без анализатора.
А так, это либо неиспользуемый/deprecated код. Либо сложно повторяемые ошибки.
Соответственно если их не удается повторить, то как заснять эффект до и после?
Боюсь, что исправление ошибки в 7-м знаке пи вообще не приведет к видимым изменениям. Я сначала даже подумал, что такое значение могло быть выбрано специально — тонкости оптимизации какой-нибудь, проблемы округления — мало ли. Но масса примеров с вычислением одного и того же быстро вернули меня на землю :)

Ничего интересного. Для жены писал программу, на которой она считала кандидатскую — в этой программе был расчёт достаточно хитрой разностной схемы с кучей переменных: диффуры в частных производных, а именно Навье-Стокс и проч. Так вот ошибки проявлялись либо на разных границах-переходах, либо начинали массово заражать модель NaNами, потому что x+NaN = NaN, а NaN чаще всего получается из +-Inf. Стоит отметить, что там бы я от такой ошибки огрёб именно полную сетку NaN.
Применительно к графике и физике игр — это будут примерно такие варианты:


  1. Ничего заметного (потому что не успело накопиться)
  2. Тупо вылет если ошибка повлияла на логику, а не вычисления.
  3. Странные артефакты на граничных случаях
  4. Блинки кадрами с мусором (если проблема только в расчёте изображения)
  5. Вылет из-за арифметики, если пошло заражаться NaN или подобный эффект

Какой-то видимый, но не фатальный эффект в подобных расчётах возникает очень редко.


(PS: кандидатская была сделана честно, я только облегчал рутину вычислений и визуализаций)

а примеры 8 и 9 — компилятор соптимизировать не может?
Убедиться, что GetActiveCamera() без побочных эффектов…
Возможно и сможет. Но в любом случае, зачем писать такую простыню кода?
ну на самом деле, если руками проводить микрооптимизации — код становится «грязнее». вынесение общих подвыражний, переиспользование повторно вычисляемых переменных — можно делать руками, но обычно компилятор достаточно умный, что бы сделать это самому. поэтому V807 одна из наименее мною используемых подсказок. в 99% случаев она не помогает.

Вот, кстати, нифига не "микро". Там код m_app->m_renderer->getActiveCamera() — то есть кроме переходов по указателям еще и вызов функции. Оно, конечно, теоретически может эта функция недетерминированная и выдаёт каждый раз разный результат, но тогда мне страшно за мозг программиста, которому с этим жить. А если нет, то это может стоить очень дорого.
Я в своё время (лет 10-12 назад) работу с выборками ADO через COM нехитрыми приёмами выноса подобных выражений ускорял в несколько раз.
А недетерминированные выражения в T-SQL выносил из запросов наружу менее года назад — фильтр по недетерминированному выражению (например, несколько сравнений с getdate() в запросе) может генерировать очень плохие планы запросов.

Небольшая опечатка в числе Пи
Пожалуй самое впечатляющее в PVS. Правила на разыменование указателей, UB, идентичные ветви then/else — это всё понятно. Но вот научить понимать, что вот эта опечатка — вероятно pi… o_O

Какие ещё константы знаем? e? Постоянная планка? Число Авогадро? Заряд электрона? ;-)
На тему опечаток в константах будет нечто новенькое в моём следующем обзоре. Ещё не выкатили диагностику в релиз, а уже нашли ошибку в очень популярном проекте.
Сейчас анализатор знает про: M_E, M_LOG2E, M_LOG10E, M_LOG10E, M_LN2, M_LN2, M_LN10, M_PI, M_PI_2, M_PI_4, M_PI_4, M_1_PI, M_1_PI, M_2_PI, M_2_PI, M_2_SQRTPI, M_SQRT2, M_SQRT1_2, M_SQRT1_2.

Повторение M_PI_4, M_PI_4, M_1_PI, M_1_PI – это опечатка или пасхалка?)

С точки зрения статьи, это опечатка. Уже собираясь домой (время комментария 17:56) я поспешил и скопировал лишние. Но на самом деле всё хитрее. С точки зрения анализатора существует «две ипостаси» этих констант. M_PI_4 может быть записано в коде как 0.785398163397448309616, так и .785398163397448309616. И при анализе схожести констант отдельно рассматривается как вариант с 0, так и без 0.
Учтите только что всех этих констант, удивительным образом, нет ни в стандарте C, ни в стандарте C++. Так что в переносимом проекте это может быть не очень хорошая рекомендация.

Вместо этого, вот прям вот-совсем-недавно в C++20 появился заголовочный файл <math> (в девичестве — <number>)
Для числа Пи есть константа M_PI из заголовка math.h.
M_PI содержит 20 символов после запятой. В цитате кода 9 символов (пусть и с неточностью). Интересно, такая разница дает различие в производительности? Ведь этот участок кода может вызываться огромное количество раз.

Давно читаю ваши публикации. Давно мечтаю о PVS-Studio для PHP. Эх… Нет, я слышал о статических анализаторах кода для PHP. Но их авторы таких красивых и мотивирующих постов не пишут.
M_PI содержит 20 символов после запятой. В цитате кода 9 символов (пусть и с неточностью). Интересно, такая разница дает различие в производительности? Ведь этот участок кода может вызываться огромное количество раз.

Разве 9 и 20 символов не будут скомпилированы в один тип данных и соответственно в инструкцию/данные одного размера?


Или Вы задумываетесь о скорости обработки чисел разной длины (но одного типа) на FPU?

Потестил. Все верно. Спасибо за ликбез!
Хм. Ну через 5 лет можно и перепроверить)
Ну… с 14 года уже в 19 прошло как раз 5 лет, а сейчас 20 ;)
А может ли PVS скормить код из UE4 с их миллиардом зависимостей и макросов? У движка всегда были проблемы с физикой (особенно сетевая часть).
Вы имеете в виду проверку самого движка или игр, использующих его?
В любом случае, у меня есть ответы на оба вопроса. :)
Сам движок проверяли, более того — работали над исправлением ошибок в нём.

Соответствующие статьи:

Если говорить про проверку проектов, использующих UE4 — такая возможность тоже есть, люди пользуются. Подробнее про способ проверки можно в документации прочитать или спросить, если вопросы останутся.
Большое спасибо! То что нужно.

Надеюсь, что какая-нибудь из этих ошибок поможет исправить "завязание в текстурах", когда едешь на телеге и врезаешься в гору (нет, как мне кажется).

Небольшая опечатка в числе Пи (3,141592653...)

Занудство, конечно, но в этой фразе тоже есть неточность или неоднозначность трактовки многоточия. Обычно принято последнюю написанную цифру округлять с учетом последующей, а дальше идут ...5359879..., т.е. последнюю цифру точнее было бы написать, как "4". Но если многоточие трактовать именно как сокращение строки цифр, то всё нормально :)

Про ошибку в Matrix4x4 — я удивился, что стиль кода не соответствует остальной библиотеке. Так и оказалось, класс Matrix4x4 лежит в директории
examples/ThirdPartyLibs/
Я так понял, эта библиотека используется только для примеров.
Собственно, вопрос к авторам статьи — вы как-то фильтруете подобные случаи?
Формально это все относится к коду движка, я не спорю! Но вот крошечная сноска, мол «а вот эта замечательная ошибка из каталога Thirdparty» м.б. была бы в тему (всего лишь мнение. Может и не прав).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий