2

を次のように定義しNULL_PTRます0U

NULL_PTR次に、これを引数として関数を呼び出します。

read_some_data(2U, (uint8_t *const) NULL_PTR, (uint8_t *const) NULL_PTR);

呼び出された関数プロトタイプ:

int16_t read_some_data(const uint8_t id,   uint8_t *const data_1, uint8_t *const data_2);

コンパイル時に、Misra はルール 11.3 違反エラーを発生させました (ポインター型と整数型の間でキャストを実行しないでください)。

しかし、次のように渡せばNULL_PTR違反にはなりません。

read_some_data(2U, NULL_PTR, NULL_PTR);

どちらがより良い方法ですか?Misra 11.3 ルールを抑制しますか、NULL_PTRそれともキャストせずにそのまま渡しますか?

4

4 に答える 4

3

標準の「NULL」の何が問題になっていますか?

于 2011-03-28T12:22:00.810 に答える
2

回避できるなら、なぜキャストするのですか?キャストは常にコードを少し汚いものにし、ハッキングが実行されていることをほのめかします。

したがって、キャストせずに NULL_PTR を渡すだけです。2 番目のパラメーターとして NULL_PTR を受け入れることができる関数仕様を確認した後!!!

于 2011-03-28T12:11:58.500 に答える
1

コンパイル時に、Misra はルール 11.3 違反エラーを発生させました。

念のために言うと、MISRA は違反エラーを発生させませんでした。コンパイラは MISRA C:2004 ルール違反エラーを発生させました。

あなたが投稿した内容から、報告された違反が正しいとは確信できません...

一方、個人的には、(厳密に言えば) 0 はポインターではないため、と定義NULL_PTRします。(void *)0u

--

MISRA C:2004 の場合、ルール 11.3 は勧告であり、推奨事項を提供しています... ルールはまた、この状況は避けられない可能性があると述べています。そのため、違反は (正当な理由があれば) 無視される場合があります。MISRA コンプライアンスを適用する場合、ルールが適用されない場合があります。

または、新しいバージョンの同等のガイドラインである MISRA C:2012 ルール 11.4 には、null ポインター定数の明示的な例外があります。

于 2012-09-27T09:42:16.747 に答える
1

NULL を定義する IAR 内部構成ファイル yvals.h の使用を避けるために、ヘッダー ファイルで NULL_PTR を使用しました。しかし、他の理由で後で yvals.h を使用する必要があるかもしれないので、それは問題ではありません。

NULL を使用するか NULL_PTR を使用するかにかかわらず、一般的なコンセンサスは、キャストせずに NULL を渡すことだと思います。私の機能はそれを受け入れることに問題はありません。このようにして、Misra 11.3 ルールの抑制を回避できます。

私が正しい道を進んでいることを願っています。

于 2011-03-29T02:59:10.503 に答える