我们正在捕获一个 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 似乎将其归类为更改而不是恢复。
根据set back default precision C++ on SO,我相信我们正在做推荐的事情。(但我可能是错的,或者接受的答案可能不是最佳实践)。
我们如何才能恢复精度并压制 Coverity 的发现?
我最近厌倦了以下内容,但它继续产生结果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;