почему fstream ноль errno в функции деструктора

Пример кода выглядит так:

void testFuncErrno()
{
fstream fstr;
fstr.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try
{
fstr.open("/mnt/virtualfs/test.ss", ofstream::out);
fstr << "test" << endl;
}
catch(std::ifstream::failure e)
{
cout << "func catch errno is:" << errno << ":" << strerror(errno) << endl;
cout << "good?" << (fstr.good()?"yes":"no") << endl;
}
}

int main(int argc, char *argv[])
{
try
{
errno = 0;
testFuncErrno();
cout << "0 st errno is:" << errno << ":" << strerror(errno) << endl;
}
catch(std::ifstream::failure e)
{
cout << "catch errno is:" << errno << ":" << strerror(errno) << endl;
}
pause();
return 0;
}

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

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

меня это немного смущает, почему закрытие будет равняться нулю?

  __basic_file<char>*
__basic_file<char>::close()
{
__basic_file* __ret = static_cast<__basic_file*>(NULL);
if (this->is_open())
{
int __err = 0;
if (_M_cfile_created)
{
**// In general, no need to zero errno in advance if checking
// for error first. However, C89/C99 (at variance with IEEE
// 1003.1, f.i.) do not mandate that fclose must set errno
// upon error.**
errno = 0;
do
__err = fclose(_M_cfile);
while (__err && errno == EINTR);
}
_M_cfile = 0;
if (!__err)
__ret = this;
}
return __ret;
}

0

Решение

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

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

Установка ошибки в 0 непосредственно перед вызовом fclose () подтверждает, что значение, которое имеет errno, устанавливается fclose () и никакой другой функцией.

Вы можете найти ниже обсуждение использования:
https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=6619179

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector