Errno not checked

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

Описание

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

Функции, которые задают errno при ошибках включают:

  • fgetwc, strtol, и wcstol.

    Полный список функций см. в документации об errno.

  • POSIX® errno-настройка функций, таких как encrypt и setkey.

Риск

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

Значения возврата этих errno-настройка функций не указывает на ошибки. Значение возврата может быть одним из следующих:

  • void

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

Определить, произошла ли ошибка, можно только проверив errno.

Для образца, strtol преобразует строку в длинное целое число и возвращает целое число. Если результат преобразования переполнен, функция возвращается LONG_MAX и устанавливает errno на ERANGE. Однако функция также может вернуться LONG_MAX от успешного преобразования. Только проверяя errno можно ли различать ошибку и успешное преобразование.

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

Перед вызовом функции установите errno в нуль.

После вызова функции, чтобы увидеть, произошла ли ошибка, сравните errno в нуль. Также сравните errno к известным значениям индикатора ошибки. Для образца, strtol устанавливает errno на ERANGE для указания ошибок.

Сообщение об ошибке в Polyspace® результат показывает значение индикатора ошибки, с которым можно сравнить.

Примеры

расширить все

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

int main(int argc, char *argv[]) {
    char *str, *endptr;
    int base;
    
    str = argv[1];
    base = 10;
    
    long val = strtol(str, &endptr, base);
    printf("Return value of strtol() = %ld\n", val);
}

Вы используете возврат значение strtol без проверки errno.

Коррекция - Проверяйте errno После вызова

Перед вызовом strtol, задать errno в нуль. После вызова к strtol, проверьте значение возврата на LONG_MIN или LONG_MAX и errno для ERANGE.

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

int main(int argc, char *argv[]) {
    char *str, *endptr;
    int base;
    
    str = argv[1];
    base = 10;
    
    errno = 0;
    long val = strtol(str, &endptr, base);
    if((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE) {
         printf("strtol error");
         exit(EXIT_FAILURE);
    }        
    printf("Return value of strtol() = %ld\n", val);
}

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

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