メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2023 Rule 10.3.1

There should be no unnamed namespaces in header files

R2024b 以降

説明

ルール定義

There should be no unnamed namespaces in header files. 1

根拠

C++ 規格によると、無名の名前空間内の名前 (たとえば、次の aVar) は、

namespace {
   int aVar;
}
既定では内部リンクをもちます。ヘッダー ファイルが無名の名前空間を含む場合、ヘッダー ファイルを #include しているソース ファイルをもつ各翻訳単位が、その名前空間内の自身のオブジェクト インスタンスを定義します。通常、オブジェクトを意図的に複数定義することはないため、メモリの過剰使用、単一定義ルールの違反など、予期しない結果を引き起こす可能性があります。

Polyspace 実装

チェッカーは、ヘッダー ファイル内の無名の名前空間にフラグを設定します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

ヘッダー ファイル: aHeader.h

namespace { //Noncompliant
   int aVar;
}

1 つ目のソース ファイル: aSource.cpp

#include "aHeader.h"
#include <iostream>

void setVar(int arg) {
    std::cout << "Current value: " << aVar << std::endl;
    aVar = arg;
    std::cout << "Value set at: " << aVar << std::endl;
}

2 つ目のソース ファイル: anotherSource.cpp

#include "aHeader.h"
#include <iostream>

extern void setVar(int);

void resetVar() {
    std::cout << "Current value: " << aVar << std::endl;
    aVar = 0;
    std::cout << "Value set at: 0" << std::endl;
}

void main() {
    setVar(1);
    resetVar();
}

この例では、非準拠の無名の名前空間によって、aSource.cpp の翻訳単位内と anotherSource.cpp の翻訳単位内に、aVar の定義が 2 つ生成されます。2 つの定義は、次のような予期せぬ出力につながる可能性があります。

Current value: 0
Value set at: 1
Current value: 0
Value set at: 0

チェック情報

グループ: Declarations
カテゴリ: 推奨

バージョン履歴

R2024b で導入


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.