問題タブ [misra]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - ファームウェアのビット操作に関する MISRA C エラー/警告を削除するにはどうすればよいですか?
Code Composer Studioで MISRA C 2004 標準を使用しています。ペリフェラルの初期化中に、ビット演算に関して常にエラーが発生します。
コンパイラの .h ファイルでは、次のように定義されています。
今私のコードで、私が使用する場合
MISRA C は次のエラーを表示します。
ビット単位の演算子は、基になる型が符号付きのオペランドには適用されません - #1393-D (MISRA-C:2004 10.1/R)
整数型の式の値は、同じ符号の整数型への変換でない場合、別の基になる型に暗黙的に変換されません。
コンパイラの .h ファイルを変更したくありません。また、これらの警告を根絶したいと考えています。
c - 整数型はどのように暗黙的に変換されますか?
次のコードは、MISRAチェックで失敗します。具体的なエラーメッセージは次のとおりです。
(MISRA-C:2004 10.1 / R)整数型の式の値は、同じ符号のより広い整数型への変換でない場合、別の基になる型に暗黙的に変換されてはなりません。
- なぜ論理式が変換されるのですか?
- ここで何が変換されますか?
One
スワップして、コードがMISRAチェックに合格するのはなぜMyVariable
ですか?
編集:コンパイラはTI「MSP430C / C ++コンパイラv4.0.0」であり、MISRAルールチェックが含まれています。
c - MISRA 違反ルール 10.1 と列挙型
まず、これは次のようなものです:整数型は暗黙的にどのように変換されますか? しかし、別の MISRA 警告が表示されます。
コンパイラは MISRA エラーを生成しませんが、静的解析ツールは生成します。進行中の工具メーカーとのチケットがあります。
与えられた:
if
静的分析ツールは、次のステートメントに対して MISRA 違反を生成しています。
コンパイラは正しいですか (欠陥を特定していません)、それとも静的解析ツールですか?
c - MISRA C:2004で「続行」がC違反と見なされるのはなぜですか?
MISRA 14.5は、continueステートメントを使用してはならないと述べています。誰かが理由を説明できますか?ありがとうございました。
c - 戻り値を定数へのポインタにすることはできますか
2 つの「モジュール」があるとします。たとえば、RS-232 ポートのハードウェア インターフェイス レイヤーと、それをより抽象化するためのその上のレイヤー。
次のような受信バッファがありますU8BIT myBuffer[MAX]
。U8BIT
型定義されています:typedef unsigned char
ただし、受信できるメッセージには 2 種類あります。1 つはヘッダーがあり、もう 1 つはヘッダーがありません。このロジックはすでに書かれています。
「上のレイヤー」はこのバッファーにアクセスしますが、これがヘッダーまたはヘッダーなしのメッセージであるかどうかを認識していません。
したがって、次のような関数があります。
この関数を呼び出す関数が、返されたポインタの内容を変更できないようにするにはどうすればよいですか?
はい、私はそれが常に可能であることを知っています。そして、他の人がそれを変更しようとするのを難しくしようとしないでください. を変更しようとするとコンパイラが文句を言うので、間違いを犯しにくくなるように「不可能」にしたいのですconst
。
次のように関数を宣言できますか。const U8BIT * fooBuffer(U8BIT * maxLength)
c - 関数内の配列パラメーターからファイル スコープ内の配列へのポインターを格納する
MISRA ルールに準拠するようにアプリケーションを再構築し、QA-C を使用してコードを分析しています。
これらの煩わしいルールの 1 つに、ポインターと配列が関係しています。あなたは言うことができません:
また、次のこともできません。
私の問題には、2 つの関数とファイル スコープ変数が含まれます。
元々、このコードは次のことを行いました (ビット疑似コードのように):
私はそれを次のように書き直そうとしました:
しかし、その後、misra と私のコンパイラ (softune、富士通) の両方が文句を言います。コンパイラは次のように述べています。
CHAR **' to
CHAR (*)[]': 演算子 `='からの互換性のないポインタ型の代入
ミスラ 言います:
[C] 代入の右オペランドが互換性のあるポインター型ではありません。リンケージまたはより広いスコープを持つポインターにエクスポートされた自動オブジェクトのアドレス。
ただし、foo_c 関数で配列にインデックスを付けることができる必要があります。または、ミスラに従って、私のコードを機能させる他の方法はありますか。
同じファイルで次のことを行うと:
その後、ミスラも私のコンパイラも何も文句を言いません。
c - MISRA ルールで「#undef」の使用が禁止されているのはなぜですか?
#undef
MISRA 規則で、プログラムでの使用が禁止されているのはなぜですか? マクロの範囲を制限したい場合、使用せずにそれを行うにはどうすればよい#undef
ですか?
c - MISRAに関して、Cの組合についての考え
ミスラはすべての組合を禁止すると言っている。また、徹底的に議論され文書化されている限り、逸脱は許容されることも知っています。
統計データ(イベント/エラーログ、パラメーター設定など)を保存するためのマイクロコントローラーと外部EEPROMがあります。
イベントログは、約80以上のイベントカウンターで構成され、一部は8、16、および32ビット(すべて署名なし)です。パラメータストレージは約200個のパラメータで構成され、8、16、および32ビット値(符号なし)と混合されます。
すべてのコードをMISRAに準拠するように書き直しています。これらの値は以前に定義されていたため、次のようになります。
現在、これは実際にはMISRAに準拠していません。パラメータログについても同様です。ただし、これはeepromからの読み取りと書き込みを行う最も簡単な方法です。これは、eepromから読み取り/書き込みを行うには、配列を介して読み取り/書き込みを行う必要があるためです。
他にも、破ることが許されていないルールがいくつかあります。グローバル(外部)変数はありません(ヘッダーファイルを介して)。すべてのローカル変数は、必要に応じて、get/set関数を介してのみアクセスする必要があります。
これは、これらすべてのパラメーターを完全に書き出す必要がある場合、アプリケーション全体でそれらを変更するために、それぞれが独自のget/set関数を取得する必要があることを意味します。
私が考えた解決策の1つは次のとおりでした:
ただし、値が追加または削除された場合、これは面倒なリファクタリングを引き起こします。また、特定のタイプ(センサーなど)を多かれ少なかれ使用する場合、長さの定義によって変更できる配列型の値を使用できない(いくつかあります)ことも意味します。
この特定の問題についてどう思いますか。この特定のケースでMISRA標準からの逸脱を文書化し、この特定の場所でのみこの逸脱を使用する方がよいでしょうか、それともこの問題に対するより良い解決策がありますか?
c - Cでの汎整数拡張とバランシングの違いは何ですか?
汎整数拡張とバランシングの違いは何ですか。演算(論理演算子&&、||、!を除く)を実行する前に、任意の型が少なくともint型またはunsigned int型に変換され、オペランドのいずれかがより大きい型の場合はより大きな型に変換されるということで、両方のルールを要約できますか? intより?
c - VXに伝える-ブール値でその「bool」をタスクしますか?
Tasking VXツールセット(Eclipse上に構築)を使用していますが、かなり基本的ですが根本的な問題があり、回避できません... RTFMを実行しましたが、まだまったく賢明ではありません。
単純なコードスニペットを想像してみてください。
MISRA-Cチェックを有効にすると、次のようになります。
EclipseはC99実装としてセットアップされ、標準ライブラリ定義に従って、次のstdbool.h
ように定義されます。
このエラーは#define false 0
、ツールが暗黙的にブール値に変換しているためだと思いますか?
注:割り当てをキャストすると、エラーは削除されます。
しかし、(私見)それは問題に対処するのではなく、問題を覆い隠しているので、私は本当にすべての割り当てをキャストしたくありません。
LINTなどのツールを使用すると、boolタイプを指定して、この種の誤検知を防ぐことができます... Eclipse/Taskingに相当するものが必要です
だから私の質問はこれです:
bool
どこかにブール型のTASKINGを伝えるツールオプションがあるのではないかと思いますのでfalse
、true
使用しても大丈夫ですか?
ある?
{MISRAのメリット(またはその他)について[このスレッドで]議論しないでください}