Pull to refresh

Comments 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» м.б. была бы в тему (всего лишь мнение. Может и не прав).
Sign up to leave a comment.