Арифметика нарушения указателя MISRA - PullRequest
0 голосов
/ 31 мая 2018

Я сделал функцию для добавления следующих чисел в массив.Код очень прост, например:

int math(int *address, int size)
{
    int sum = 0;
    for (int i = 0; i < size; i++)
    {
        sum += *address;
        address++;
    }
    return sum;
}

Во время статического анализа я обнаружил, что существует проблема с правилом MISRA, которое говорит о том, что вы можете выполнять математику только с указателями, присвоенными массиву.Цель этой функции - использовать ее в массивах, но, конечно, то, что я написал здесь, не гарантирует, что указатель не будет присвоен переменной.

Один из обходных путей, о котором я думаю, - это скопировать всю таблицу в локальную область, а затем суммировать все элементы, но это довольно большая операция, тратящая много ресурсов на процессоры.У вас есть идеи, как я могу сделать это лучше?

1 Ответ

0 голосов
/ 31 мая 2018

Это было бы из главы 17 MISRA-C: 2004, которая была довольно иррациональна в отношении использования указателей и массивов.Эта глава была переписана с нуля в MISRA-C: 2012 (глава 18).Я настоятельно рекомендую обновить, так как MISRA-C: 2004 здесь просто не имеет особого смысла.

Что касается того, как сделать ваш код совместимым с MISRA-C: 2004, сделайте следующее:

int math(int address[], int size)
{
    int sum = 0;
    int i; // declaration must be here, MISRA-C:2004 does not allow C99
    for (i = 0; i < size; i++)
    {
        sum += address[i];
    }
    return sum;
}

Да, он делает то же самое.Но по крайней мере это сделало ваш код немного более читабельным.


Чтобы сделать ваш код еще более безопасным, хотя и не совместимым с MISRA, сделайте это:

// better than MISRA-C but not compliant
int math(size_t size, int address[size])
{
    int sum = 0;
    for (size_t i = 0; i < size; i++)
    {
        sum += address[i];
    }
    return sum;
}

Или в случаесистемы с высокой степенью целостности, вы могли бы даже сделать:

int math(size_t size, int (*array)[size])
{
  int* address = *array;
  ...

Обе эти альтернативы дают более безопасный код, чем MISRA-C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...