1

Visual Studio 2015 を使用しており、最新の SDK もインストール (および再インストール) しました。新しいプロジェクトを開始して警告レベルを設定し、「警告をエラーとして扱う」も設定し、ビルド時に静的コード分析を実行するように設定しました。次のコードを含む単純な main.c は、いくつかの興味深い SAL 注釈警告を出力します。

コード:

// main.c
#include <Windows.h>
#include <stdio.h>

int main()
{
    printf("wtf?");
    return 0;
}

エラー出力:

c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\string.h(130): warning C28252: Inconsistent annotation for 'strcpy': _Param_(1) has 'SAL_writableTo(elementCount(_String_length_(__formal(1,parameter1))+1))' on the prior instance. See <no file>(0). 
c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\string.h(130): warning C28253: Inconsistent annotation for 'strcpy': _Param_(1) has 'SAL_writableTo(elementCount(_String_length_(_Source)+1))' on this instance. See <no file>(0). 

補足事項:

  • これはリリースビルドでのみ発生することがわかりました(デバッグでは問題なく動作します)
  • また、ソースが .c の場合にのみ発生します ( .cpp を使用したリリース/デバッグの両方で正常に動作します)

これまでに試した解決策:

  • Visual Studio 2015 + SDK の再インストール
  • string.h ヘッダー内で #pragma warning(suppress:28253) しようとしましたが、そのヘッダーを変更できません

いくつかのバグ送信/チケットで、最新の SDK で修正されたと言ったマイクロソフトの男を見つけました。また、vs2015 コミュニティのダウンロード ページへのリンクを投稿しました (これを再ダウンロードして再インストールしました)。働くこと(少なくとも私にとっては

今のところ、「警告をエラーとして扱う」なしでプロジェクトを続行する予定ですが、小さなハック/回避策のないエレガントなソリューションを誰かが提供してくれれば幸いです。

前もってありがとう、乾杯!

更新 1 一時的な解決策:

#define SAFE_INCLUDE_GUARD_BEGIN __pragma(warning(push)) \
                                 __pragma(warning(disable:28253)) \
                                 __pragma(warning(disable:28252)) 

#define SAFE_INCLUDE_GUARD_END   __pragma(warning(pop))

SAFE_INCLUDE_GUARD_BEGIN
// broken microsoft header includes go here ( like Windows.h, etc )
SAFE_INCLUDE_GUARD_END
4

0 に答える 0