2

Tasking VXツールセット(Eclipse上に構築)を使用していますが、かなり基本的ですが根本的な問題があり、回避できません... RTFMを実行しましたが、まだまったく賢明ではありません。

単純なコードスニペットを想像してみてください。

#include <stdbool.h>

bool myFlag = false;

MISRA-Cチェックを有効にすると、次のようになります。

MISRA-C rule 10.1 violation: [R] restrict the use of implicit conversions for integer types

EclipseはC99実装としてセットアップされ、標準ライブラリ定義に従って、次のstdbool.hように定義されます。

#define bool  _Bool
#define true  1
#define false 0

このエラーは#define false 0、ツールが暗黙的にブール値に変換しているためだと思いますか?

注:割り当てをキャストすると、エラーは削除されます。

 bool myFlag = (bool)false;

しかし、(私見)それは問題に対処するのではなく、問題を覆い隠しているので、私は本当にすべての割り当てをキャストしたくありません。

LINTなどのツールを使用すると、boolタイプを指定して、この種の誤検知を防ぐことができます... Eclipse/Taskingに相当するものが必要です


だから私の質問はこれです:

boolどこかにブール型のTASKINGを伝えるツールオプションがあるのではないかと思いますのでfalsetrue使用しても大丈夫ですか?

ある?

{MISRAのメリット(またはその他)について[このスレッドで]議論しないでください}

4

3 に答える 3

1

MISRA ルール 10.1 によると

(ルール 10.1) 整数型の式の値は、次の場合、暗黙的に別の基になる型に変換されてはなりません。

a) 同じ符号のより広い整数型への変換ではない、または

b) 式が複雑である、または

c) 式が定数ではなく、関数の引数である、または

d) 式が定数ではなく、戻り式である

#include <stdbool.h>

bool myFlag = false;

以下と同じです:

_Bool myFlag = 0;

0は、符号付き整数型ですint_Bool、符号なし整数型です。符号付きの型の値を符号なしの型の値に暗黙的に変換しているためa)、MISRA ルール 10.1 に違反しています。

MISRA-C:2004 を使用している場合 (MISRA-C:2012 はリリースされていないと思います)、公開時には C90 のみが考慮され_Bool、C99 の追加であることに注意してください。コメントに書いたように、次のようなキャストを使用して警告を取り除くことができます。

bool myFlag = (bool) false;

これがMISRAの美しさです。

于 2012-10-23T10:18:57.627 に答える
0

MISRA の機能を満足させる新しい値に定義する#undef trueことfalseができます。#include <stdbool.h>

このプラクティスは、C99 および C11 では廃止予定の機能として許可されています。

于 2012-11-01T17:55:06.517 に答える
0

それを回避する方法はないようですが、次のように bool を自分で定義できます。

typedef enum _bool { false = 0, true = 1 } bool;
bool x = false;

これは厳密なチェックに合格する必要があります。

于 2012-10-23T10:26:06.457 に答える