Обнаружение покрытия: не восстанавливает ostream формат (STREAM_FORMAT_STATE)

Мы ловим находку Coverity CID 156014: не восстанавливается формат ostream (STREAM_FORMAT_STATE) (текст ниже и изображение в конце).

 938        const std::streamsize oldp = cout.precision(6);
5. format_changed: setf changes the format state of std::cout for category floatfield.
939        const std::ios::fmtflags oldf = cout.setf(std::ios::fixed, std::ios::floatfield);
940        cout << "  Maurer Randomness Test returned value " << mv << endl;
6. format_changed: precision changes the format state of std::cout for category precision.
941        cout.precision(oldp);
7. format_restored: setf changes the format state of std::cout for category floatfield.
942        cout.setf(oldf, std::ios::floatfield);

Появляется строка 941, cout.precision(oldp) это проблема. Coverity, кажется, классифицирует это как менять а не восстановить.

В соответствии с вернуть точность по умолчанию C ++ на ТАК я считаю, что мы делаем то, что рекомендуется. (Но я могу ошибаться, или принятый ответ не может быть лучшей практикой).

Как мы можем восстановить точность а также раздавить находку Коверти?


введите описание изображения здесь


Я недавно устал от следующего, но это продолжает приводить к format_changed: setf changes the format state of std::cout for category floatfield.

// Coverity finding
class StreamState
{
public:
StreamState(std::ostream& out)
: m_out(out), m_fmt(out.flags()), m_prec(out.precision())
{
}

~StreamState()
{
m_out.precision(m_prec);
m_out.flags(m_fmt);
}

private:
std::ostream& m_out;
std::ios_base::fmtflags m_fmt;
std::streamsize m_prec;
};
...

StreamState ss(cout);
cout.setf(std::ios::fixed, std::ios::floatfield);
cout.precision(6);

cout << "  Maurer Randomness Test returned value " << mv << endl;

1

Решение

Примерно после 6 попыток (я думаю, что мы использовали все наши материалы за неделю), кажется, мы не могу используйте функции-члены, чтобы установить floatfield в программе (т.е. ostream.iosflags(...); ostream.precision(...)). Мы должны были использовать манипуляторы для floatfield (Т.е. ostream << setiosflags(...) << setprecision(...)):

// Coverity finding
class StreamState
{
public:
StreamState(std::ostream& out)
: m_out(out), m_fmt(out.flags()), m_prec(out.precision())
{
}

~StreamState()
{
m_out.precision(m_prec);
m_out.flags(m_fmt);
}

private:
std::ostream& m_out;
std::ios_base::fmtflags m_fmt;
std::streamsize m_prec;
};

А также:

StreamState ss(cout);
cout << std::setiosflags(std::ios::fixed) << std::setprecision(6);
cout << "  Maurer Randomness Test returned value " << mv << endl;
3

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

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