メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C:2012 Dir 4.3

Assembly language shall be encapsulated and isolated

説明

命令の定義

Assembly language shall be encapsulated and isolated 1 .

根拠

アセンブリ言語のカプセル化は以下の理由で利点があります。

  • C ソース ファイル内でアセンブリ命令をカプセル化すると、C とアセンブリ間の境界が明確に示され、コードの可読性が向上。

  • カプセル化したマクロや関数の名前とドキュメンテーションによるアセンブリ言語の目的の明確化。

  • 特定の目的に対するアセンブリ言語のすべての使用によりカプセル化の共有を可能にし、保守性が向上。

  • 異なるターゲットや静的解析の目的に対しアセンブリ言語の代用が容易。

Polyspace 実装

アセンブリ言語コードがカプセル化せずに使用されている場合、Polyspace® はこのルールの違反を報告します。次のようにアセンブリ コードがカプセル化されている場合は違反になりません。

  • アセンブリ言語関数。次のコードについて考えます。

    asm int h(int tt)  //Compliant            
    { 
      % reg val;                   
      mtmsr val;                  
      return 3;                   
    }; 
    
    void f(void) { 
      int x; 
      x = h(3);                    
    }
    関数 h() は、アセンブリ コードをカプセル化する関数 asm として宣言されています。Polyspace は違反を報告しません。

  • #pragma 命令。たとえば、このコードでは次のようになります。

    #pragma inline_asm(h)
    int h(int tt)  //Compliant            
    { 
      % reg val;                   
      mtmsr val;                  
      return 3;                   
    }; 
    
    void f(void) { 
      int x; 
      x = h(3);                    
    }
    #inline_asm プラグマは、関数 h() をアセンブリ言語関数として指定します。Polyspace は違反を報告しません。

  • マクロ。次に例を示します。

    #define FUNC_H\
    asm\
    {\
     % reg val; \                  
      mtmsr val;\                  
      return 3; \                  
    }; \
    
    void f(void) { 
      int x; 
      x = FUNC_H(3);                    
    } 
    マクロ FUNC_H はアセンブリ コードをカプセル化します。Polyspace は違反を報告しません。Polyspace 解析中にコマンド ラインでオプション [プリプロセッサ定義] (-D) を使用して、このようなマクロを定義することもできます。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

enum boolVal {TRUE, FALSE};
enum boolVal isTaskActive;
void taskHandler(void);

void taskHandler(void) { 
    isTaskActive = FALSE; 
    // Software interrupt for task switching 
    asm volatile   /* Non-compliant */
    ( 
        "SWI &02"     /* Service #1: calculate run-time */ 
    ); 
    return; 
} 

この例では、他の C 言語ステートメントを含む C 関数 taskHandler にアセンブリ言語コードが直接組み込まれているため、ルールに違反します。

修正 - マクロでアセンブリ コードをカプセル化する

1 つの修正方法として、マクロでアセンブリ言語コードをカプセル化し、そのマクロを関数 taskHandler で呼び出します。

#define  RUN_TIME_CALC \
asm volatile \
    ( \
        "SWI &02"     /* Service #1: calculate run-Time */ \
    )\

enum boolVal {TRUE, FALSE};
enum boolVal isTaskActive;
void taskHandler(void);

void taskHandler(void) {
    isTaskActive = FALSE;
    RUN_TIME_CALC;
    return;
}

チェック情報

グループ: Code design
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2014b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.