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