メインコンテンツ

AUTOSAR 仕様に非準拠

RTE API 関数が、AUTOSAR 規格仕様に違反する引数を指定して使用されている

R2021a 以降

説明

このチェックでは、RTE API 関数への引数が AUTOSAR 規格仕様に違反しているかどうかを判別します。

たとえば、Rte_Write_* または Rte_Byps_Write_* 関数呼び出しに対するチェックでは、呼び出しにおけるデータへのポインター引数が次の条件を満たすかどうかを判別します。

  • NULL 値である。

  • メモリ バッファーを指している。

  • 初期化済みメモリ バッファーを指している。

  • enum 値を含むバッファーの場合、値が enum 値の範囲内である。

RTE API 仕様の詳細については、AUTOSAR のドキュメンテーション (RTE ソフトウェアの仕様) を参照してください。

このチェックを有効にするには、オプション [使用するライブラリ] (-library) に値 autosar を使用します。

このチェックではチェック AUTOSAR のランタイム環境関数の無効な使用 で検出される問題のサブセットを検出します。このチェックの設定で ARXML 形式の設計制約を指定する要件はないため、このチェックでは他のチェックで検出される制約違反を検出できません。Polyspace で AUTOSAR コードのコンポーネント ベースの解析と統合解析のどちらかを選択するも参照してください。

このチェックの診断

このチェックを診断するには、[結果の詳細] ペインのメッセージを確認します。メッセージには、RTE API 関数に実行されたすべてのチェックが、チェックにパスしたかどうかに関する情報と共に表示されます。例として、次のメッセージを考えます。

3 つのチェックの結果が表示されます。それらのチェックのうち 1 つのみが潜在的な問題を示しています。関数の最初の引数が初期化済みメモリを指していない可能性があります。

問題の根本原因をさらに調査します。

すべて展開する

#include <stdlib.h>

// Type declarations that are typically in AUTOSAR header Rte_type.h
typedef unsigned char uint8_T;
typedef unsigned int uint32_T;
typedef uint8_T Std_ReturnType;

typedef struct {
    uint8_T color;
    uint32_T number;
}
colorNumber;

extern Std_ReturnType Rte_Byps_Write_out_colorNumber_1(colorNumber*);

void SendData() {
    colorNumber aColor;
    uint8_T copyColor;
    uint32_T copyNumber;
    
    colorNumber* aPtrColor = &aColor;
    Rte_Byps_Write_out_colorNumber_1(aPtrColor);          
    
    copyColor = aColor.color;
    copyNumber = aColor.number;
}

この例では、関数 Rte_Byps_Write_out_colorNumber_1 は未初期化変数へのポインターを取っています。この関数に対するチェックはレッドで、明確な問題を示しています。

チェック メッセージには、次のように出力されます。

  • ポインターが NULL 値を持つことはできません。

  • ポインターは割り当てられたバッファーです。

  • 指しているバッファーが初期化されていません。

構成されるチェックのうちの 3 番目が明確なエラーを示しているため、チェックはレッドです。

#include <stdlib.h>

// Type declarations that are typically in AUTOSAR header Rte_type.h
typedef unsigned char uint8_T;
typedef unsigned int uint32_T;
typedef uint8_T Std_ReturnType;

typedef struct {
    uint8_T color;
    uint32_T number;
}
colorNumber;
extern Std_ReturnType Rte_Byps_Write_out_colorNumber_2(colorNumber*);

void SendData() {
    colorNumber* arrayColorNumber = (colorNumber*) malloc(2*sizeof(colorNumber));
    uint8_T copyColor;
    uint32_T copyNumber;
    
    Rte_Byps_Write_out_colorNumber_2(arrayColorNumber);   
    
    copyColor = arrayColorNumber[0].color;   
    copyNumber = arrayColorNumber[0].number;      
}

この例では、関数 Rte_Byps_Write_out_colorNumber_2malloc でのメモリ割り当てから返されたポインターを取っています。この関数に対するチェックはレッドで、明確な問題を示しています。

チェック メッセージには、次の点が示されます。

  • ポインターが NULL 値を持つ可能性があります。

  • ポインター値が NULL ではない場合、ポインターはバッファーに割り当てられます。

  • ポインター値が NULL ではなく、ポインターがバッファーを指している場合、バッファーは初期化されていません。

構成されるチェックのうちの 3 番目が明確なエラーを示しているため、チェックはレッドです。

#include <stdlib.h>

// Type declarations that are typically in AUTOSAR header Rte_type.h
typedef unsigned char uint8_T;
typedef unsigned int uint32_T;
typedef uint8_T Std_ReturnType;

typedef struct {
    uint8_T color;
    uint32_T number;
}
colorNumber;
extern Std_ReturnType Rte_Byps_Write_out_colorNumber_2(colorNumber*);

void SendData(uint8_T hasInitialData, colorNumber* initialColorData) {
    colorNumber arrayColorNumber[2];
    uint8_T copyColor;
    uint32_T copyNumber;
    
    if(hasInitialData == 1) {
        for(uint8_T i = 0; i < 2; i++) {
            arrayColorNumber[i].color = initialColorData[i].color;
            arrayColorNumber[i].number = initialColorData[i].number;
        }
    }
    else if (hasInitialData == 0){
        for(uint8_T i = 0; i < 2; i++) {
            arrayColorNumber[i].color = 0;
            arrayColorNumber[i].number = 0;
        }
    }
    
    Rte_Byps_Write_out_colorNumber_2(arrayColorNumber);   
   
}

この例では、関数 Rte_Byps_Write_out_colorNumber_2 は初期化されていない可能性があるバッファーへのポインターを取っています。この関数に対するチェックはオレンジで、潜在的エラーを示しています。たとえば、特定の実行パスでのみ発生するエラーです。これが表示されるのは、if-else if-else ステートメントに catch-all else 句が欠落しており、0 でも 1 でもない hasInitialData の値用にバッファー arrayColorNumber が初期化されていないためです。

チェック メッセージには、次の点が示されます。

  • ポインターが NULL 値を持つことはできません。

  • ポインターは割り当てられたバッファーです。

  • バッファーは初期化されない可能性があります。

構成されるチェックのうちの 3 番目が潜在的エラーを示しているので、チェックはオレンジです。

チェック情報

グループ: Other
言語: C | C++
既定値: オプション [使用するライブラリ] (-library) に値 autosar を使用する場合はオン、その他の場合はオフ
コマンド ライン構文: autosar_compliance

バージョン履歴

R2021a で導入