exponenta event banner

Errno не проверено

errno не проверяется на наличие ошибок после вызова функции

Описание

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

Задаваемые функции errno к ошибкам относятся:

  • fgetwc, strtol, и wcstol.

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

  • POSIX ®errno-установочные функции, такие как encrypt и setkey.

Риск

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

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

  • 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++
По умолчанию: Откл.
Синтаксис командной строки: ERRNO_NOT_CHECKED
Воздействие: среднее
CWE ID: 253, 391
Представлен в R2017a