Our website uses cookies to enhance your browsing experience.
Accept
to the top
close form

Fill out the form in 2 simple steps below:

Your contact information:

Step 1
Congratulations! This is your promo code!

Desired license type:

Step 2
Team license
Enterprise license
** By clicking this button you agree to our Privacy Policy statement
close form
Request our prices
New License
License Renewal
--Select currency--
USD
EUR
* By clicking this button you agree to our Privacy Policy statement

close form
Free PVS‑Studio license for Microsoft MVP specialists
* By clicking this button you agree to our Privacy Policy statement

close form
To get the licence for your open-source project, please fill out this form
* By clicking this button you agree to our Privacy Policy statement

close form
I am interested to try it on the platforms:
* By clicking this button you agree to our Privacy Policy statement

close form
check circle
Message submitted.

Your message has been sent. We will email you at


If you haven't received our response, please do the following:
check your Spam/Junk folder and click the "Not Spam" button for our message.
This way, you won't miss messages from our team in the future.

>
>
>
V3188. Unity Engine. The value of an ex…
menu mobile close menu
Analyzer diagnostics
General Analysis (C++)
General Analysis (C#)
General Analysis (Java)
Diagnosis of micro-optimizations (C++)
Diagnosis of 64-bit errors (Viva64, C++)
Customer specific requests (C++)
MISRA errors
AUTOSAR errors
OWASP errors (C#)
Problems related to code analyzer
Additional information
toggle menu Contents

V3188. Unity Engine. The value of an expression is a potentially destroyed Unity object or null. Member invocation on this value may lead to an exception.

Mar 29 2023

The analyzer detected dereference of a potentially destroyed or 'null' object. This may cause an exception to be thrown.

Look at the following example:

GameObject _obj;
bool _objDestructionCondition;

public void Foo()
{
  if (_objDestructionCondition)
  {
    Destroy(_obj);
  }
  ....
  var position = _obj.transform.position;
  ....
}

Here, '_obj' is destroyed if '_objDestructionCondition' is 'true'. In this case, the subsequent '_obj.transform.position' property call will cause an exception to be thrown.

You can avoid this error by adding the 'return' operator at the end of the conditional expression block:

if (_objDestructionCondition)
{
  Destroy(_obj);
  return;
}

Another option is to add the '_obj != null' check before using the object:

if (_obj != null)
{
  var position = _obj.transform.position;
}

Look at another example:

Projectile _projectile;
....
public void UpdateAction()
{
  if (HasActionExecutionTimeEnded())
  {
    ....
    UnityEngine.Object.Destroy(_projectile);
  }
  ....
  UpdateProjectileState(_projectile); // <=
}

public void UpdateProjectileState(Projectile projectile)
{
  ....
  projectile.transform.position = ....; // <=
}

If the 'HasActionExecutionTimeEnded()' returns 'true', the '_projectile' object is destroyed via the 'UnityEngine.Object.Destroy' method. In this case, the subsequent use of '_projectile' within the 'UpdateProjectileState' method may lead to an exception.

As in the previous example, you can fix this issue in 2 ways.

1. Add the 'return' operator after 'UnityEngine.Object.Destroy':

if (HasActionExecutionTimeEnded())
{
  UnityEngine.Object.Destroy(_projectile);
  return;
}

2. Implement the '_projectile != null' check:

if (_projectile != null)
{
  UpdateProjectileState(_projectile)
}