coding
14882
C++N4606

C++N4606 (4)1.9 Program execution

はじめに

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

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的なずれがあれば確認できれば幸いです。また、boostライブラリとの関連、Linux OS, TOPPERSカーネル、g++(GCC), clang++(LLVM)との関係も調査中です。
何か、抜け漏れ、耳より情報がありましたらおしらせくださると幸いです。

作業方針

1)コンパイルエラーを収集する。
2)コンパイルエラーをなくす方法を検討する。
コンパイルエラーになる例を示すだけが目的のコードは、コンパイルエラーをなくすのではなく、コンパイルエラーの種類を収集するだけにする。
文法を示すのが目的のコード場合に、コンパイルエラーをなくすのに手間がかかる場合は、順次作業します。
3)リンクエラーをなくす方法を検討する。
文法を示すのが目的のコード場合に、リンクエラーをなくすのに手間がかかる場合は、順次作業します。
4)意味のある出力を作る。
コンパイル、リンクが通っても、意味のある出力を示そうとすると、コンパイル・リンクエラーが出て収拾できそうにない場合がある。順次作業します。

1)だけのものから4)まで進んだものと色々ある状態です。一歩でも前に進むご助言をお待ちしています。「検討事項」の欄に現状を記録するようにしています。

C++N4606 一覧

C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Sample code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

C++N3242 2011 sample code compile list(一覧)

C++2011が出て、コンパイラが対応し始めたころ、N3242のコード断片をコンパイルしながら、C++2011の内容と、コンパイラの対応状況の調査を始めました。
Templateの断片のコンパイル方法がうまくなく、コンパイルエラーの儘になっています。今回、C++N4606を-std=C++03, -std=C++11, -std=C++17でコンパイルする中で意味のある出力を出す方法を検討しています。
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318

C++N3242 C++2011

https://researchmap.jp/jo1nb3i1o-1797580/#_1797580

Compiler

clang++ --version

clang version 6.0.0 (tags/RELEASE_600/final)

g++-7 --version

g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

1.9 Program execution

2011版 2014/06/10

cpp2011// 1 General 1.9 Program execution
https://researchmap.jp/jobqs80jg-1797580/#_1797580
上記はコンパイルエラーが出たまま放置していた。下記に作り変えていた。
https://researchmap.jp/jo1nb3i1o-1797580/#_1797580

p9.cpp

p9.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf p.9

#include <iostream>
#include <stdlib>

int main(){

  // p9 from here
  int a, b;
  /* ... */
  a = a + 32760 + b + 5;
  std::cout << "a=" << a << " b=" << b << std::endl; 

  a = (((a + 32760) + b) + 5);
  std::cout << "a=" << a << "b=" << b << std::endl; 

  a = ((a + b) + 32765);
  std::cout << "a=" << a << "b=" << b << std::endl; 

  a = ((a + 32765) + b);
  std::cout << "a=" << a << "b=" << b << std::endl; 

  a = (a + (b + 32765));
  std::cout << "a=" << a << "b=" << b << std::endl; 

  // p9 to here

  return EXIT_SUCCESS;
}
shell
$ ./cppgl.sh p9
$ clang++ p9.cpp
a=-342681709 b=32766
a=-342616178 b=32766
a=-342550647 b=32766
a=-342485116 b=32766
a=-342419585 b=32766

$ g++-7 p9.cpp
a=132616656 b=132583890
a=265233311 b=132583890
a=397849966 b=132583890
a=530466621 b=132583890
a=663083276 b=132583890

p10.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf p.10

#include <iostream>

  // p10 from here
struct S {
  S(int i): I(i) { }
    int& v() { return I; }
  private:
    int I;
};
S s1(1); // full-expression is call of S::S(int)
S s2 = 2; // full-expression is call of S::S(int)
void f() {
  if (S(3).v()) // full-expression includes lvalue-to-rvalue and
  // int to bool conversions, performed before
  // temporary is deleted at end of full-expression
  { 
   std::cout << "S(3).v() =" << S(3).v() <<std::endl; 
  }
}

int main(){
  f();
  return EXIT_SUCCESS;
}
shell
./cppgl.sh p10
$ clang++ p10.cpp
S(3).v() =3

$ g++-7 p10.cpp
S(3).v() =3

p11.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf p.11

#include <iostream>

  // p11 from here

