# V3137. The variable is assigned but is not used by the end of the function.

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

Рассмотрим фрагмент кода:

    private string GetDisplayName(string name)
    {
      MyStringId tmp = MyStringId.GetOrCompute(name);
      string result;
      if (!MyTexts.TryGet(tmp, out result))
        result = name;
      return name;
    }

Программист хотел, чтобы результатом метода была переменная 'result', которая инициализируется в зависимости от выполнения 'TryGet'. К сожалению, из-за опечатки метод всегда возвращает переменную 'name'. Правильный код должен выглядеть следующим образом:

    private string GetDisplayName(string name)
    {
      MyStringId tmp = MyStringId.GetOrCompute(name);
      string result;
      if (!MyTexts.TryGet(tmp, out result))
        result = name;
      return result;
    }

Рассмотрим еще один фрагмент кода:

    protected DateTimeOffset? GetFireTimeAfter()
    {
      DateTimeOffset sTime = StartTimeUtc;
      DateTimeOffset? time = null;
      ....
      if (....)
      {
        ....
        time = sTime;
      }
      else if (....)
      {
        ....
        time = sTime;
      }
      ....
      //apply the timezone before we return the time.
      sTime = TimeZoneUtil.ConvertTime(time.Value, this.TimeZone);
      return time;
    }

В нескольких блоках 'if' в переменную 'time' записывается значение 'sTime', хранящее некоторое стартовое время, увеличенное на некоторый интервал. В конце метода переменная 'time' возвращается. Перед возвращением 'time', судя по комментарию в коде, программист хочет скорректировать представление времени, учитывая временную зону. По ошибке корректируется временная зона переменной 'sTime', которая более нигде не используется. Правильный код, скорее всего, должен выглядеть следующим образом:

    protected DateTimeOffset? GetFireTimeAfter()
    {
      DateTimeOffset sTime = StartTimeUtc;
      DateTimeOffset? time = null;
      ....
      //apply the timezone before we return the time.
      time = TimeZoneUtil.ConvertTime(time.Value, this.TimeZone);
      return time;
    }

Часто встречается код, в котором при объявлении переменной присваивается какое-то значение, а затем эта переменная более нигде не используется. Обычно это не является ошибкой. Например, это может быть сделано в соответствии с принятым в компании стандартом программирования, при котором требуется всегда сохранять в переменной результат работы любого метода, даже если этот результат никак не используется. Например:

    void SomeMethod()
    {
      ....
      int result = DoWork();
      ....
    }

Для таких ситуаций в анализаторе сделано исключение и диагностика не выдаст предупреждение.

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

CWE-563

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