MISRA ルールに準拠するようにアプリケーションを再構築し、QA-C を使用してコードを分析しています。
これらの煩わしいルールの 1 つに、ポインターと配列が関係しています。あなたは言うことができません:
char foo[10];
char * bar = &(foo[0]);
bar[5] = 'a';
また、次のこともできません。
*bar = 'a';
bar++;
私の問題には、2 つの関数とファイル スコープ変数が含まれます。
元々、このコードは次のことを行いました (ビット疑似コードのように):
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++;
}
しかし、その後、misra と私のコンパイラ (softune、富士通) の両方が文句を言います。コンパイラは次のように述べています。
CHAR **' to
CHAR (*)[]': 演算子 `='からの互換性のないポインタ型の代入
ミスラ 言います:
[C] 代入の右オペランドが互換性のあるポインター型ではありません。リンケージまたはより広いスコープを持つポインターにエクスポートされた自動オブジェクトのアドレス。
ただし、foo_c 関数で配列にインデックスを付けることができる必要があります。または、ミスラに従って、私のコードを機能させる他の方法はありますか。
同じファイルで次のことを行うと:
static CHAR foo[10];
static CHAR (*bar)[];
static void f(void)
{
bar = &foo;
}
その後、ミスラも私のコンパイラも何も文句を言いません。