Я перестраиваю приложение для соответствия правилам MISRA и использую QA-C для анализа своего кода.
Одно из этих раздражающих правил касается указателей и массивов. Вы не можете сказать:
char foo[10];
char * bar = &(foo[0]);
bar[5] = 'a';
Вы также не можете сделать:
*bar = 'a';
bar++;
Моя проблема связана с двумя функциями и переменной файловой области.
Первоначально этот код делал следующее (подобно бит-псевдокоду):
static char * bufferPtr;
static void foo_a(char * buffer /* other params */)
{
bufferPtr = buffer;
/* some logic goes here */
switch()
{
case 'b':
foo_b(/* some param */);
}
static void foo_b(/* parameters */)
{
if (/*something*/)
{
/* some logic */
foo_c(/* data-param */);
/* some logic */
}
else
{
/* some logic */
foo_c(/* data-param */);
/* some logic */
}
}
static void foo_c(char data)
{
*buffer++ = data;
}
Я попытался переписать его следующим образом:
static char (*bufferPtr)[];
static char bufferIndex;
static void foo_a(char buffer[] /* other params */)
{
bufferPtr = &buffer;
bufferIndex = 0;
/* same */
}
static void foo_b(/* parameters */)
{
/* same */
}
static void foo_c(char data)
{
(*bufferPtr)[bufferIndex] = data;
bufferIndex++;
}
Но потом и мисра, и мой компилятор (softune, Fujitsu) жалуются. Компилятор говорит:
присваивание несовместимых типов указателей из
CHAR **' to
CHAR (*)[]': оператор `='
Мишра говорит:
[C] Правый операнд присваивания не имеет совместимого типа указателя. Адрес автоматического объекта, экспортируемого в указатель со связью или более широкой областью действия.
Однако мне нужно иметь возможность индексировать массив в функции foo_c. Или есть другие способы следовать за мисрой и заставить мой код работать.
Если я сделаю следующее в том же файле:
static CHAR foo[10];
static CHAR (*bar)[];
static void f(void)
{
bar = &foo;
}
Тогда ни Мишра, ни мой компилятор ни на что не жалуются.
void foo(char buf[]){buf[i] = 'f';i++;}
, а это не так:void foo(char * buf){buf[i] = 'f'; i++}
или:void foo(char * buf){*buf = 'f'; buf++;}
- person Daan Timmer   schedule 03.07.2012void foo(char * buf){*buf = 'f'; buf++;}
недействителен? - person Agent_L   schedule 03.07.2012char * buf
не является типом массива, а*buf = 'f'
не применяет индексацию. - person Agent_L   schedule 03.07.2012buf++;
- это арифметика указателя. Что не допускается согласно правилу 17.4. - person Daan Timmer   schedule 03.07.2012