Autosar Guidelines C++14, example code compile list(26)Rule A3-3-2 Non-POD type objects with static storage duration


Guidelines for the use of the C++14 language in critical and
safety-related systems Sample code compile list(26)
https://www.autosar.org/fileadmin/user_upload/standards/adaptive/17-03/AUTOSAR_RS_CPP14Guidelines.pdf

Autosar Guidelines C++14 example code compile list
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

目的(purpose)

AutosarのC++ GuidelineをOS, 制御のプログラムで利用するにあたって、(1)hosted, freestandingのどちらを基本にすべきか。(2)C++2014,C++2017, C++202aのどれを用いると良いか, (3)どの処理系を併用すると良いかを検討するため、-std=c++14, -std=c++17, -std=c++2aの3種類で、複数のコンパイラでコンパイルすることにより、誤(error)、警告(warning)、関数・変数連携(link)、出力(output)、にどのような影響があるかを確認する。

成果(outcome)

複数の処理系の特徴が明確になるとともに、各標準段階, hosted, freestandingの特徴と課題を明確にする。

A3-3-2.cpp

算譜(source code)

A3-3-2.cpp
//Guidelines for the use of the C++14 language in critical and safety-related systems
const char* msg="Rule A3-3-2 (required, implementation, automated) Non-POD type objects with static storage duration shall not be used.(26)A3-3-2.cpp";
//https://www.autosar.org/fileadmin/user_upload/standards/adaptive/17-03/AUTOSAR_RS_CPP14Guidelines.pdf
// There is no description about Autosar declear hosted or freestanding.
// If the Autosar intended both depending on the cases, autosar.h can choose one.
// Compile with -DHOSTED work as  hosted environment, -DFREESTANDING work as freestanding.

#include "autosar.h"/// @line add header file https://qiita.com/kaizen_nagoya/items/4bde8f21ab059b96cf2a
#include <cstdint>

using namespace std;/// @line add using

///start AUTOSAR: From here to the "///end AUTOSAR" is from AUTOSAR without code having /// comment in line.

// $Id: A3-3-2.cpp 271927 2017-03-24 12:01:35Z piotr.tanski $
#include <cstdint>
#include <limits>
#include <string>
class A // Non-POD type
{
public:
  static std::uint8_t instanceId; // Compliant - static variable of POD type
  static float const pi; // Compliant - static variable of POD type
  static std::string const
  separator; // Non-compliant - static variable of nonPOD type

// Implementation
};
std::uint8_t A::instanceId = 0;
float const A::pi = 3.14159265359;
std::string const A::separator = "==========";

class B
{
public:
// Implementation

private:
  static A a; // Non-compliant - static variable of non-POD type
};

class C
{
public:
  constexpr C() = default;
};

namespace
{
  constexpr std::int32_t maxInt32 =
    std::numeric_limits<std::int32_t>::max(); // Compliant - static constexpr
// variable of POD type

  A instance{}; // Non-compliant - static variable of non-POD type

  constexpr C
  c{}; // Compliant by exception - constexpr static variable of non-POD type

  void f1() {
    cout <<"maxInt32="<<maxInt32<<" instance="<<instance.instanceId<<"&c="<<&c<<endl; /// @ line add output
  }

} // namespace

void fn() noexcept
{
  static A a{}; // Non-compliant
  static std::int32_t counter{0}; // Compliant
  cout << "counter="<< counter <<" a.instanceId="<<a.instanceId<<endl;/// @ line add output

}

class D // Singleton
{
public:
  D() = default;
  D(D const&) = default;
  D(D&&) = default;
  D& operator=(D const&) = default;
  D& operator=(D&&) = default;
  ~D() = default;

private:
  static B* instance; // Compliant - static variable of non-POD type, because
// it is a raw pointer
};
B* D::instance = nullptr;

///end AUTOSAR
int start() { /// @{} for start
  fn();
  f1();
  cout<< msg << endl;
  ShutdownOS()  EXIT_SUCCESS;
/// Autosar OS 3.1.1, 2009: 7.1.2.2 Undefined Behaviour in OSEK OS
/// OS425 If ShutdownOS is called and ShutdownHook() returns then the operating system shall disable all interrupts and enter an endless loop.
}

編纂・実行結果(compile and go)

cpa.sh
$ ../cpa.sh a3-3-2
$ clang++ a3-3-2.cpp -I./ -std=c++14 -Wall
counter=0 a.instanceId=
maxInt32=2147483647 instance=&c=0x100292f64
Rule A3-3-2 (required, implementation, automated) Non-POD type objects with static storage duration shall not be used.(26)A3-3-2.cpp
$ clang++ a3-3-2.cpp  -I./ -std=c++17 -Wall
counter=0 a.instanceId=
maxInt32=2147483647 instance=&c=0x10fceff64
Rule A3-3-2 (required, implementation, automated) Non-POD type objects with static storage duration shall not be used.(26)A3-3-2.cpp
$ clang++ a3-3-2.cpp  -I./ -std=c++2a -Wall
counter=0 a.instanceId=
maxInt32=2147483647 instance=&c=0x101564f64
Rule A3-3-2 (required, implementation, automated) Non-POD type objects with static storage duration shall not be used.(26)A3-3-2.cpp

$ g++-8 a3-3-2.cpp  -I./ -std=c++14  -Wall
counter=0 a.instanceId=
maxInt32=2147483647 instance=&c=0x10ea10e98
Rule A3-3-2 (required, implementation, automated) Non-POD type objects with static storage duration shall not be used.(26)A3-3-2.cpp
$ g++-8 a3-3-2.cpp  -I./ -std=c++17  -Wall
counter=0 a.instanceId=
maxInt32=2147483647 instance=&c=0x104e5e390
Rule A3-3-2 (required, implementation, automated) Non-POD type objects with static storage duration shall not be used.(26)A3-3-2.cpp
$ g++-8 a3-3-2.cpp  -I./ -std=c++2a  -Wall
counter=0 a.instanceId=
maxInt32=2147483647 instance=&c=0x10ef65390
Rule A3-3-2 (required, implementation, automated) Non-POD type objects with static storage duration shall not be used.(26)A3-3-2.cpp

検討事項(agenda)

1. 自律(freestanding)環境. 接待(hosted)環境

C++N4606 1.4 Implementation compliance p.4

2. 対応OSの水準、対応通信規約、応用機能による分類

freestanding用の関数、ライブラリ等

3. C++2014, C++2017, C++202aの比較項目

本件なし

4. clang++, g++の比較検討項目

本件なし

5 役に立つまたは意味のある出力

参考文献(reference)

C++N4741 2018

Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4741.pdf

C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010

N4606 2016

Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

C++N4606, 2016符号断片編纂一覧(example code compile list)
Working Draft 2016, ISO/IEC 14882(1)
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

文書履歴(document history)

ver 0.10 初稿 20180609
ver 0.11 一覧追記 20180613