Поиск ошибок в проектах на основе Unreal Engine

В статическом анализаторе PVS-Studio начали появляться диагностические правила для выявления багов, специфичных для Unreal Engine проектов.

Однако без сообщества разработчиков игр здесь не обойтись.

Поиск ошибок в проектах на основе Unreal Engine

Первый пример.

Появилось диагностическое правило, анализирующее классы, не унаследованные от типа UObject. Если в таком классе есть нестатическое поле в виде указателя на тип, унаследованный от UObject, то это неправильно.

class SomeClass { .... UObject *m_ptr; .... };

Сборщик мусора Unreal Engine может уничтожить объект, адресуемый указателем m_ptr. Подробнее про это диагностическое правило: V1100.

Второй пример.

Выявляются сущности, несоответствующие соглашениям о наименованиях для проектов, основанных на Unreal Engine. Соответствие соглашениям требуется для корректной работы Unreal Header Tool:

  • Имена классов, наследуемых от UObject, следует начинать с префикса 'U';
  • Имена классов, наследуемых от AActor, следует начинать с префикса 'A';
  • Имена классов, наследуемых от SWidget, следует начинать с префикса 'S';
  • И так далее. Подробности см. в описании диагностического правила V1102 (войдёт в октябрьский релиз PVS-Studio 7.27).

Это только начало. Мы будем собирать паттерны подобных ошибок и реализовывать их выявление в анализаторе. Нюанс в том, что без помощи GameDev сообщества мы будем делать это очень медленно. Поскольку мы сами не разрабатываем игры, коллекционирование паттернов поначалу будет носить случайный характер.

Пишите в комментариях идеи по поиску багов!

99
9 комментариев

Комментарий недоступен

2
Ответить

Комментарий недоступен

Ответить

1. Анализатор не ругается если класс унаследован от FGCObject.
2. Пока анализатор никак не реагирует если в методе CollectReferencedObjects, конкретно этот UObject не перечисляется, на такой случай планируется новая диагностика.
3. Также новая диагностика будет обрабатывать случай, если объект-поле унаследованного от UObject забыли пометить как UPROPERTY.
Диагностическое правило было добавлено по просьбе клиента, который хотел находить случаи, когда в классе ненаследнике от UObject есть указатель на тип, наследуемый от UObject.

Ответить

Комментарий недоступен

1
Ответить

Комментарий недоступен

Ответить

Вы же на Хабре раньше писали

1
Ответить