sakura icon indicating copy to clipboard operation
sakura copied to clipboard

SonarCloudにBugだと言われているものを対処したいなぁという話。

Open berryzplus opened this issue 4 years ago • 10 comments

Bug だと言われているもののうち最高レベルの Blocker は43件で、内訳は以下のような形です。

  • 27件 = 文字列操作(範囲外参照の可能性)
  • 6件 = 「std::make_unique の戻り値がリークする」という内容の警告(??)
  • 4件 = std::forwardの使い方 (#1477)
  • 3件 = 文字以外の配列操作
  • 2件 = オブジェクト外への参照を戻り値にしている
  • 1件 = 継承元クラスへのスライシング

特に文字列操作についてよく怒られているわけですが、適切に範囲チェックしているのに分析器がそれを検出できてないのが実態であるように見えます。 C文字列を使ってはいけない。すべて std::string にするべきだ。ということを言いたいようですが。 1万9千件もある Code Smell についての警告も大部分がそういう内容ですし、コードベース全体で審査に合格するのはきっと途方もなく大変です…。

PR などで追加・修正した部分だけ Quality Gate 適用できたらいいなあ、と思います。

Originally posted by @k-kagari in https://github.com/sakura-editor/sakura/issues/1476#issuecomment-738895981

berryzplus avatar Jan 12 '21 11:01 berryzplus

特に文字列操作についてよく怒られているわけですが、適切に範囲チェックしているのに分析器がそれを検出できてないのが実態であるように見えます。

問題とされた箇所をざっと眺めて得た印象からの発言でしたが、その後 #1483 と #1489 でバッファオーバーランが2件見つかっています。 一見すると正しいようでコーナーケースを網羅できていない事例が他にもありそうだな、というのが今の印象です。

kengoide avatar Jan 12 '21 13:01 kengoide

最終的に C++ ソース部分の Bugs と Security Hotspot は駆逐したいです。

https://github.com/sakura-editor/sakura/issues/1506#issuecomment-761284972

量が量なので複数人の参加が望ましいと思いますが、誰がどこに着手中かが分かるようにしなければ同じところで作業する事態が起きそうです SonarCloud に Assigned 欄があるので活用したいですね。

kengoide avatar Jan 16 '21 08:01 kengoide

量が量なので複数人の参加が望ましいと思いますが、誰がどこに着手中かが分かるようにしなければ同じところで作業する事態が起きそうです SonarCloud に Assigned 欄があるので活用したいですね。

いったん Assigned でいいと思います。

  1. 自分で Assigned にする
  2. Bugs指摘に対策する
  3. 可能な範囲でテストを書く
  4. PRする。(テスト不可能な範囲が残った状態になる)
  5. マージする
  6. マージ以降30日間はQuality GateがFailedになる

当面はカバレッジはスルーしていくしかないのかなぁ・・・

別件で、現在のカバレッジを少しでも高める内容のPRを検討しています。

berryzplus avatar Jan 17 '21 05:01 berryzplus

インライン関数やテンプレート関数のカバレッジが取れていないかもしれません。int2deccharcode.h の判定関数 などです。

kengoide avatar Jan 23 '21 15:01 kengoide

インライン関数やテンプレート関数のカバレッジが取れていないかもしれません。int2deccharcode.h の判定関数 などです

現状のOpenCppCoverageの限界かも知れません。

対策として考えられるのは

  • インライン関数を使わないようにする
  • 解析対象を x64 - Debug に変える
  • 見なかったことにする

妥当なのは「見なかったことにする」かな? 解析対象を x64 - Debug にするのも可能な対策。

インラインを使わないようにするのは少し難しいですが、おそらく「やったほうがよい」だと思います。

berryzplus avatar Jan 24 '21 05:01 berryzplus

地味な対応を続けた結果、Bugs(Blocker)レベルの警告があと10件になりました。Blockerレベルの警告は分かりづらくてレビューしづらいようなので、一律対応できそうなBugs(Critical)レベルの対応を進めて行こうと思っています。

ちなみにラベルの日本語約は以下である認識です。

  • Blockerレベル = リリースしてはマズいレベルの致命的な誤り。
  • Criticalレベル = 致命的な誤り。
  • Majorレベル = よくある誤り(いわゆる「あるある」。普通は対応する。)
  • Minorレベル = 細かい誤り(対応が必要か、怪しい。)

berryzplus avatar Mar 20 '21 14:03 berryzplus

BlockerレベルのBugsが残り2件になりました。

  • Out of bound memory access (access exceeds upper limit of memory block) https://github.com/sakura-editor/sakura/blob/5135813a52b3339eb94462c66dab6407ac666a9c/sakura_core/charset/CUtf7.cpp#L112 *(pr_next - 1) がメモリ範囲外を参照する可能性があります。

    これは、たぶん誤検知なので実害はないと思います。 UTF-7のデコード処理(バイナリシーケンスから文字列への変換)は概念的に有限オートマトンなので、インスタンスメンバに状態を保持するように書き直したほうが分かりやすくなるはずです。

  • Returned pointer value points outside the original object (potential buffer overflow) https://github.com/sakura-editor/sakura/blob/5135813a52b3339eb94462c66dab6407ac666a9c/sakura_core/types/CTypeSupport.h#L95-L98

    thisnullptr の場合など、*m_pColorInfoArr がオブジェクト外を参照する可能性があります。

    これもたぶん誤検知なので実害はないと考えられます。 原因が分からないので対策が打てないです。 想定している原因は、CFigureSpace::DrawImp_StyleSelect が複雑すぎることとメソッド内の変数定義に const が付いてないことです(片っ端から const 付けたら消えるかもです。

ちょっと対処が難しそうなので、しばらくしたら個別のissueを作成してこのissue自体は閉じてしまおうと思っています。

berryzplus avatar May 27 '21 15:05 berryzplus

#1605 の対応で残った 6件 はこっちのissueで対応していきたいです。

berryzplus avatar Jun 06 '21 15:06 berryzplus

PRが出ていない残件(Critical以上)。

深刻度の高そうな警告の大半を潰せたので、あとはしょーもない警告が残ってるだけだと思っていましたが、何気にそうでもなさそうです。

https://sonarcloud.io/project/issues?id=sakura-editor_sakura&resolved=false&severities=MAJOR&types=BUG

  • HTMLでframeset使うな(しょーもなっ・・・
  • if文のtrue-partとfalse-partが同じです(へぇ~。。。
  • 関数呼び出しの引数が初期化されてません(えっ!
  • ポインタ値がnullptrのobjectを参照しています(マジか!
  • 否定の等価演算子の右辺値が破棄されます(いみふ・・・

このissueは、もう少しの間 keep-alive にしといたほうが良さそうです。

berryzplus avatar Feb 12 '22 18:02 berryzplus

SonarCloudのルールが変更されたことにより、 せっかく減らした警告がまた増えているようです。

variadic paramater形式の関数に CLogicInt とか CLayoutInt とかを渡している部分が Major の Bugsとして検出されるようになった模様。一応、キャストしてあげれば回避はできそう。

berryzplus avatar Jan 15 '23 14:01 berryzplus