Errno не сброс

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
Влияние: высоко
ID CWE: 253, 456, 703

Введенный в R2017a