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
Удар: Средняя
ID CWE: 253, 391
Введенный в R2017a