【警告対処メモ】関数sprintf,localtimeに関する警告
2009.06.01 |Category …PC/プログラミング
警告対処したときのメモです。
同じ警告が出ている方は参考にどうぞ。
警告コード:
C4996
警告全文:
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
解決策:
Visual C++のVersion Upにより、関数sprintf,localtimeのセキュリティを
強化した関数が用意されたため、既存関数の使用を推奨しないという警告を
出力するようになった模様。( 参考サイト(1))
それぞれのセキュリティ強化版の関数は下記。
※ ただし、localtimeは引数、戻り値が変更となっているため、
※ 関数名以外にも変更が必要。
同じ警告が出ている方は参考にどうぞ。
警告コード:
C4996
警告全文:
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366) : 'sprintf' の宣言を確認してください。
解決策:
Visual C++のVersion Upにより、関数sprintf,localtimeのセキュリティを
強化した関数が用意されたため、既存関数の使用を推奨しないという警告を
出力するようになった模様。( 参考サイト(1))
それぞれのセキュリティ強化版の関数は下記。
・spritf ⇒ sprintf_s (参考サイト(2)(3))
・localtime ⇒ localtime_s (参考サイト(4)(5))
・localtime ⇒ localtime_s (参考サイト(4)(5))
※ ただし、localtimeは引数、戻り値が変更となっているため、
※ 関数名以外にも変更が必要。
▽【ソース&参考サイトはこちら】
対応ソース:
>修正前
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm *now_time;
time(&long_time);
now_time = localtime(&long_time);
sprintf(time_str,
str_org,
now_time->tm_year,
now_time->tm_mon + 1,
now_time->tm_mday,
now_time->tm_hour,
now_time->tm_min,
now_time->tm_sec
);
return 0;
}
>修正後
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm now_time; // ポインタから、変数実体に変更
time(&long_time);
localtime_s(&now_time,&long_time); // 戻り値から引数に変更
sprintf_s(time_str, // ポインタでないため、"->"から"."に変更
str_org,
now_time.tm_year,
now_time.tm_mon + 1,
now_time.tm_mday,
now_time.tm_hour,
now_time.tm_min,
now_time.tm_sec
);
return 0;
}
参考サイト:
MSDNライブラリ
(1)CRT のセキュリティ強化
(2)sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
(3)sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l
(4)localtime、_localtime32、_localtime64
(5)localtime_s、_localtime32_s、_localtime64_s
>修正前
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm *now_time;
time(&long_time);
now_time = localtime(&long_time);
sprintf(time_str,
str_org,
now_time->tm_year,
now_time->tm_mon + 1,
now_time->tm_mday,
now_time->tm_hour,
now_time->tm_min,
now_time->tm_sec
);
return 0;
}
>修正後
int GetTimeStr(void)
{
char *str_org = "ただいま%2d年%d月%2d日の%2d時%2d分%2d秒です";
time_t long_time;
struct tm now_time; // ポインタから、変数実体に変更
time(&long_time);
localtime_s(&now_time,&long_time); // 戻り値から引数に変更
sprintf_s(time_str, // ポインタでないため、"->"から"."に変更
str_org,
now_time.tm_year,
now_time.tm_mon + 1,
now_time.tm_mday,
now_time.tm_hour,
now_time.tm_min,
now_time.tm_sec
);
return 0;
}
参考サイト:
MSDNライブラリ
(1)CRT のセキュリティ強化
(2)sprintf、_sprintf_l、swprintf、_swprintf_l、__swprintf_l
(3)sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l
(4)localtime、_localtime32、_localtime64
(5)localtime_s、_localtime32_s、_localtime64_s
PR
●Thanks Comments
●この記事にコメントする
●この記事へのトラックバック
TrackbackURL: