Non-compliance with AUTOSAR specification

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

Описание

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

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

  • Оцененный NULL.

  • Точки к буферу памяти.

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

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

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

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

Эта проверка находит подмножество проблем найденным с проверкой Invalid use of AUTOSAR runtime environment function. Подготовка для этой проверки не требует обеспечения конструктивных ограничений в формате ARXML, поэтому эта проверка не может найти нарушения ограничений найденными с другой проверкой. См. также Выбирают Between Component-Based и Integration Analysis of AUTOSAR Code with Polyspace.

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

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

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

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

Примеры

развернуть все

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

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

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

  • Если значение указателя не является ПУСТЫМ, указатель выделяется буфер.

  • Если значение указателя не является ПУСТЫМ, и указатель указывает на буфер, буфер не инициализируется.

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

#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 пункт в if-else if-else оператор, буферный arrayColorNumber не инициализируется для значений hasInitialData кроме 0 и 1.

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

  • Указатель не может иметь Нулевого значения.

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

  • Буферная сила не быть инициализированным.

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

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

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