Errno not reset

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

Описание

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

Риск

The 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: MISSING_ERRNO_RESET
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 253, 456, 703
Введенный в R2017a