Комментарии 33
Об этом и говорит раздел «Ошибки, найденные до нас». Одна из приведенных ошибок приводила к неверному применению физических сил к объекту. А предупреждение, казалось бы, не сильно страшнее прочих выглядит.
Редко бывает, что реальный баг отлавливается. Как-то так.
Например, как изменился бы ландшафт или инвентарь после исправления числа pi. Или положение камеры там.
Понятно, что большинство таких крупных косяков до выхода игры обнаруживаются и исправляются, но тем не менее, даже на небольшие изменения было бы здорово посмотреть.
Ребята из PVS, может появится такая возможность и подходящий проект? Думаю многим было бы интересно взглянуть на такое.
А так, это либо неиспользуемый/deprecated код. Либо сложно повторяемые ошибки.
Соответственно если их не удается повторить, то как заснять эффект до и после?
Ничего интересного. Для жены писал программу, на которой она считала кандидатскую — в этой программе был расчёт достаточно хитрой разностной схемы с кучей переменных: диффуры в частных производных, а именно Навье-Стокс и проч. Так вот ошибки проявлялись либо на разных границах-переходах, либо начинали массово заражать модель NaNами, потому что x+NaN = NaN
, а NaN чаще всего получается из +-Inf. Стоит отметить, что там бы я от такой ошибки огрёб именно полную сетку NaN.
Применительно к графике и физике игр — это будут примерно такие варианты:
- Ничего заметного (потому что не успело накопиться)
- Тупо вылет если ошибка повлияла на логику, а не вычисления.
- Странные артефакты на граничных случаях
- Блинки кадрами с мусором (если проблема только в расчёте изображения)
- Вылет из-за арифметики, если пошло заражаться NaN или подобный эффект
Какой-то видимый, но не фатальный эффект в подобных расчётах возникает очень редко.
(PS: кандидатская была сделана честно, я только облегчал рутину вычислений и визуализаций)
Убедиться, что GetActiveCamera() без побочных эффектов…
Вот, кстати, нифига не "микро". Там код m_app->m_renderer->getActiveCamera()
— то есть кроме переходов по указателям еще и вызов функции. Оно, конечно, теоретически может эта функция недетерминированная и выдаёт каждый раз разный результат, но тогда мне страшно за мозг программиста, которому с этим жить. А если нет, то это может стоить очень дорого.
Я в своё время (лет 10-12 назад) работу с выборками ADO через COM нехитрыми приёмами выноса подобных выражений ускорял в несколько раз.
А недетерминированные выражения в T-SQL выносил из запросов наружу менее года назад — фильтр по недетерминированному выражению (например, несколько сравнений с getdate()
в запросе) может генерировать очень плохие планы запросов.
Небольшая опечатка в числе ПиПожалуй самое впечатляющее в PVS. Правила на разыменование указателей, UB, идентичные ветви then/else — это всё понятно. Но вот научить понимать, что вот эта опечатка — вероятно pi… o_O
Какие ещё константы знаем? e? Постоянная планка? Число Авогадро? Заряд электрона? ;-)
Повторение M_PI_4, M_PI_4, M_1_PI, M_1_PI – это опечатка или пасхалка?)
Для числа Пи есть константа M_PI из заголовка math.h.M_PI содержит 20 символов после запятой. В цитате кода 9 символов (пусть и с неточностью). Интересно, такая разница дает различие в производительности? Ведь этот участок кода может вызываться огромное количество раз.
Давно читаю ваши публикации. Давно мечтаю о PVS-Studio для PHP. Эх… Нет, я слышал о статических анализаторах кода для PHP. Но их авторы таких красивых и мотивирующих постов не пишут.
M_PI содержит 20 символов после запятой. В цитате кода 9 символов (пусть и с неточностью). Интересно, такая разница дает различие в производительности? Ведь этот участок кода может вызываться огромное количество раз.
Разве 9 и 20 символов не будут скомпилированы в один тип данных и соответственно в инструкцию/данные одного размера?
Или Вы задумываетесь о скорости обработки чисел разной длины (но одного типа) на FPU?
В любом случае, у меня есть ответы на оба вопроса. :)
Сам движок проверяли, более того — работали над исправлением ошибок в нём.
Соответствующие статьи:
- Долгожданная проверка Unreal Engine 4
- Как команда PVS-Studio улучшила код Unreal Engine
- Статический анализ как часть процесса разработки Unreal Engine
Если говорить про проверку проектов, использующих UE4 — такая возможность тоже есть, люди пользуются. Подробнее про способ проверки можно в документации прочитать или спросить, если вопросы останутся.
Надеюсь, что какая-нибудь из этих ошибок поможет исправить "завязание в текстурах", когда едешь на телеге и врезаешься в гору (нет, как мне кажется).
Небольшая опечатка в числе Пи (3,141592653...)
Занудство, конечно, но в этой фразе тоже есть неточность или неоднозначность трактовки многоточия. Обычно принято последнюю написанную цифру округлять с учетом последующей, а дальше идут ...5359879..., т.е. последнюю цифру точнее было бы написать, как "4". Но если многоточие трактовать именно как сокращение строки цифр, то всё нормально :)
examples/ThirdPartyLibs/
Я так понял, эта библиотека используется только для примеров.
Собственно, вопрос к авторам статьи — вы как-то фильтруете подобные случаи?
Формально это все относится к коду движка, я не спорю! Но вот крошечная сноска, мол «а вот эта замечательная ошибка из каталога Thirdparty» м.б. была бы в тему (всего лишь мнение. Может и не прав).
PVS-Studio заглянул в движок Red Dead Redemption — Bullet