none
debug版だけxmemory0ファイルの_SCL_SECURE_ALWAYS_VALIDATEでエラーが出る

    質問

  • VC6で作成されたソースをVS2017にマイグレーションしています。

    VC6のプロジェクトをVS2008にてビルドが出来たので
    とりあえずVS2017でビルドをしてみると

    リリース版では問題なく終了するのですが
    デバッグ版だと以下のエラーになってしまいます。
    現在情報が無く手詰まり状態です。

    エラー C2143 構文エラー: ')' が '文字列' の前にありません。[****] c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.12.25827\include\xmemory0 124
    エラー C2059 構文エラー: '文字列' [****] c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.12.25827\include\xmemory0 124
    エラー C2059 構文エラー: ')' [****] c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.12.25827\include\xmemory0 124
    ※[****]にはファイル名が入ってます


    該当エラーをダブルクリックで開くと
    ~~~\MSVC\14.12.25827\include\xmemory0のソースの
    124行目にある、以下の★部分の箇所でエラーと言われます。

    const uintptr_t _Ptr_container =
    reinterpret_cast<uintptr_t>(::operator new(_Block_size));
    _SCL_SECURE_ALWAYS_VALIDATE(_Ptr_container != 0); ★ここのエラーとなっている
    void * const _Ptr = reinterpret_cast<void *>((_Ptr_container + _Non_user_size)
    & ~(_Big_allocation_alignment - 1));
    static_cast<uintptr_t *>(_Ptr)[-1] = _Ptr_container;


    試しに_SCL_SECURE_ALWAYS_VALIDATEの行をコメントアウトすると
    エラーが解決されビルドできますがVS側のソースを修正してしまっては根本的な解決にならない・・。

    例えばプロジェクトの設定で回避できるのであればそれが良いのですが
    何か設定とかで回避することはできないでしょうか?

    またプロジェクトの設定で回避できないのであれば
    根本的な解決をしないとならないと思いますが
    デバッグ版のみで上記箇所にてエラーになる場合とは
    どういう原因が考えられるのでしょうか?


    以上よろしくお願いします。

    2018年4月18日 1:54

回答

  • 大量のマクロ展開で読みづらいですが、デバッグ版で★を付けていただいたところ、_CrtDbgReportW()呼び出しの第5引数のところが

    0"%ls"

    となっています。ここは本来

    L"%ls"

    となるべき箇所です。ヘッダーファイルの検索で 0"%ls" を探してみてください。(crtdbg.hかな?) 問題個所がヒットするかもしれません。仮に見つかった場合は当該ファイルをエクスプローラーで開いてみてください。当該ファイルのみタイムスタンプが異なるようでしたら、誤って編集してしまったことになるかと思います。

    • 回答としてマーク kawasima 2018年4月20日 2:01
    2018年4月19日 4:26
  • まさかとは思いますが、 #define L 0 のように L に対してマクロ定義をしていますか?
    • 回答としてマーク kawasima 2018年4月20日 1:59
    2018年4月19日 10:55
  • 原因がよくわかりませんね。コンパイルオプション /P を追加してビルドを試してみてください。 拡張子 .i のファイルが生成されると思いますので、そのファイルに問題の関数 _Allocate_manually_vector_aligned が含まれていますので、_SCL_SECURE_ALWAYS_VALIDATEマクロがどのように展開されたのかが確認できます。
    • 回答としてマーク kawasima 2018年4月20日 2:01
    2018年4月18日 10:31

