メインコンテンツ

MISRA C 準拠における逸脱の根拠

生成されたコードで MISRA C:2012 ガイドラインに準拠していないインスタンスは、MISRA C:2012 準拠の概要表で逸脱としてマークされています。MISRA C:2012 ガイドラインの Section 5.4 に従い、逸脱に関する情報には以下が含まれます。

  • 逸脱しているガイドライン

  • 逸脱が許可される状況

  • リスク評価を含む、逸脱の正当化

  • 安全がどのように確保されるかの実証

  • 非準拠によって生じる可能性のある影響

MISRA C:2012 の命令およびルールに対する逸脱には、以下が含まれます。

MISRA C:2012 Directive 4.7 の逸脱の根拠

命令の定義

If a function returns error information, then that error information shall be tested.

根拠

メモ

この命令は、AUTOSAR ベースのコード生成ターゲットが使用されている場合にのみ違反となります。

関数呼び出しが失敗した操作を示す情報を提供する場合、呼び出し側プログラムは、関数から戻ったときにエラーを示すものがないかチェックする必要があります。関数呼び出しは、標準ライブラリ内の呼び出しに限定されません。

説明

Rte_Write_... などの AUTOSAR 送信側インターフェイス関数呼び出しの戻り値の型は Std_ReturnType であり、値の書き込みが成功したかどうかを示します。対応する Simulink パターンは、AUTOSAR 送信側インターフェイスとして構成された最上位の出力端子です。

モデル例

AUTOSAR 構成

生成されたコードの例

サンプル コードで、 Rte_Write_OUT_DE1_OUT_DE1(rtb_TmpSignalConversionAtIN_DE1); 内での AUTOSAR 関数呼び出し Rte_Write_... の使用に注目してください。

void Runnable_Step(void)
{
  /* local block i/o variables */
  real_T rtb_TmpSignalConversionAtIN_DE1;
  …
  rtb_TmpSignalConversionAtIN_D_l = Rte_Read_IN_DE1_IN_DE1
    (&rtb_TmpSignalConversionAtIN_DE1);
  …
  if (rtb_TmpSignalConversionAtIN_D_l > 0) {
    …
    Rte_Write_OUT_DE1_OUT_DE1(rtb_TmpSignalConversionAtIN_DE1);
  }
  …
}

正当化

Rte_Write_... 関数呼び出しの失敗は通常、受信側で処理されます。関数呼び出しの戻り値には、考えられるすべてのエラーが常に含まれているとは限らないからです。

逸脱が要求される条件

この逸脱は、AUTOSAR 送信側端子のすべてのインスタンスに対して要求されます。

非準拠による影響

送信側操作が失敗したとき、呼び出し側プログラムでは対応できません。

レポートを制御するためのアクション

コードの Polyspace® 解析によって既知のコーディング ルール違反または許容可能なコーディング ルール違反が見つかった場合、Outport ブロックにコード注釈を追加 (Polyspace Bug Finder)することで、以降の解析でその違反を非表示にすることができます。以降の解析では、Polyspace は、注釈によって正当化された結果を [結果のリスト] ペインで非表示にします。コーディング ルール違反を確認するには、Filter and Sort Results in Polyspace Platform User Interface (Polyspace Bug Finder)を参照してください。

MISRA C:2004 違反に対する注釈が既に提供されている場合、MISRA C:2012 違反についてコードをチェックすると、Polyspace は該当する正当化をインポートします。詳細については、以前の標準から新しい標準への正当化のインポート (Polyspace Bug Finder)を参照してください。

詳細については、以下を参照してください。

MISRA C:2012 Rule 13.5 の逸脱の根拠

ルールの定義

The right hand operand of a logical && or || operator shall not contain persistent side effects.

根拠

&& 演算子および || 演算子の右辺のオペランドの永続的な副作用は、左辺のオペランドに応じて発生する可能性があり、これはプログラマーの予期に反します。

メモ

"永続的な副作用" という用語は、『MISRA C:2012 Guidelines for the Use of C Language in Critical Systems』ドキュメントの「Appendix J: Glossary」で定義されています。

説明

AND または OR の演算として構成された Logical Operator ブロックへの 2 番目の入力として、数学演算が使用されています。

モデル例

生成されたコードの例

サンプル コードで、Y1 = (U1 && (sqrt(U2) <= 3.0)); 内でのオペランド && の使用に注目してください。

/* Exported block signals */
boolean_T U1;                /* '<Root>/U1' */
real_T U2;                   /* '<Root>/U2' */
boolean_T Y1;                /* '<Root>/Logical Operator' */

/* Model step function */
void DEV_R1305_01main_step(void)
{
  /* Logic: '<Root>/Logical Operator' incorporates:
   *  Constant: '<S1>/Constant'
   *  Inport: '<Root>/U1'
   *  Inport: '<Root>/U2'
   *  RelationalOperator: '<S1>/Compare'
   *  Sqrt: '<Root>/Sqrt'
   */
  Y1 = (U1 && (sqrt(U2) <= 3.0));
}

正当化

一部の標準数学関数には、C90 標準または C99 標準で定義されているように、グローバルな errno 変数を変更する少なくとも 1 つの永続的な副作用があります。Embedded Coder® では errno 変数が使用されないため、2 番目のオペランドは永続的な副作用をもたないものとして扱うことができます。

メモ

Polyspace Bug Finder™ は、ソース コードが利用できないすべての関数を、潜在的に副作用をもつものとして扱います。

逸脱が要求される条件

この逸脱は、&& 演算子および || 演算子の右辺の引数として使用される標準数学関数のすべての呼び出しに対して要求されます。

非準拠による影響

この逸脱記録に記載されている状況において、MISRA C:2012 Rule 13.5 に対する非準拠による影響はありません。この逸脱によって生じる追加の検証と妥当性確認の要件はありません。

レポートを制御するためのアクション

コードの Polyspace 解析によって既知のコーディング ルール違反または許容可能なコーディング ルール違反が見つかった場合、Logical Operator ブロックにコード注釈を追加 (Polyspace Bug Finder)することで、以降の解析でその違反を非表示にすることができます。以降の解析では、Polyspace は、注釈によって正当化された結果を [結果のリスト] ペインで非表示にします。コーディング ルール違反を確認するには、Filter and Sort Results in Polyspace Platform User Interface (Polyspace Bug Finder)を参照してください。

MISRA C:2004 違反に対する注釈が既に提供されている場合、MISRA C:2012 違反についてコードをチェックすると、Polyspace は該当する正当化をインポートします。詳細については、以前の標準から新しい標準への正当化のインポート (Polyspace Bug Finder)を参照してください。

詳細については、MISRA C:2012 準拠の概要表を参照してください。