メインコンテンツ

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

MISRA C++:2023 Rule 6.2.1

The one-definition rule shall not be violated

R2024b 以降

説明

ルール定義

The one-definition rule shall not be violated. 1

根拠

One Definition Rule (定義は 1 度の規則) (ODR) に違反すると、未定義の動作を引き起こします。コード内のエンティティが次の場合、ODR の違反になります。

  • 定義が存在しない。

  • 異なるソース ファイルに複数の非インライン定義がある。

  • 異なるソース ファイルに複数の異なるインライン定義がある。

  • 異なる初期化子の値がある。

Polyspace 実装

ルール チェッカーは以下の場合に違反を報告します。

  • 同じ関数またはオブジェクトに複数の定義があり、その定義の一部のトークンが異なっている。

  • 1 つのインライン関数に対して、異なるソース ファイル内に異なる実装がある。

このチェッカーは、次のような未使用のコードでは起動されません。

  • インスタンス化されていないテンプレート

  • 呼び出されない関数 static または extern

  • 呼び出されない未定義のローカル関数

  • 未使用の型および変数

トラブルシューティング

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

すべて展開する

次の例では次の 2 つのファイルを使用しています。

  • file1.cpp:

    
    typedef struct S //Noncompliant
    {
       int x;
       int y;
    }S; 
    void foo(S& s){
    //...
    } 
  • file2.cpp:

    
    typedef struct S 
    {
       int y;
       int x;
    }S ; 
    void bar(S& s){
    //...
    }

この例では、file1.cppfile2.cpp の両方で構造体 S を定義しています。ただし、定義では構造体のフィールドの順序が入れ替わっています。

次の例では 3 つのヘッダー ファイルと 2 つのソース ファイルを使用しています。

ヘッダー ファイルソース ファイル

  • File1.h:

    void  foo(int32_t i);

  • File2.h:

    void  foo(int64_t i);

  • File3.h:

    inline void bar(int64_t i){
    foo(i);
    }

  • File1.cpp:

    #include<cstdint>
    #include "File1.h"
    #include "File3.h"
    void f1(){
    
    bar(23);
    }
    

  • File2.cpp:

    #include<cstdint>
    #include "File2.h"
    #include "File3.h"
    void f2(){
    
    bar(23);
    }
    

File1.cpp のインライン関数 bar() には foo(int32_t i) の呼び出しが含まれていますが、File2.cpp の関数 bar() には foo(int64_t i) の呼び出しが含まれています。同じインライン関数の定義が翻訳単位によって異なると、このルールの違反になります。

チェック情報

グループ: 基本概念
カテゴリ: 必要

バージョン履歴

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.