Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

Вебинар: C++ и неопределённое поведение - 27.02

>
>
>
V3216. Unity Engine. Checking a field w…
menu mobile close menu
Проверка проектов
Интеграция результатов анализа PVS-Studio в инструменты контроля качества кода (веб дашборд)
Сообщения PVS-Studio
Диагностики общего назначения (General Analysis, C++)
Диагностики общего назначения (General Analysis, C#)
Диагностики общего назначения (General Analysis, Java)
Микрооптимизации (C++)
Диагностика 64-битных ошибок (Viva64, C++)
Реализовано по запросам пользователей (C++)
Cтандарт MISRA
Стандарт AUTOSAR
Стандарт OWASP (C++)
Стандарт OWASP (C#)
Стандарт OWASP (Java)
Проблемы при работе анализатора кода
Дополнительная информация
toggle menu Оглавление

V3216. Unity Engine. Checking a field with a specific Unity Engine type for null may not work correctly due to implicit field initialization by the engine.

05 Фев 2025

Анализатор обнаружил ненадежную проверку на null поля, которое может быть инициализировано в инспекторе Unity. Ненадежной она является, потому что выполняется с помощью оператора, не имеющего перегрузку для учета специфики кода Unity-скриптов. В частности, Unity неявно инициализирует отображаемые в инспекторе поля базовым значением если их тип — UnityEngine.Object или производный от него (исключение – MonoBehaviour и ScriptableObject классы). Этот объект является эквивалентом null, однако операторы ?., ??, ??= и is не знают об этом и воспринимают его как обычное значение.

Рассмотрим пример:

public class ActivateTrigger: MonoBehaviour
{
  [SerializeField]
  GameObject _target;

  private void DoActivateTrigger()
  {
     var target = _target ?? gameObject;
    ....
  }
}

В данном случае, если значение _target еще не менялось в процессе выполнения, проверка ?? будет считать _target не равным null, независимо от того, было назначено значение поля в инспекторе Unity или нет.

Решением проблемы является использование ==, != или сокращенных проверок (field, !field) для проверки на равенство/неравенство с null, которые учитывают специфичные для Unity-скриптов моменты.

Так, в данном случае исправленный код может выглядеть следующим образом:

public class ActivateTrigger: MonoBehaviour
{
  [SerializeField]
  GameObject _target;

  private void DoActivateTrigger()
  {
    var target = _target;

    if (target == null)
      target = gameObject;
    ....
  }
}

Теперь вместо ?? используется проверка target на равенство null с помощью оператора ==. Данная операция имеет переопределение, учитывающее нюанс описанный в начале документации (так же как target != null), а потому проверка будет работать правильно в любом случае.

Данная диагностика классифицируется как:

close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам