VS2015の警告除去
Visual Studio 2015 でビルドした場合に出力される警告を除去する。 ■モジュールごとの警告メッセージ ●Tera Term 1>..\common\ttlib.c(963): warning C4996: 'GetVersionExA': が古い形式として宣言されました。 2>svnrev.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 6>ttl.c(1161): warning C4267: '=': 'size_t' から 'WORD' に変換しました。データが失われているかもしれません。 6>ttl.c(2331): warning C4996: 'WSASocketA': Use WSASocketW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 6>ttl.c(2343): warning C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 7>ttset.c(3094): warning C4477: 'sscanf' : format string '%d' requires an argument of type 'int *', but variadic argument 1 has type 'WORD *' 5>kermit.c(1043): warning C4267: '関数': 'size_t' から 'BYTE' に変換しました。データが失われているかもしれません。 9>vtwin.cpp(285): warning C4302: '型キャスト': 'LPCTSTR' から 'WORD' へ切り詰めます。 ●TTSSH 4>ttssh.obj : warning LNK4075: /EDITANDCONTINUE は /SAFESEH の指定によって無視されます。 5>c:\usr\ttssh2_vc2015\trunk\ttssh2\ttxssh\dns.c(66): warning C4996: 'GetVersionExA': が古い形式として宣言されました。 5>c:\usr\ttssh2_vc2015\trunk\ttssh2\ttxssh\ed25519_bcrypt_pbkdf.c(77): warning C4267: '関数': 'size_t' から 'u_int16_t' に変換しました。データが失われているかもしれません。 5>c:\usr\ttssh2_vc2015\trunk\ttssh2\ttxssh\fwd.c(201): warning C4996: 'WSACancelAsyncRequest': Define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 5>c:\usr\ttssh2_vc2015\trunk\ttssh2\ttxssh\fwd.c(598): warning C4996: 'WSAAsyncSelect': Use WSAEventSelect() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings 5>c:\usr\ttssh2_vc2015\trunk\ttssh2\ttxssh\key.c(825): warning C4267: '=': 'size_t' から 'unsigned char' に変換しました。データが失われているかもしれません。 ■対処方法 ●GetVersionEx 新しいVisual Studioでは、GetVersion系関数を推奨していないため、VerifyVersionInfo関数に 置換する必要がある。 下記に示すプラグマでコンパイラの警告を抑止することもできるが、GetVersion系に限定 しているわけではない。 #pragma warning(disable:4996) コンパイラのバージョンで使用するAPIを切り替える方法が望ましい。 参考までに、Wireshark 2.0.0だと以下のようになっている。 下記例では、OSのメジャー番号が6以上かどうかを見ている。 gboolean IsWindowsVistaOrLater() { #if (_MSC_VER >= 1800) /* * On VS2103, GetVersionEx is deprecated. Microsoft recommend to * use VerifyVersionInfo instead */ OSVERSIONINFOEX osvi; DWORDLONG dwlConditionMask = 0; int op = VER_GREATER_EQUAL; SecureZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); osvi.dwMajorVersion = 6; VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op); return VerifyVersionInfo(&osvi, VER_MAJORVERSION, dwlConditionMask); #else OSVERSIONINFO osvi; SecureZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if(GetVersionEx(&osvi)){ return osvi.dwMajorVersion >= 6; } return FALSE; #endif } 参考までに、OSのメジャー番号とマイナー番号の両方をチェックするには以下のようにする。 OSVERSIONINFOEX OSver; ULONGLONG condition = 0; OSver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); OSver.dwMajorVersion = 6; OSver.dwMinorVersion = 2; VER_SET_CONDITION( condition, VER_MAJORVERSION, VER_GREATER_EQUAL); VER_SET_CONDITION( condition, VER_MINORVERSION, VER_GREATER_EQUAL); if( VerifyVersionInfo( &OSver, VER_MAJORVERSION | VER_MINORVERSION, condition)) { // Windows8.0以上の時の処理 } else { // それ以外の処理 } 以上より、対応方針としては以下のようにする。 修正箇所が多く、影響範囲が少なくないので、ブランチ上で作業して、問題ないことが 確認取れたらトランクにマージとする。 1. IsWindowsVistaOrLaterのような関数を作成する。 2. GetVersionの使用箇所を置き換える。
ref. https://osdn.jp/projects/ttssh2/wiki/VisualStudio2013
Details