Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

MATLAB コード

himl_0004: コード生成に関する MATLAB コード アナライザーの推奨事項

ID: タイトルhiml_0004: コード生成に関する MATLAB® コード アナライザーの推奨事項
説明MATLAB コードを使用する場合:
Aコード生成の MATLAB コード アナライザー メッセージを有効にするには、MATLAB 外部関数で %#codegen 命令を使用します。
B

MATLAB コード アナライザー メッセージを確認します。次のどちらかを行います。

  • 推奨事項を実装します。

  • MATLAB 関数で %#ok<message-ID(S)> 命令を使用して、推奨事項に従わないことを正当化します。%#ok を使用する場合は、必ず特定のメッセージ ID を設定してください。

メモ:

MATLAB コード アナライザー メッセージは、コード内の潜在的なエラー、問題、改善の可能性などを示します。

根拠AMATLAB 外部関数で %#codegen 命令を使用すると、コード生成の MATLAB コード アナライザー メッセージが有効になります。
B
  • MATLAB コード アナライザーの推奨事項に従うと、次のような利点があります。

    • 効率的なコードを生成できる。

    • コード生成のベスト プラクティスに従うことができる。

    • コード生成でサポートされていない MATLAB 機能の使用を回避できる。

    • 安全性に影響する可能性があるコード パターンを回避できる。

  • MATLAB コード アナライザーの推奨事項に従わない場合は、メッセージ ID を指定して正当化します (%#ok<NOPRT> など)。

    MATLAB 関数でメッセージ ID を指定せずに %#ok を使用すると、行全体が正当化されて問題が隠される可能性があります。

モデル アドバイザー チェックCheck MATLAB Code Analyzer messages (Simulink Check)
参照
  • IEC 61508-3, Table A.3 (3) 'Language subset’
    IEC 61508-3, Table A.4 (3) 'Defensive programming’
    IEC 61508-3, Table A.4 (5) 'Design and coding standards'

  • IEC 62304, 5.5.3 - Software Unit acceptance criteria

  • ISO 26262-6, Table 1 (1b) 'Use of language subsets'
    ISO 26262-6, Table 1 (1d) 'Use of defensive implementation techniques'
    ISO 26262-6, Table 1 (1e) 'Use of well-trusted design principles'
    ISO 26262-6, Table 1 (1f) 'Use of unambiguous graphical representation'
    ISO 26262-6, Table 1 (1g) 'Use of style guides'
    ISO 26262-6, Table 1 (1h) 'Use of naming conventions'

  • EN 50128, Table A.4 (11) 'Language Subset'
    EN 50128, Table A.3 (1) 'Defensive Programming'
    EN 50128, Table A.12 (1) 'Coding Standard'
    EN 50128, Table A.12 (2) 'Coding Style Guide'

  • DO-331, Section MB.6.3.1.b 'Accuracy and consistency’
    DO-331, Section MB.6.3.2.b 'Accuracy and consistency’

参考

エラーと警告についてのコードのチェック

最終更新R2016a

推奨

  • コード生成に関する MATLAB コード アナライザー メッセージを有効化:

    %#codegen
      function y = function(u)
        y = inc_u(u));     
      end
      function yy = inc_u(uu)
        yy = uu + 1;
      end
    

  • ; の欠落と value assigned might be unused を正当化:

    y = 2*u %#ok<NOPRT,NAGSU> output for debugging
    ...
    y = 3*u;

  • 出力が目的どおりではなく、代入値が使用されていない場合は、行 y = 2*u ... を削除:

    y = 3*u;

非推奨

  • 外部の MATLAB ファイルを Simulink®%#codegen 命令を指定せずに使用:

    function y = function(u)
        % nested functions can't be used for code generation
        function yy = inc_u(uu)
          yy = uu + 1;
        end
        y = inc_u(u));     
      end
    

  • メッセージ ID を指定せずに %#ok を使用して行内のすべてのメッセージを正当化:

    % missing ';' and the value might be unused
      y = 2*u %#ok 
      …
      y = 3*u;
    

  • 正当化なし:

    % missing justification for missing ';' and unnecessary '[..]'
    y= [2*u]

himl_0006: MATLAB コードの if/elseif/else パターン

ID:タイトルhiml_0006: MATLAB コードの if/elseif/else パターン
説明

