-
Notifications
You must be signed in to change notification settings - Fork 176
SonarCloudで指摘されたCEolの問題に対処する #1610
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SonarCloudで指摘されたCEolの問題に対処する #1610
Conversation
単体テストでカバーした範囲なので、あるべき姿にリファクタリングしてしまう。
・CEol(EEolType)をexplicitにする ・operator EEolType()をexplicitにする
|
✅ Build sakura 1.0.3616 completed (commit cec5632744 by @berryzplus) |
|
✅ Build sakura 1.0.3617 completed (commit ae32670d4a by @berryzplus) |
|
SonarCloud Quality Gate failed. |
|
✅ Build sakura 1.0.3618 completed (commit c9dc7a4572 by @berryzplus) |
|
レビューありがとうございます。マージしちゃいます。 |
| extern const EEolType gm_pnEolTypeArr[EOL_TYPE_NUM]; | ||
|
|
||
| #include "basis/SakuraBasis.h" | ||
| constexpr auto EOL_TYPE_NUM = static_cast<size_t>(EEolType::code_max); // 8 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
もとのコメント時点からそうですけど、これ8じゃなくて正確には7ですね、これ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
大昔、 EOL_LFCR という定義があった時代には正しかったようです。
修正しても良かったですが、いったんそのままにしました。
なお、この定数はいずれ削除するつもりです。
PR の目的
SonarCloudの警告を減らし、メンテナンスしやすいアプリに近づけることが目的です。
カテゴリ
PR の背景
SonarCloud解析で、以下のBugs(Critical)レベル警告が検出されています。
超訳:コピー演算子を定義するときは、デストラクタ、コピーコンストラクタ、ムーブコンストラクタ、ムーブ演算子がコンパイラにより意図しない形で自動生成されることを防ぐため、これらを明示的に定義してください。
問題のあるコードはこれです。
sakura/sakura_core/CEol.h
Lines 88 to 89 in d65f986
単純な対処としては、削ってしまうか、他4種類のコンストラクタ・デストラクタ・演算子を追加してあげれば良いです。
CEol型はサクラエディタの中核を成すデータ型です。
そこで、今回は SonarCloud 指摘を「キッカケ」と考えて、
「行終端子」を扱うコードを全体的にリファクタリングしてみました。
PR のメリット
PR のデメリット (トレードオフとかあれば)
enum EEolTypeをenum class化する影響で、修正範囲が大変広いです。仕様・動作説明
説明されても分からんと思うので、ごく簡単にポイントだけ書きます。
EEolType型 「行終端子」を表す型です。
定義には無効な値を含んでいます。
CEol型 行末記号の種類を保持する型です。
EEolType型の定数を使って行末記号を保持します。
保持できる値は、有効な「行終端子」または「行終端子なし」のみです。
Rule-of-Five 👈 SonarCloud指摘はこれ。
必要があるなら全部書けルール
Rule-of-Zero 👈 PRの対処内容はこれ。
必要がないなら書くなルール
C++11 を利用できる場合、列挙型には
enum classを使うべきらしいです。enum型 EOL_NONEとか書きます。int型と暗黙変換できます。C言語互換です。enum class型 EEolType::noneとか書きます。暗黙変換できません。explicitが使えます。PR の影響範囲
テスト内容
テキトーなファイルを開いて「名前を付けて保存」してみてください。
「改行コードを変換できること」を確認すれば結合テストになります。
関連 issue, PR
#1605
#1504
参考資料