2018年4月17日火曜日

[MSVC] pragma warning での警告抑止はどこにでも書けばいいというものではなかった [2013]

Visual Studio 2013 なんてもう誰も使ってない気がしますが
Visual Studio 2013 で pragma warning による警告抑止が効かないケースがあったので、メモです。

気づいたのは、iutest で MSVC の警告撲滅をしていたのがきっかけです。

問題のコードはこちら
https://github.com/srz-zumix/iutest/blob/6a2a798458aa220f2d1a88b8a79be39a867e8709/include/internal/iutest_port.hpp#L283

template
class IUStreamBuffer
{
public:
    // __pragma(warning (push))
    // __pragma(warning (disable: 4996))
    IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN()

    explicit IUStreamBuffer(FILE* fp)
        : m_fp(fp)
    {
        m_buf[0] = '\0';
        fflush(fp);
        setvbuf(fp, m_buf, _IOFBF, SIZE);
    }

    ~IUStreamBuffer()
    {
        fflush(m_fp);
        setbuf(m_fp, NULL);
    }

    // __pragma(warning (pop))
    IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END()
setbuf が C4996 出るので pragma warning push/disble/pop をつけていました。
VS2017 や VS2015 では上記の書き方で問題がなかったのですが、Visual Studio 2013 では正しく警告抑止ができてませんでした。



template
class IUStreamBuffer
{
public:
    explicit IUStreamBuffer(FILE* fp)
        : m_fp(fp)
    {
        m_buf[0] = '\0';
        fflush(fp);
        setvbuf(fp, m_buf, _IOFBF, SIZE);
    }

    ~IUStreamBuffer()
    {
    // __pragma(warning (push))
    // __pragma(warning (disable: 4996))
    IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN()
        fflush(m_fp);
        setbuf(m_fp, NULL);
    // __pragma(warning (pop))
    IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END()
    }


こうだとちゃんと警告が抑止されたので、どうやら書く場所が悪かったみたいです。
(今は setvbuf 使うようにして抑止しなくていいようにしたので、上記コードはなくなりました)


まとめ
最新のコンパイラーなら大丈夫なのかもしれませんが、pragmra warning はどこにでも書けるという認識が間違っていた、というのは良い収穫でした。
極力、警告抑止はない方がいいですが、使う場合はなるべく小さなスコープで書くようにしたいと思います。


今回は以上です。では。

0 件のコメント:

コメントを投稿