cppcheck - 警告の意味

 
 「警告」に関して、備忘の意味で記しておきます。
compareBoolExpressionWithInt
funcArgOrderDifferent
getsCalled
initializerList
invalidScanfArgType_int
invalidPrintfArgType_sint
nullPointerRedundantCheck
operatorEqVarError
oppositeInnerCondition
pointerSize
selfAssignment
uninitMemberVar
uselessAssignmentPtrArg
virtualDestructor

compareBoolExpressionWithInt

ID:compareBoolExpressionWithInt
Comparison of a boolean expression with an integer.
 下記のように、bool 型を他の値と比較すると出力されます。

void hoge(void)
{
    bool b = false;
    int n = 0

    if (b == n)
    {
    }
}
 まあ、浮動小数点数と比較することはないでしょうは、bool と整数型を比較することは、やむにやまれずそういう場面になることもあります。  キャストすることで、警告を消すことができるはずです。(実際にはやってみていない)

funcArgOrderDifferent

ID:funcArgOrderDifferent
Function '関数名' argument order different: declaration '変数1, 変数2' definition '変数2, 変数1'
 ヘッダで下記のように宣言しておいて

void hoge(int n1, int n2);
 実際の関数を下記のように書いてしまうと表示されます。

void hoge(int n3, int n2)
{
}
 変数の型と個数はあっているので、コンパイルエラーとはなりませんが、変数名が違うので「なんか間違っていませんか?」ということです。

getsCalled

ID:getsCalled
The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun if the input data exceeds the size of the buffer. It is recommended to use the functions 'fgets' or 'gets_s' instead.
 gets は、バッファオーバーランを引き起こす可能性があると言っています。  fgets か gets_s を使うようにしましょう。

initializerList

ID:initializerList
Member variable 'クラス名::メンバ変数名' is in the wrong place in the initializer list.
 こいつは、

class hogehoge
{
public:
    hogehoge();
    ~hogehoge();

private:
    int a;
};
 みたいなクラス定義をしておいて、コンストラクタで

hogehoge::hogehoge : a(0)
{
}
 みたいな記述をしていると出力されるようです。

invalidScanfArgType_int

ID:invalidScanfArgType_int
%X in format string (no. 引数の番号) requires 'unsigned int *' but the argument type is 'signed int *'.
#include <stdio.h>

int main(int argc, char *argv[])
{
	char *a = "1";

	int       b, c;
	unsigned int d;

	sscanf(a, "%X", &b);
	sscanf(a, "%X", (unsigned int *)&c);
	sscanf(a, "%X", &d);

	return 0;
}


 上記のソースで 10行目が警告となります。  %X は unsigned int を期待しているわけです。  事情があって int を使うのであれば、11行目のようにキャストするか、事情がないのであれば、8行目のように unsigned int で宣言します。

invalidPrintfArgType_sint

ID:invalidPrintfArgType_sint
%d in format string (no. 引数の番号) requires 'int' but the argument type is 'unsigned int'.

void hoge(void)
{
    unsigned int n = 0;

    printf("%d\n", n);
}
 printf の何番目の引数が unsigned int なのに %d の書式を使っていますよということです。  出力は出来ますが、正しくは

void hoge(void)
{
    unsigned int n = 0;

    printf("%u\n", n);
}
 となります。

nullPointerRedundantCheck

ID:nullPointerRedundantCheck
Either the condition 'ポインタ変数名==0' is redundant or there is possible null pointer dereference: ポインタ変数名.
 下記のようなソースコードで表示されます。

void hoge(int* np)
{
    *np = 0;

    if (np == NULL)
    {
    }
}
 「ポインタ変数が、使われているが『ポインタ変数 == 0』の NULL チェックして NULL であってもそのまんま使っちゃったりしているけど大丈夫?」  てな感じに思われます。

operatorEqVarError

ID:operatorEqVarError
Member variable 'クラス名::メンバ変数名' is not assigned a value in 'クラス名::operator='.
 コピーコンストラクタの記述で、メンバ変数を代入していないときに出力されるようです。

oppositeInnerCondition

ID:oppositeInnerCondition
Opposite inner 'if' condition leads to a dead code block (outer condition is '変数名 != 値' and inner condition is '変数名 == 値').
#include <stdio.h>

int main(int argc, char *argv[])
{
	int a = 0;

	scanf("%d", &a);

	if (a != 0)
	{
		sub1();

		if (a == 0)
		{
			sub2();
		}
		else
		{
			sub3();
		}
	}

	return 0;
}


 9行目と13行目の関係です。  9行目で if (a != 0) の判定をしていて、13行目に至るまでに a が変化する要素がなければ 13行目の if (a == 0) は無意味ってこってす。

pointerSize

ID:pointerSize
Size of pointer '変数名' used instead of size of its data.
 比較的ありがちな誤りだったりします。

struct st1
{
    int n1;
};

void hoge(st1* p)
{
    memset(p, 0, sizeof(p));
}
 ただしくは「sizeof(*p)」もしくは「sizeof(st1)」です。

selfAssignment

ID:selfAssignment
Redundant assignment of '変数名' to itself.

void hoge(void)
{
	int a = 0;

	a = a;
}
 てなコーディングをしていると、自分自身を代入しているために出力されるようです。

uninitMemberVar

ID:uninitMemberVar
Member variable 'クラス名::メンバ名' is not initialized in the constructor.
 「『クラス名::メンバ名』変数が、コンストラクタで初期化されていませんよ」という意味です。  安全のためには、メンバ変数はコンストラクタで初期化しておくべきということはもっともな意見ではありますが、特に初期化不要なメンバ変数が大量にある場合、初期化しておくことの意味はなかったりすることもあります。  プロジェクトの方針やルールにより、この項目はチェック項目から外しておいてもいいかもしれません。

uselessAssignmentPtrArg

ID:uselessAssignmentPtrArg
Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?
 下記のようなコーディングで出力されます。

void hoge(int* n1)
{
    int n2 = 0;

    if (n2 == 0)
    {
        n1 = NULL;
    }
}
 「ポインタ引数に NULL を設定しちゃってるけど、その外側の処理は大丈夫ですか?」ってなことです。

virtualDestructor

ID:virtualDestructor
Class 'クラス名' which has virtual members does not have a virtual destructor.
 「『クラス』は、変数が、virtual のメンバを持っているのに、デストラクタが virtual ではありませんよ」という意味です。  これはクラスの構成によるのかしら。とりあえず、わたしは無視しています。