Misuse of errno

errno неверно проверено на наличие ошибки условий

Описание

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

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

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

  • atof: Если вы следуете стандарту ISO, функция не устанавливается errno.

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

Риск

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

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

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

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

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

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

  • fopen возвращает указатель null, если произошла ошибка.

  • 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 для указателя со значением null.

#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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: ERRNO_MISUSE
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 703
Введенный в R2017a