exponenta event banner

Errno не сбрасывается

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
Воздействие: Высокое
CWE ID: 253, 456, 703
Представлен в R2017a