すべての返信

  • kawasima さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    ご質問につきましては以下のフォーラムの方が情報が集まりやすい
    と思いますので移動させていただきますね。

    Visual Studio Development > Visual C++

    それでは皆様からの情報をお待ちください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年4月18日 2:02
    モデレータ
  • 直接は関係しませんが、まず作成しているアプリケーションの動作環境はどう想定されていますでしょうか? Windows 7以降など。

    問題個所についてですが、ヘッダーファイルを辿っていくと、xmemory0の時点ではVisual C++ヘッダーですが、そこで参照されている _CRT_SECURE_INVALID_PARAMETER はWindows SDKで定義されています。そこで確認ですが、使用されているWindows SDKのバージョンはいくつでしょうか? 現時点で最新の 10.0.16299.0 に更新しても問題ないでしょうか?

    Visual C++自体も 14.12.25827 を使われているようですが、現在の最新は 14.13.26128 ですのでこちらに更新されることをお勧めします。

    2018年4月18日 2:36
  • 佐祐理 様
    直接関係しないまでとも思い
    以下確認&試してみましたが変化はありませんでした。

    >作成しているアプリケーションの動作環境はどう想定されていますでしょうか?
    動作環境としてはWIn10を想定しています。

    >使用されているWindows SDKのバージョンはいくつでしょうか?
    10.0.16299.0 になっていました。

    >現在の最新は 14.13.26128 ですのでこちらに更新されることをお勧めします。
    updateして14.13.26128にしてみましたが変化はありませんでした。

    以上、よろしくお願いいたします。
    2018年4月18日 4:04
  • 原因がよくわかりませんね。コンパイルオプション /P を追加してビルドを試してみてください。 拡張子 .i のファイルが生成されると思いますので、そのファイルに問題の関数 _Allocate_manually_vector_aligned が含まれていますので、_SCL_SECURE_ALWAYS_VALIDATEマクロがどのように展開されたのかが確認できます。
    • 回答としてマーク kawasima 2018年4月20日 2:01
    2018年4月18日 10:31
  • 佐祐理様

    /Pを付けて出力してみました。
    _Allocate_manually_vector_aligned部分は以下になると思います

    ★の付けた行がたぶん該当行だと思います。
    _SCL_SECURE_ALWAYS_VALIDATEがdefineだったので
    それが展開されているってことだと思いますが
    この情報からなにか気になる部分などあればよろしくお願いします。

    ■デバッグ版
      #line 89 "c:\\program files (x86)\\microsoft visual studio\\2017\\professional\\vc\\tools\\msvc\\14.13.26128\\include\\xmemory0"

    template<class _Traits> inline
        __declspec(allocator) void * _Allocate_manually_vector_aligned(const size_t _Bytes)
        {    
        size_t _Block_size = _Non_user_size + _Bytes;
        if (_Block_size <= _Bytes)
            {    
            _Block_size = static_cast<size_t>(-1);
            }
        const uintptr_t _Ptr_container = reinterpret_cast<uintptr_t>(_Traits::_Allocate(_Block_size));
    ★    { if (!(_Ptr_container != 0)) { (void)( (!!(("_Ptr_container != 0" && 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio\\2017\\professional\\vc\\tools\\msvc\\14.13.26128\\include\\xmemory0", 102, 0, 0"%ls", L"\"_Ptr_container != 0\" && 0")) || (__debugbreak(), 0) ); ::_invalid_parameter(L"\"invalid argument\"", __LPREFIX( __FUNCTION__), L"c:\\program files (x86)\\microsoft visual studio\\2017\\professional\\vc\\tools\\msvc\\14.13.26128\\include\\xmemory0", 102, 0); } ; };    
        void * const _Ptr = reinterpret_cast<void *>((_Ptr_container + _Non_user_size)
            & ~(_Big_allocation_alignment - 1));
        static_cast<uintptr_t *>(_Ptr)[-1] = _Ptr_container;
      
        static_cast<uintptr_t *>(_Ptr)[-2] = _Big_allocation_sentinel;
      #line 110 "c:\\program files (x86)\\microsoft visual studio\\2017\\professional\\vc\\tools\\msvc\\14.13.26128\\include\\xmemory0"
        return (_Ptr);
        }



    ■リリース版
      #line 81 "c:\\program files (x86)\\microsoft visual studio\\2017\\professional\\vc\\tools\\msvc\\14.13.26128\\include\\xmemory0"

    template<class _Traits> inline
        __declspec(allocator) void * _Allocate_manually_vector_aligned(const size_t _Bytes)
        {    
        size_t _Block_size = _Non_user_size + _Bytes;
        if (_Block_size <= _Bytes)
            {    
            _Block_size = static_cast<size_t>(-1);
            }
        const uintptr_t _Ptr_container = reinterpret_cast<uintptr_t>(_Traits::_Allocate(_Block_size));
    ★    { if (!(_Ptr_container != 0)) { ((void)0); ::_invalid_parameter_noinfo_noreturn(); } ; };    
        void * const _Ptr = reinterpret_cast<void *>((_Ptr_container + _Non_user_size)
            & ~(_Big_allocation_alignment - 1));
        static_cast<uintptr_t *>(_Ptr)[-1] = _Ptr_container;
      
        return (_Ptr);
        }


    以上、よろしくお願いいたします。
    2018年4月19日 1:36
  • 大量のマクロ展開で読みづらいですが、デバッグ版で★を付けていただいたところ、_CrtDbgReportW()呼び出しの第5引数のところが

    0"%ls"

    となっています。ここは本来

    L"%ls"

    となるべき箇所です。ヘッダーファイルの検索で 0"%ls" を探してみてください。(crtdbg.hかな?) 問題個所がヒットするかもしれません。仮に見つかった場合は当該ファイルをエクスプローラーで開いてみてください。当該ファイルのみタイムスタンプが異なるようでしたら、誤って編集してしまったことになるかと思います。

    • 回答としてマーク kawasima 2018年4月20日 2:01
    2018年4月19日 4:26
  • 佐祐理 様

    ヘッダーファイルの検索で 0"%ls"を探してみましたが
    残念ながら該当箇所はありませんでした。

    一応"%ls"だけで検索したりしてみましたが 「0」が付いてる部分は・・・なし
    関係ないと思いつつ一応自ソース側も検索してみましたが・・・これもなし

    こちらでも怪しそうな部分のソースをコメントアウトなどして
    色々と試しているのですが、まだ解決策が見つかってません。

    以上、よろしくお願いいたします。

    2018年4月19日 7:54
  • まさかとは思いますが、 #define L 0 のように L に対してマクロ定義をしていますか?
    • 回答としてマーク kawasima 2018年4月20日 1:59
    2018年4月19日 10:55
  • 佐祐理 様

    まさかと思いつつ検索したら
    以下の定義・・存在しました。
    ※他にも1文字defineが多数・・・

    #define L 0

    上記修正する事でビルド出来るようになりました。
    本当にありがとうございました。

    また/Pにてマクロの展開確認方法などは
    今まで知らなかったので今後は利用してきたいと思います。

    以上、よろしくお願いいたします。
    2018年4月20日 1:59