OSC Nagoya 2018, 【飲食OK】コーディング標準は誰のため?(発表はCおよびC++、質問は他の言語も可)の記録
https://www.ospn.jp/osc2018-nagoya/
<この項は書きかけです。順次追記します。>
準備作業記録
前日、夕方
当日資料1:選択3時間
Qiitaで掲載した資料から4つ選択(この頁の最後にコードを含めて記載)
当日資料2:印刷3時間、B4印刷がエラーになりA3印刷。出来上がりはA4
OSC Oosakaでは、B4印刷したものをLTで朗読時に配布。
「ちょけねこ おたんじょうびのおくりもの」80部印刷
https://bookmeter.com/books/9820154
当日、朝
提示原稿 5時起き4時間作業
- 朝6時、できたとこまでを0.1としてSlideshareに掲載。ver. 0.10
https://www.slideshare.net/kaizenjapan/who-enjoy-a-coding-standard - 朝8時、出かける前の版0.2をSlideshareに掲載。ver. 0.20
https://www.slideshare.net/kaizenjapan/who-enjoy-a-coding-standard-ver-020
「近日開催予定行事」6枚を1枚のPDFとして出力。
- 移動時間中に文字の大きさを調整、必要事項追記
コンビニで印刷。
会場到着後、最後の資料改定ver. 0.30
https://www.slideshare.net/kaizenjapan/who-enjoy-a-coding-standard-ver-030
会場にて
昼食時のセッションが2つしかなかったこともあり
約50名の方に参加いただけました。
質疑
Q1 全てをツールで対応できないのか
A1 1年に1回しか出てこないような類型は、コーディング標準として決めてもツールで対応する手間、費用をかけられない。
オープンソースで対応してくださる熱意のある方がお見えになれば実現するかもしれない。MISRA C/C++, CERT C/C++の規則のほとんどに対応した道具がオープンソースでないのは、自分の技術力不足と怠慢と反省中。
Q2 逸脱の具体例は。
A2 Slide shareに掲載したスライドの後ろの方に掲載している。ただし、これは道具で自動化する前のもの。特定の註釈をつけて、逸脱道具の自動化は現在進行形。TOPPERSのオープンソースの案件では、当方が品証として参加し、逸脱の手続きをとったことがある。試験機関であることと、カーネルであることから、アセンブラでの確認を必須にしており、アプリなどの場合には、手続きとして重すぎるかもしれない。
Q3 Javaだと命名規則を含めた規則がある。
他の言語でも命名規則も一体的にすれば。
A3 構造的な命名規則がうまくいくとは限らない。プログラミング言語によっては、画面の設計の構造を変えたら名前を全部変えなくてはいけなくなったこともある。
植物のように従来の構造的な分類が、遺伝子解析でかなりの量の変更があったように、構造的な定義が万能ではない。
(事後補足)
2つの異なる情報源のライブラリを共用しようとすると、ラッパをかぶせたり、rename機構を作ったりして調整する。案件ごとに主要ライブラリを変更する場合には、命名規則の構造を持っていると合わせるのに手間がかかるかも。
Q4 従来のコードを再利用せずに、全面的に書き換えることはしないのか
A4 モデルベースに移行する際に、全面的な書き換えをして成功した事例はお聞きしたことがある。
その場合には、試験とかも体系的に道具を作ったりするので試験の効率化が計ることができる。
そうでない場合には、従来のタイミングとのズレが生じると振る舞いが変わる可能性があり、膨大な試験を再度することになり現実的ではない。
Q5 複数の会社へ納めている場合に、相手のコーディングルールに合わせるのは
A5 特定の会社のコーディングルールの目的と規則とがうまく合っていれば良い。検査の道具を指定していることがある。
(事後追記)
開発現場と、品証とが別の道具で検査すると、MISRAが推奨しているような複数の道具による検査が実現する。品証が手を動かすと良い。
Q6 昔書いたコードを、最近見る機会があった。
何人かの手が加えられていて、いろいろ考えることがあった。
A6 適用言語規格の変更、コンパイラの版の変更など、いろいろな要素がある。
Q7 自動車分野以外だけどMISRA Cを適用しようと思うけど、どうすればいい?
A7 日本規格協会から発行されている解説書を見ていただければ、事務機会分野でもMISRA を適用されていることがわかるかも。動的メモリ確保を利用していない場合ならMISRA C/C++を先に適用し、そのあとCERT C/C++を適用しても良い。
動的メモリ確保が、デバイスドライバなどで起動時に1度だけの処理であれば、同じようにMISRA C/C++が先で良い。
動的メモリ確保を頻繁に行っているようであれば、CERT C/C++を先に適用すると良い。
現在、動的メモリ確保を頻繁に行っているプログラムで、起動時に1度だけの処理にならないかを見直してから適用すると良い。
行事予定表
ホップ、ステップ、HAZOP
2018/06/08(金) 午前9時、午前11時 二度開催予定、無料
会場:名古屋市熱田区六番三丁目四番41号
名古屋市工業研究所 電子技術総合センター5階コンピュータ研修室
名古屋のIoTは名古屋のOSで
2018/06/21(木) 無料、定員10人。
会場:同上
Raspberry Pi持参の方定員越え受付
ゼロから作るDeep Learning ❷ ―自然言語処理編 読書会
2018/07/19(木)午後1時から午後5時 無料
会場:同上
確率論及統計論輪講
および Automotive SPICE,実アセスメント
毎月第二金曜日 無料 要事前連絡
SWEST
2018, 8/30(木)-8/31(金)
下呂水明館 有料
http://swest.toppers.jp
資料1
課題1 次のコンパイルエラーをなくしてください。
$ clang++ p35-3.cpp -std=c++2a -Wall
p35-3.cpp:15:9: warning: unused variable 'i' [-Wunused-variable]
int i = f(a); // f is the typedef, not the friend function: equivalent to int(a)
^
p35-3.cpp:25:9: error: fields must have a constant size: 'variable length array in
structure' extension will never be supported
int a[i];
^
p35-3.cpp:25:9: warning: private field 'a' is not used [-Wunused-private-field]
2 warnings and 1 error generated.
C++N4741,2018 (12)6.4.1 Unqualified name lookup [basic.lookup.unqual]p35
https://qiita.com/kaizen_nagoya/items/4b0aabd7e70d81f5f268
####対象算譜(code)は下記
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
#define msg "C++N4741(12)6.4.1 Unqualified name lookup [basic.lookup.unqual]p35-3.cpp"
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
using namespace std;
int i = 2;
typedef int f;
namespace N {
struct A {
friend void f(A &);
operator int();
void g(A a) {
int i = f(a); // f is the typedef, not the friend function: equivalent to int(a)
}
};
}
namespace M {
class B { };
}
namespace N {
class Y : public M::B {
class X {
int a[i];
};
};
}
int main() {
cout<< msg << endl;
return EXIT_SUCCESS;
}
課題2 次のコンパイルエラーをなくしてください。
$ clang++ p105-2.cpp -std=c++2a -Wall
p105-2.cpp:11:1: error: unknown type name 'T'
T* p1 = new T;
^
p105-2.cpp:11:13: error: unknown type name 'T'
T* p1 = new T;
^
p105-2.cpp:12:7: error: unknown type name 'T'
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
^
p105-2.cpp:12:33: error: unknown type name 'T'
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
^
4 errors generated.
C++N4741 (50)8.5.1.9 Static cast [expr.static.cast]p105
https://qiita.com/kaizen_nagoya/items/e76c21417f6e21c1485e
対象算譜(code)は下記。(yumetodo さんからのご指導
https://teratail.com/questions/126548#reply-192709 で解決済)
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
const char* msg= "C++N4741(50)8.5.1.9 Static cast [expr.static.cast]p105-2.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
using namespace std;
T* p1 = new T;
const T* p2 = static_cast<const T*>(static_cast<void*>(p1));
bool b = p1 == p2; // b will have the value true.
int main() {
cout<< msg << endl;
return EXIT_SUCCESS;
}
課題3 次のリンクエラーをなくしてください
$ clang++ p45.cpp -std=c++2a -Wall Undefined symbols for architecture x86_64: "M::N::A::operator A<A>()", referenced from: _main in p45-8b7ccd.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)
C++N4741,2018(18)6.4.5 Class member access [basic.lookup.classref]p45
https://qiita.com/kaizen_nagoya/items/8a189bc088cb94e5f265
対象算譜(code)は下記
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
#define msg "C++N4741(18)6.4.5 Class member access [basic.lookup.classref]p45.cpp"
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
using namespace std;
struct A { };
struct B {
struct A { };
void f(::A* a);
};
void B::f(::A* a) {
a->~A(); // OK: lookup in *a finds the injected-class-name
}
struct A { };
namespace N {
struct A {
void g() { }
template <class T> operator T();
};
}
int main() {
N::A a;
a.operator A(); // calls N::A::operator N::A
cout<< msg << endl;
return EXIT_SUCCESS;
}}
課題4:次の実行時エラーをなくしてください
Abort trap: 6
C++N4741(47)8.5.1.2 Function call [expr.call]p100
https://qiita.com/kaizen_nagoya/items/1db7cadf2c155b9addb5
対象算譜(code)は下記
// C++N4741 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n741.pdf
const char* msg= "C++N4741(47)8.5.1.2 Function call [expr.call]p100a.cpp";
// Edited by Dr. Ogawa Kiyoshi. Compile procedure and results record.
#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace std;
void f() {
std::string s = "but I have heard it works even if you don’t believe in it";
s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don’t"), 6, "");
assert(s == "I have heard it works only if you believe in it"); // OK
}
struct S {
S(int);
};
int operator<<(S, int);
int i, j;
int operator<<(S, int i) {
return i;
}
int x = S(i=1) << (i=2);
int y = operator<<(S(j=1), j=2);
S::S(int j) {
j++;
}
int main() {
f();
cout << "x="<<x <<" y="<<y<<endl;
cout<< msg << endl;
return EXIT_SUCCESS;
}
課題
現在、astyleで整形している。namaspaceがうまく整形できていない。
-Nをつければnamespaceを整形できた。
Qiita掲載用利用記述は下記
#!/bin/bash
astyle -s2 -c -N< $1.cpp > $1s2.cpp
cat $1s2.cpp
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
文書履歴(document history)
ver. 0.10 初稿 20180519
ver. 0.11 Q&A追記 20180520
ver. 0.12 課題(astyle)追記 20180522
ver. 0.13 astyle -N追記 20180524
ver. 0.14 ありがとう追記 20230413
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.