Non-compliance with AUTOSAR specification

Функция 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 с Polyspace».

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

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

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

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

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

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

  • Указателю выделяется буфер.

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

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

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

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