Non-compliance with AUTOSAR specification

Функция RTE API используется с аргументами, которые нарушают спецификацию стандарта AUTOSAR

Описание

Этот дефект возникает, когда вы используете функцию RTE API с аргументами, которые нарушают стандартные спецификации AUTOSAR.

Для образца проверяет Rte_Write_* или Rte_Byps_Write_* вызовы функций определяют, является ли аргумент «указатель на данные» в вызове:

  • Значение NULL.

  • Указывает на буфер памяти.

  • Указывает на инициализированный буфер памяти.

  • Для буферов со значениями перечисления значения находятся в области значений перечисления.

Для получения дополнительной информации о спецификациях RTE API см. документацию AUTOSAR.

Чтобы включить эту проверку, используйте значение autosar для опции Libraries used (-library).

Более исчерпывающая версия той же шашки доступна с Code Prover. При проверке на нарушения стандартов AUTOSAR на Rte_ вызов функции, проверка Code Prover рассматривает все пути выполнения, которые приводят к вызову функции (с учетом допущений верификации).

Риск

Использование функции RTE может привести к ошибкам времени выполнения.

Зафиксировать

Исправление зависит от первопричины дефекта. Чтобы диагностировать эту проверку, прочтите сообщение на панели Result Details. В сообщении показаны все проверки, выполненные с функцией RTE API, а также информация о том, прошла ли проверка. Для образца, это сообщение:

Показывает результаты трех проверок, все три из которых могут завершиться неудачно. Первый аргумент функции может быть пустым указателем, может не быть выделен и не указывать на инициализированную память.

Исследуйте первопричину проблемы далее.

Примеры

расширить все

#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 принимает указатель на неинициализированную переменную. Проверка помечает вызов функции, потому что указатель не указывает на инициализированную память.

#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_2 принимает указатель, возвращенный из выделения памяти с malloc. Проверка помечает вызов функции, потому что указатель не указывает на инициализированную память.

Информация о результатах

Группа: Программирование
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : autosar_lib_non_compliance
Влияние: Высокий
Введенный в R2021a