1

我们正在捕获一个 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;
4

1 回答 1

3

经过大约 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;
于 2015-12-29T10:31:33.130 回答