# V3148. Casting potential 'null' value to a value type can lead to NullReferenceException.

Анализатор обнаружил небезопасное приведение ссылки, потенциально содержащей значение 'null', к значимому типу. Хотя в данном случае не происходит прямого разыменования, такое приведение типа приводит к выбросу 'NullReferenceException'.

Простейший пример получения такого исключения:

    void Foo()
    {
      object b = null;
      var c = (bool)b;
    }

Исправленный код будет выглядеть так:

    void Foo()
    {
      object b = null;
      var c = (bool)(b ?? false);
    }

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

    protected override void ProcessMessageAfterSend(....)
    {
      ....
      (DateTime)msg.GetMetadata(....);
      ....
    }
    public object GetMetadata(string tag)
    {
      object data;
      if (metadata != null && metadata.TryGetValue(tag, out data))
      { return data; }
      return null;
    }

Диагностика проверила результат вызова метода 'GetMetadata' и обнаружила там потенциальный 'null'. В данном случае также стоило добавить проверку на null перед приведением типа:

    protected override void ProcessMessageAfterSend(....)
    {
      ....
      (DateTime)(msg.GetMetadata(....) ?? new DateTime());
      ....
    }

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки разыменования нулевого указателя/нулевой ссылки [* см. примечание касательно языков C#, Java].

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

CWE-476

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3148.