Это было бы из главы 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.