2016-12-20 4 views
0

は車載用エンベデッド開発では比較的初心者ですが、現在私は特定のアドレスに初期化する必要があるポインタに問題があります。マイクロコントローラのC言語の作成時に配列のポイント付きアドレスを初期化する

私のコードはMISRA-C 2004に準拠していなければなりませんので、私は宣言でこのポインタを初期化したいと思います。新しいメモリを割り当てずに使用しますが、使用しないでくださいポインタ算術 "MISRAエラー、私は配列として宣言する必要があります。

は、私はあなたに明確化のために私の現在のコードをお見せしましょう:

static uint8* MemoryCursor_p = FIRST_ADDRESS_POINTED_BY_CURSOR; 
/* Some cool stuff happens here*/ 
MemoryCursor_p = &(MemoryCursor_p [1]); /* Moving the cursor one byte forward in memory*/ 

これはMemoryCursor_pは配列として定義されていないようMISRAは、エラーをトリガするためにチェックする原因となるが、ポインタとして。しかし、配列として宣言すると、尖った値を定義するように要求されますが、代わりに宣言に指定したアドレスを設定したいと思います。もちろん

、私はちょうどしようとした場合:

MemoryCursor_p += 1ul; 

私はポインタ演算を使用するためのMISRAに叱ら取得しています。

私はMISRA違反をコミットしないようにしたいと思います。誰かが私に進める方法を教えてもらえますか?

これらのビットについての説明と同じように、これはメモリ上のチェックサムを実行する単純なCRC16アルゴリズムの実装の一部です。

ありがとうございます!

+0

最初のアドレスへのポインタを保持する 'const'変数を宣言できず、位置計算に別の整数インデックス変数を使用できませんか?そうすれば、配列要素のアドレスを取る必要はありません。 – user694733

+0

IDE(IAR)で定義された変数を使用します。これらの変数は、メモリセクションの先頭と末尾に対応する2つのuint8変数です。私はそれを何とかこのように呼び出す必要はないでしょう:(&MemoryRangeStart)[i]?これはちょっと違って見えますが、実際には、私はそれを早期に考えていました。提案していただきありがとうございます!:) – Domack

+0

私はアドレス演算子を完全にスキップすることを考えていました、 'int currentValue = MemoryRangeStart [i];'のようなものです。 – user694733

答えて

4

静的アナライザーの警告に盲目的に従わずに、盲目的にMISRAに従うべきではありません。

MISRA-C:2004の上記ルール17.4は意味をなさない。 x[i]の代わりに*(x + i)を使用するのを防ぐのは間違った試みでした。しかし、規則に規定された範囲外のエラーに関する理論的根拠は意味を持たず、*(x + i)フォームがなぜ安全性が低いのかについては誰も論じることができませんでした。

このルールは、MISRA-C:2012で置き換えられました。私の意見では、正しいアプローチは、全社的なルールからの逸脱を作り出すことです。 17.4に関連するすべての警告をブロックする。

いずれの場合でも、怪しげな、わかりにくい構文を使用してルールをかわすことはできません。 MemoryCursor_p++が正しいと最も明白なフォームは、それを使用してください。または、カウンタ変数iを使用し、配列項目番号iにアクセスしてください。いずれのフォームでも問題ありません。

+0

よろしくお願いいたします。私の上司にこのことを示すことができる参考資料はありますか?私はMISRAフォーラムであなたのメッセージ(約8年前)を見つけましたが、より公式に見えるものを探したいと思います。 – Domack

+1

非公開2012ドラフトから: "アドバイザリへのダウングレード。リラクゼーションでは、++とポインタを使用できます。" MISRA-C:2012(18.4)の新しい規則を参照するだけでよい場合もあります。 – Lundin

+0

もう一度、ありがとう。 :)誰かがMISRA-C:2012を持っているかどうかを調べるつもりです。 – Domack

0

@Domack - MISRA-C:2004の「Deviations ...」ブックの前部に全体セクションがあり、あなたが望むならば同様に適用可能な全書籍(MISRA C Compliance)が利用可能になりました! 2012年の変更を引用して偏差を上げることが最良の選択肢だと私は同意します

関連する問題