exponenta event banner

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

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

Описание

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

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

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

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

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

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

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

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

Эта проверка находит подмножество проблем, обнаруженных с проверкой Invalid use of AUTOSAR runtime environment function. Настройка для этой проверки не требует предоставления конструктивных ограничений в формате ARXML, поэтому эта проверка не может найти нарушения ограничений, обнаруженные вместе с другой проверкой. См. также раздел Выбор анализа на основе компонентов и интеграции кода AUTOSAR с полипространством.

Диагностика этой проверки

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

В проверочном сообщении указывается, что:

  • Указатель не может иметь значение 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_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. Проверка этой функции имеет красный цвет, указывающий на определенную проблему.

Сообщение проверки указывает, что:

  • Указатель может иметь значение NULL.

  • Если значение указателя не равно NULL, указателю назначается буфер.

  • Если значение указателя не равно 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_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 принимает указатель на возможно неинициализированный буфер. Проверка этой функции является оранжевой, что указывает на возможную ошибку, например, ошибку, которая возникает только на определенных путях выполнения. Вы можете видеть, что из-за отсутствующего catch-all else предложение в if-else if-else оператор, буфер arrayColorNumber не инициализирован для значений hasInitialData кроме 0 и 1.

Сообщение проверки указывает, что:

  • Указатель не может иметь значение NULL.

  • Указателю назначается буфер.

  • Возможно, буфер не инициализирован.

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

Проверить информацию

Группа: Другое
Язык: C | C++
По умолчанию: Вкл., если используется значение autosar для опции Libraries used (-library), в противном случае выкл.
Синтаксис командной строки: autosar_compliance
Представлен в R2021a