Errno not reset

errno не сброс прежде, чем вызвать функцию, которая устанавливает errno

Описание

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

Риск

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

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

Фиксация

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

Примеры

развернуть все

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

#define fatal_error() abort()

double func(const char *s1, const char *s2)
{
    double f1;
    f1 = strtod (s1, NULL);      
    if (0 == errno) {        
      double f2 = strtod (s2, NULL); 
        if (0 == errno) {        
            long double result = (long double)f1 + f2;
            if ((result <= (long double)DBL_MAX) && (result >= (long double)-DBL_MAX)) 
				  {
                return (double)result;
            }
        }
    }
    fatal_error();
    return 0.0;
}

В этом примере, errno не сбрасывается к 0 перед первым вызовом strtod. Проверка errno для 0 позже может привести к положительной лжи.

Коррекция — сброс errno Перед вызовом

Одна возможная коррекция должна сбросить errno к 0 прежде, чем вызвать strtod.

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

#define fatal_error() abort()

double func(const char *s1, const char *s2)
{
    double f1;
    errno = 0;                   
    f1 = strtod (s1, NULL);
    if (0 == errno) {            
      double f2 = strtod (s2, NULL);  
        if (0 == errno) {       
            long double result = (long double)f1 + f2;
            if ((result <= (long double)DBL_MAX) && (result >= (long double)-DBL_MAX)) 
  			{
                return (double)result;
            }
        }
    }
    fatal_error();
    return 0.0;
}

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

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: MISSING_ERRNO_RESET
Удар: высоко
ID CWE: 253, 456, 703
Введенный в R2017a