exponenta event banner

Неправильное использование errno

errno неправильно проверены на наличие ошибок

Описание

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

Например, вы проверяете errno следующие вызовы функций:

  • fopen: Если следовать стандарту ISO ®, функция может не быть установленаerrno об ошибках.

  • atof: При соблюдении стандарта ISO функция не устанавливается errno.

  • signal: errno значение указывает на ошибку, только если функция возвращает SIG_ERR индикатор ошибки.

Риск

Стандарт ISO C не обеспечивает установку этих функций errno об ошибках. Установлены ли функции errno зависит или нет от реализации.

Обнаружение ошибок при проверке errno только действительность этой проверки также становится зависимой от реализации.

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

Зафиксировать

Для получения информации об обнаружении ошибок см. документацию по данной функции.

Как правило, функции возвращают внеполосный индикатор ошибок для индикации ошибок. Например:

  • fopen возвращает нулевой указатель при возникновении ошибки.

  • signal возвращает значение SIG_ERR индикатор ошибок и наборы errno до положительного значения. Проверить errno только после проверки возвращаемого значения функции.

Примеры

развернуть все

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define fatal_error() abort()

const char *temp_filename = "/tmp/demo.txt";

FILE *func()
{
    FILE *fileptr;
    errno = 0;
    fileptr = fopen(temp_filename, "w+b");
    if (errno != 0) {
        if (fileptr != NULL) {
            (void)fclose(fileptr);
        }
        /* Handle error */
        fatal_error();
    }
    return fileptr;
}

В этом примере: errno является первой переменной, которая проверяется после вызова fopen. Вы можете ожидать, что fopen изменения errno ненулевое значение при возникновении ошибки. При запуске этого кода с реализацией fopen который не установлен errno при возникновении ошибок может быть пропущено условие ошибки. В этой ситуации fopen может возвращать нулевой указатель, который скрывается от обнаружения.

Исправление - Проверка возвращаемого значения fopen После вызова

Одной из возможных корректировок является проверка только возвращаемого значения fopen для нулевого указателя.

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define fatal_error() abort()

const char *temp_filename = "/tmp/demo.txt";

FILE *func()
{
    FILE *fileptr;
    fileptr = fopen(temp_filename, "w+b");
    if (fileptr == NULL) { 
        fatal_error();
    }
    return fileptr;
}

Информация о результатах

Группа: Программирование
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: ERRNO_MISUSE
Воздействие: Высокое
ИДЕНТИФИКАТОР CWE: 703
Представлен в R2017a