メインコンテンツ

AUTOSAR 仕様に非準拠

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

R2021a 以降

説明

この欠陥は、RTE API 関数が、AUTOSAR 規格仕様に違反する引数を指定して使用されている場合に発生します。

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

  • NULL 値である。

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

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

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

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

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

Code Prover では、同じチェッカーのより徹底的なバージョンを使用できます。関数 Rte_ の呼び出しで AUTOSAR 規格違反の有無をチェックするときに、Code Prover チェッカーは、関数呼び出しにつながる "すべて" の実行パスを考慮します (検証の前提条件による)。

リスク

RTE 関数の使用法がランタイム エラーにつながる可能性があります。

修正方法

修正方法は欠陥の根本原因によって異なります。このチェックを診断するには、[結果の詳細] ペインのメッセージを確認します。メッセージには、RTE API 関数に実行されたすべてのチェックが、チェックにパスしたかどうかに関する情報と共に表示されます。例として、次のメッセージを考えます。

3 つのチェックの結果が表示され、3 つすべてのチェックが失敗する可能性があります。関数の最初の引数が NULL ポインターである可能性、割り当てられない可能性、および初期化済みメモリを指していない可能性があります。

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

すべて展開する

#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 は未初期化変数へのポインターを取っています。ポインターが初期化済みメモリを指していないため、チェッカーはこの関数呼び出しにフラグを設定します。この例を実行するには、オプション -library autosar を使用します。

#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 でのメモリ割り当てから返されたポインターを取っています。ポインターが初期化済みメモリを指していないため、チェッカーはこの関数呼び出しにフラグを設定します。この例を実行するには、オプション -library autosar を使用します。

結果情報

グループ: プログラミング
言語: C | C++
既定値: オフ
コマンド ライン構文: autosar_lib_non_compliance
影響度: High

バージョン履歴

R2021a で導入