exponenta event banner

Несоответствие спецификации AUTOSAR

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

Описание

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

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

  • Имеет значение NULL.

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

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

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

Дополнительные сведения о спецификациях RTE API см. в документации AUTOSAR.

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

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

Риск

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

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

Исправление зависит от первопричины дефекта. Чтобы диагностировать эту проверку, прочитайте сообщение на панели Сведения о результатах. В сообщении отображаются все проверки, выполненные в функции 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++
По умолчанию: Откл.
Синтаксис командной строки: autosar_lib_non_compliance
Воздействие: Высокое
Представлен в R2021a