次のコードサンプルスニペットに対してMISRAQAC警告が表示されます。つまり、「制御式の値は、明示的な論理演算から派生したものではありません。」
戻り値を変数評価に割り当てずに行われたことは明らかです。この品質警告の正確な理由は何ですか?
file.c
if(fun1())
{
//statement1
}
else
{
//statement2
}
bool fun1()
{
return (bool) (Global_variable1 && Global_Variable2)
}
コードに次のMISRA-C:2012違反があります。
規則8.2関数は、名前付きパラメーターを使用したプロトタイプ形式でなければなりません。
規則8.4互換性のある宣言は、外部リンケージを持つオブジェクトまたは関数が定義されている場合に表示されるものとします。
規則17.3関数は暗黙的に宣言されてはならない
準拠ツールが上記のエラーの少なくとも1つを与えることを期待します。さらに、準拠したC99以降のコンパイラーは、暗黙的な関数/暗黙的なintを使用してコードをコンパイルしません。
これらの問題はいずれも、ブール値に関連するものではありません。特に、MISRA-Cには「制御式の値が明示的な論理演算から派生していない」というルールがありません。関連するMISRA-Cルールは
規則14.4
if
ステートメント/-/の制御式は、基本的にブール型でなければなりません。
MISRA-C:2004では、このルールは13.2と呼ばれ、当時は単なる助言でした。それはほとんど同じルールでした。
MISRA-C:2012の違いは、ツールを使用していない場合に備えて、ツールに「本質的にブール」(2004年には「実質的にブール」と呼ばれる)として扱うタイプを構成する何らかの手段が必要であると明示的に言及していることです。 C99ブール型。
ツールがどのタイプを本質的にブール値と見なすかわからない場合は、自家製のC90をbool
として扱いますint
。そして、if
ステートメントがを使用しint
ていると見なされますが、これはルール違反でした。
さらに、事前関数宣言が表示されていないC90関数は、関数がを返すことを暗黙的に想定していますint
。しかし、上記の3つのルールがあるため、MISRA-Cチェッカーはそのようなコードを決して通過させてはなりません。
特定のエラーを修正するための解決策:
if(fun()==true)
、MISRAに準拠するためだけにパッチを適用する必要はありません。MISRA-C:2004 / MISRA-C:2012準拠のコードを取得するためのソリューション:
bool fun1 (void); /* you must declare the function before using it and it must use void */
...
if(fun1())
{
/*statement1*/ /* Note that you can't use // comments in C90 or MISRA-C:2004 */
}
else
{
/*statement2*/
}
...
bool fun1 (void) /* must use void */
{
/* return is not a controlling expression, no need for compound statements.
No need to cast, the result of && is essentially boolean.
MISRA-C:2004 has no requirement to cast to underlying type if using booleans.
*/
return Global_variable1 && Global_Variable2;
}
グローバル変数を使用すると、他のMISRA-Cルールや、コードを保守する必要のある同僚とのトラブルに巻き込まれる可能性があることに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加