Errno, не проверяемый

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

Описание

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
Влияние: носитель
ID CWE: 253, 391

Введенный в R2017a