# V1095. Usage of potentially invalid handle. The value should be non-negative.

Анализатор обнаружил, что в вызываемую функцию передаётся невалидный дескриптор, имеющий отрицательное значение. Данная диагностика используется только на POSIX-совместимых платформах, поскольку в Windows дескрипторы являются указателями и для них используется диагностика V575.

Рассмотрим синтетический пример:

    void Process()
    {
      int fd = open("path/to/file", O_WRONLY | O_CREAT | O_TRUNC);

      char buf[32];
      size_t n = read(fd, buf, sizeof(buf)); // <=
      // ....
    }

Программист забыл проверить результат функции 'open'. Если файл невозможно открыть, то функция 'open' вернёт значение -1, и это некорректное значение дескриптора будет передано в функцию 'read'.

Исправленный пример:

    void Process()
    {
      int fd = open("path/to/file", O_WRONLY | O_CREAT | O_TRUNC);
      if (fd < 0)
      {
        return;
      }

      char buf[32];
      size_t n = read(fd, buf, sizeof(buf));
      // ....
    }

Рассмотрим другой пример:

    static intoss_setformat(ddb_waveformat_t *fmt)
    {
      // ....
      if (fd)
      {
        close (fd);
        fd = 0;
      }
      fd = open (oss_device, O_WRONLY);
      // ....
    }

В функцию 'close' может быть передан неверный дескриптор из-за неаккуратной проверки. В таком случае дескриптор со значением 0 тоже может быть валидным и должен быть освобождён. Здесь же мы закрываем дескриптор, если значение 'fd' не равно нулю. Такая ошибка может быть допущена, например, после рефакторинга кода или вследствие незнания программистом того, что неверный дескриптор имеет значение '-1', а не '0'.

Исправим приведённый фрагмент кода:

    static intoss_setformat(ddb_waveformat_t *fmt)
    {
      // ....
      if (fd >= 0)
      {
        close (fd);
        fd = -1;
      }
      fd = open (oss_device, O_WRONLY);
      // ....
    }

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

CWE-775