Указатель и указатель в C - Что не так? - PullRequest
0 голосов
/ 17 мая 2018

Обновление: я получил подтверждение того, что поведение связано с ошибкой в ​​программе проверки кода (см. Комментарий к ответу № 2)

Я пробую статическую программу проверки кода, и она жалуется:

Доступ к указателю массива `sensorConf 'осуществляется с помощью индекса [8,8], который может выходить за границы массива [0, НЕИЗВЕСТНО] MISRAC2012-Rule-18.1_d

Код:

typedef struct
{
    int16_t signalOrig;
} TT;

typedef struct
{
   int iii; // <-- see below: int16_t iii would work without warning!
   uint16_t numCalibPairs; 
  TT calib[5];
} SS;

void Test(const SS* sensorConf);

void Test(const SS* sensorConf)
{
  const int16_t f = sensorConf->calib[0].signalOrig;
  }

Я спросил: почему он говорит "Указатель массива"?Почему он считает, что индекс [8,8]?Это просто проблема проверки кода или проблема с моим кодом?

Редактировать: Проверка кода (C-STAT) дает не только одно, но и 3 правила, все из которых имеют значение, что существуетДоступ за пределы массива.Теперь, если я удаляю первое или второе целое число в структуре SS, предупреждение исчезает.Он также исчезает, если я изменяю «iii» с int (32-битная, ARM cortex M4) на int16_t.Предупреждение не появляется, если перед массивом в структуре SS есть только 4 байта.Похоже на баг в шашке?

Ответы [ 2 ]

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

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

Ваш код этого не делает, если только инструменту не удалось найти что-то в вызывающем коде, например неинициализированный указатель - мы не можем отличить его от отправленного кода.

Если параметр, на который указывает параметр, определенно является выделенной структурой SS, то предупреждение является ложноположительным. sensorConf определенно не указатель массива. Действительно, кажется, что программа проверки IAR MISRA содержит ошибки.

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

Код безопасен - указатель всегда будет на signalOrig, если значение AWISIL_MAX_CALIB_PAIRS больше нуля. Не зная текста правила MISRA 18.1c, я не могу сказать вам, соответствует ли оно, однако.

Статическая проверка не может проверить соответствие этому программно. Сообщение является только предупреждением.

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