MATLAB コードで if / elseif/ else 構文を使用する場合は、少なくとも意味のあるコメントを含む else ステートメントで構文を終了します。最後の else ステートメントは、elseif がない場合は必要ありません。

根拠
  • 防御的プログラミング

  • 可読性

  • トレーサビリティ

モデル アドバイザー チェックCheck if/elseif/else patterns in MATLAB Function blocks (Simulink Check)
参照
  • IEC 61508-3, Table A.3 (3) 'Language subset’
    IEC 61508-3, Table A.4 (3) 'Defensive programming’

  • IEC 62304, 5.5.3 - Software Unit acceptance criteria

  • ISO 26262-6, Table 1(b) 'Use of language subsets'
    ISO 26262-6, Table 1(d) 'Use of defensive implementation techniques'

  • EN 50128, Table A.4 (11) 'Language Subset'
    EN 50128, Table A.3 (1) 'Defensive Programming'

  • DO-331, Section MB.6.3.1.e 'Conformance to standards'
    DO-331, Section MB.6.3.2.e 'Conformance to standards'
    DO-331, Section MB.6.3.3.e 'Conformance to standards'

参考
最終更新R2018b

推奨

  • if u > 0
        y = 1;
      end
    

  • if u > 0
        y = 1;
      elseif u < 0
        y = -1;
      else
        y = 0;
      end
    

  • y = 0;
      if u > 0
        y = 1;
      elseif u < 0
    y = -1;
      else
        % handled before if
      end
    

非推奨

  •   % empty else
      y = 0;
      if u > 0
        y = 1;
      elseif u < 0
        y = -1;
      else
      end
    

  •   % missing else
      y = 0;
      if u > 0
        y = 1;
      elseif u < 0
        y = -1;
      end
    

himl_0007: MATLAB コードの switch/case/otherwise パターン

ID: タイトルhiml_0007: MATLAB コードの switch/case/otherwise パターン
説明

MATLAB コードで switch ステートメントを使用する場合は、以下を含めます。

  • 少なくとも 2 つの case ステートメント

  • 少なくとも意味のあるコメントを含む otherwise ステートメント

メモ:

case ステートメントと otherwise ステートメントが 1 つずつしかない場合は、if / else ステートメントの使用を検討してください。

根拠
  • 防御的プログラミング

  • 可読性

  • トレーサビリティ

モデル アドバイザー チェックCheck switch statements in MATLAB Function blocks (Simulink Check)
参照
  • IEC 61508-3, Table A.3 (3) 'Language subset’
    IEC 61508-3, Table A.4 (3) 'Defensive programming’

  • IEC 62304, 5.5.3 - Software Unit acceptance criteria

  • ISO 26262-6, Table 1(b) 'Use of language subsets'
    ISO 26262-6, Table 1(d) 'Use of defensive implementation techniques'

  • EN 50128, Table A.4 (11) 'Language Subset'
    EN 50128, Table A.3 (1) 'Defensive Programming'

  • DO-331, Section MB.6.3.1.e 'Conformance to standards'
    DO-331, Section MB.6.3.2.e 'Conformance to standards'
    DO-331, Section MB.6.3.3.e 'Conformance to standards'

  • MISRA C:2012, Rule 16.4

参考
最終更新R2018b

推奨

  • switch u
        case 1
          y = 3;
        case 3
          y = 1;
        otherwise
          y = 1;
      end
    

  • y = 0;
      switch u
        case 1
          y = 3;
        case 3
          y = 1;
        otherwise
          % handled before switch
      end
    

非推奨

  •   % no case statements
      switch u
        otherwise
          y = 1;
      end
    

  •   % empty otherwise statement
      switch u
        case 1
          y = 3;
        case 3
          y = 1;
        otherwise
      end
    

  •   % no otherwise statement
      switch u
        case 1
          y = 3;
      end
    

himl_0008: MATLAB コードの関係演算子のデータ型

ID: タイトルhiml_0008: MATLAB コードの関係演算子のデータ型
説明

MATLAB コードで関係演算子を使用する場合は、左右のオペランドで同じデータ型を使用します。

メモ:2 つのオペランドのデータ型が異なる場合、MATLAB は両方のオペランドを共通のデータ型にプロモートします。これにより、予期しない結果が生じることがあります。
根拠
  • 暗黙的なキャストの防止

  • 予期しない結果の防止