void f(int, int);
void g(int i, int* v) {
  i = v[i++]; // the behavior is undefined
   std::cout << "i =" << i <<std::endl; 
  i = 7, i++, i++; // i becomes 9
   std::cout << "i =" << i <<std::endl; 
  i = i++ + 1; // the behavior is undefined
   std::cout << "i =" << i <<std::endl; 
  i = i + 1; // the value of i is incremented
   std::cout << "i =" << i <<std::endl; 
  f(i = -1, i = -1); // the behavior is undefined
}
int main(){
  int i=1;
  int j=2;
  int *k =&j;
  g(i,k);
  return EXIT_SUCCESS;
}
shell
./cppgl.sh p11
$ clang++ p11.cpp
p11.cpp:10:10: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
  i = v[i++]; // the behavior is undefined
    ~    ^
p11.cpp:14:8: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
  i = i++ + 1; // the behavior is undefined
    ~  ^
p11.cpp:18:7: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
  f(i = -1, i = -1); // the behavior is undefined
      ^       ~
3 warnings generated.
Undefined symbols for architecture x86_64:
  "f(int, int)", referenced from:
      g(int, int*) in p11-c85799.o
ld: symbol(s) not found for architecture x86_64
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)

$ g++-7 p11.cpp
Undefined symbols for architecture x86_64:
  "f(int, int)", referenced from:
      g(int, int*) in ccM1wCpf.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

f関数を定義。

p11a.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf p.11

#include <iostream>

  // p11 from here

void f(int, int);
void g(int i, int* v) {
  i = v[i++]; // the behavior is undefined
   std::cout << "i =" << i <<std::endl; 
  i = 7, i++, i++; // i becomes 9
   std::cout << "i =" << i <<std::endl; 
  i = i++ + 1; // the behavior is undefined
   std::cout << "i =" << i <<std::endl; 
  i = i + 1; // the value of i is incremented
   std::cout << "i =" << i <<std::endl; 
  f(i = -1, i = -1); // the behavior is undefined
}
int main(){
  int i=1;
  int j=2;
  int *k =&j;
  g(i,k);
  return EXIT_SUCCESS;
}

今回から-Wallをつけた。

shell
$ ./cppwa17.sh p11a
$ clang++ p11a.cpp -std=c++17 -Wall
p11a.cpp:13:10: warning: multiple unsequenced modifications to 'i'
      [-Wunsequenced]
  i = v[i++]; // the behavior is undefined
    ~    ^
p11a.cpp:17:8: warning: multiple unsequenced modifications to 'i'
      [-Wunsequenced]
  i = i++ + 1; // the behavior is undefined
    ~  ^
p11a.cpp:21:7: warning: multiple unsequenced modifications to 'i'
      [-Wunsequenced]
  f(i = -1, i = -1); // the behavior is undefined
      ^       ~
3 warnings generated.
i =1
i =9
i =10
i =11
i =-1 j =-1

$ g++-7 p11a.cpp -std=c++17  -Wall
p11a.cpp: In function 'void g(int, int*)':
p11a.cpp:13:5: warning: operation on 'i' may be undefined [-Wsequence-point]
   i = v[i++]; // the behavior is undefined
   ~~^~~~~~~~
p11a.cpp:17:5: warning: operation on 'i' may be undefined [-Wsequence-point]
   i = i++ + 1; // the behavior is undefined
   ~~^~~~~~~~~
p11a.cpp:21:15: warning: operation on 'i' may be undefined [-Wsequence-point]
   f(i = -1, i = -1); // the behavior is undefined
             ~~^~~~
i =-290293908
i =9
i =10
i =11
i =-1 j =-1

参考資料

N4606 Working Draft 2016, ISO/IEC 14882, C++ standardのコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

Clang/Clang++(LLVM) gcc/g++(GNU) コンパイラ警告等比較
https://qiita.com/kaizen_nagoya/items/9a82b958cc3aeef0403f

Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d

MISRA C++ 5-0-16
https://qiita.com/kaizen_nagoya/items/7df2d4e05db724752a74

C++ Templates Part1 BASICS Chapter 3. Class Templates 3.2 Use of Class Template Stack stack1test.cpp
https://qiita.com/kaizen_nagoya/items/cd5fc49106fad5a4e9ed

ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

C言語(C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

'wchar.h' file not found で困った clang++ macOS
https://qiita.com/kaizen_nagoya/items/de15cd46d657517fac11

Open POSIX Test Suiteの使い方を調べはじめました
https://qiita.com/kaizen_nagoya/items/644d5e407f5faf96e6dc

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認
https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

「C++完全理解ガイド」の同意できること上位10
https://qiita.com/kaizen_nagoya/items/aa5744e0c4a8618c7671

文書履歴

ver.0.10 初稿 20180408
ver.0.11 Add list 20190409
ver.0.12 change the title and add URL. 20190414
ver.0.13 p11a.cpp define f function, compile with -Wall
ver.0.14 C++N3242の一覧追記 20180427