メインコンテンツ

MISRA C:2012 Rule 8.17

At most one explicit alignment specifier should appear in an object declaration

R2024a 以降

説明

ルール定義

At most one explicit alignment specifier should appear in an object declaration 1 .

This rule comes from MISRA C™:2012 Amendment 3.

根拠

宣言でアライメント指定を指定することが目的の場合に、複数のアライメント指定子を使用するとその意図が不明瞭になり、コードの解析とレビューが難しくなる可能性があります。

同一の宣言で複数のアライメント指定子を指定する場合は、最も厳密な要件がオブジェクトに適用されます。たとえば次のコードの抜粋では、変数 varWithTwoAlign が 2 つのアライメント指定子を指定して宣言されていますが、最も厳密なアライメントに必要な境界に、配置されます (ほとんどのプラットフォームでは double)。

_Alignas(float) _Alignas(double) int varWithTwoAlign; //Noncompliant
条件に応じて異なるアライメントを指定することが目的の場合は、プリプロセッサ命令などでアライメントの条件値を個別に抽象化します。

たとえば次のコードの抜粋では、conditionalAlignVar のアライメントの値は、環境変数 IS_TARGET が定義されている場合は 4、それ以外の場合は 16 になります。

#ifdef IS_TARGET  
    #define ALIGN_SPEC 4
#else
    #define ALIGN_SPEC 16 
#endif

#define ALIGNAS_PLATFORM(expr) _Alignas(expr)

void func() {
    ALIGNAS_PLATFORM(ALIGN_SPEC) int conditionalAlignVar;  
    
    //...
}

Polyspace 実装

コーディング ルール チェッカーは、複数のアライメント指定子が含まれているすべての宣言について、これらの指定子が同じアライメントを指定している場合でもこのルールの違反を報告します。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

#include <stdint.h>

int16_t varNoAlign;
_Alignas (4) int16_t var_align;
_Alignas (4) _Alignas(0) int16_t var_different_align; //Noncompliant
_Alignas (8) _Alignas(8) int16_t var_same_align; //Noncompliant

この例では、var_different_alignvar_same_align の宣言にそれぞれ 2 つのアライメント指定子が含まれているため、Polyspace はこれらの宣言をコーディング ルールに準拠していないものとして報告します。var_same_align のケースでは、同じアライメントが 2 回指定されている場合でも Polyspace はこの宣言がルールに準拠していないと見なします。

チェック情報

グループ: 宣言と定義
カテゴリ: 推奨
AGC カテゴリ: 推奨

バージョン履歴

R2024a で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.