モデル アドバイザー チェックCheck usage of relational operators in MATLAB Function blocks (Simulink Check)
参照
  • DO-331, Section MB.6.3.1.g 'Algorithms are accurate'
    DO-331, Section MB.6.3.2.g 'Algorithms are accurate'

  • IEC 61508-3, Table A.3 (2) 'Strongly typed programming language’
    IEC 61508-3, Table A.3 (3) 'Language subset’

  • IEC 62304, 5.5.3 - Software Unit acceptance criteria

  • ISO 26262-6, Table 1(b) 'Use of language subsets'
    ISO 26262-6, Table 1(c) 'Enforcement of strong typing'

  • EN 50128, Table A.4 (8) 'Strongly Typed Programming Language'
    EN 50128, Table A.4 (11) 'Language Subset'

参考
最終更新R2018b

推奨

  • myBool == true
    myInt8 == int8(1) 
    

非推奨

  • myBool == 1
    myInt8 == true
    myInt8 == 1
    myInt8 == int16(1)
    myEnum1.EnumVal == int32(1)
    

himl_0009: MATLAB コードでの equal/not equal 関係演算子の使用

ID: タイトルhiml_0009: MATLAB コードでの equal/not equal 関係演算子の使用
説明

MATLAB コードで equal または not equal 関係演算子を使用する場合は、次のデータ型を使用しないでください。

  • single

  • double

  • single または double データ型から派生した型

メモ:

以下のコード フラグメントについて考えます。

  1. sqrt(2)^2 == 2

  2. sqrt(2^2) == 2

数学的には、どちらのフラグメントも true です。ただし、浮動小数点の丸め効果により、結果は以下のようになります。

  1. false

  2. true

根拠
  • 予期しない結果の防止

モデル アドバイザー チェックCheck usage of equality operators in MATLAB Function blocks (Simulink Check)
参照
  • DO-331, Section MB.6.3.1.g 'Algorithms are accurate’
    EN 50128, MB.6.3.2.g ' 'Defensive Programming'

  • IEC 61508-3, Table A.3 (3) 'Language subset’
    IEC 61508-3, Table A.4 (3) 'Defensive programming’

  • IEC 62304, 5.5.3 - Software Unit acceptance criteria

  • ISO 26262-6, Table 1 (1b) 'Use of language subsets'
    ISO 26262-6, Table 1 (1d) 'Use of defensive implementation techniques'

  • EN 50128, Table A.4 (11) 'Language Subset'
    EN 50128, Table A.3 (1) 'Defensive Programming'

  • MISRA C:2012, Dir 1.1

参考
最終更新R2018b

推奨

  • myDouble >= 0.99 && myDouble <= 1.01; % test range

非推奨

  • myDouble == 1.0
    mySingle ~= 15.0
    

himl_0010: MATLAB コードでの論理演算子と論理関数の使用

ID: タイトルhiml_0010: MATLAB コードでの論理演算子と論理関数の使用
説明

MATLAB コードで論理演算子と論理関数を使用する場合は、論理データ型を使用します。

メモ:

論理演算子: &&||~

論理関数: andornotxor

根拠
  • 予期しない結果の防止

モデル アドバイザー チェックCheck usage of logical operators and functions in MATLAB Function blocks (Simulink Check)
参照
  • IEC 61508-3, Table A.3 (2) 'Strongly typed programming language’
    IEC 61508-3, Table A.3 (3) 'Language subset’

  • IEC 62304, 5.5.3 - Software Unit acceptance criteria

  • ISO 26262-6, Table 1(b) 'Use of language subsets'
    ISO 26262-6, Table 1(c) 'Enforcement of strong typing'

  • EN 50128, Table A.4 (8) 'Strongly Typed Programming Language'
    EN 50128, Table A.4 (11) 'Language Subset'

  • DO-331, Section MB.6.3.1.g 'Algorithms are accurate'
    DO-331, Section MB.6.3.2.g 'Algorithms are accurate'

最終更新R2018b

推奨

  • ~myLogical
    (myInt8 > int8(4)) && myLogical
    xor(myLogical1,myLogical2)
    

非推奨

  • ~myInt8
    myInt8 && myDouble