はじめに
C++の静的解析ツール「cppcheck」でソースコードを静的解析した場合に、以下の警告がでることがあります。
(warning) %d in format string (no. 1) requires 'int' but the argument type is 'ULONG {aka unsigned long}'.
cppcheckのバージョン
- v1.66
サンプルプログラム
以下のソースプログラムを解析にかけると表示されます。
#include "stdafx.h" #include <windows.h> int _tmain(int argc, _TCHAR *argv[]) { ULONG hoge = 100; char szBuff[20] = { 0 }; sprintf(szBuff, "%d", hoge); //-> (warning) %d in format string (no. 1) requires 'int' but the argument type is 'ULONG {aka unsigned long}'. sprintf(szBuff, "%lu", hoge); //-> OK printf("%s\n", szBuff); return 0; }
上記のように、sprintf関数の書式指定文字列で指定している%dと実際のデータ型が一致していない場合に警告が出力されます。
変数hogeは、unsigned longなので書式文字列は%luが正しいです。
関連記事
- 【VC++】OCIを使ってOracle DBに接続するコード書いたよ。
- 【cppcheck】(warning) sprintf format string requires 1 parameter but 2 are given.
- 【cppcheck】(style) Clarify calculation precedence for '+' and '?'.
- 【cppcheck】error: Undefined behavior: Variable 'xxx' is used as parameter and destination in s[n]printf().
- (warning) The 2nd memset() argument '8224' doesn't fit into an 'unsigned char'.