CEDEC2015のCoverityクイズをどう直すかおおたの物置CEDEC2015のCoverityクイズをどう直すか2015-08-29cppTweetCEDEC2015では、Coverity社のブースでバグのあるコードが掲示されていました。バグが入ったC++コードらしい。26バグがあるかどうかはCoverityが検出してくれるとして、じゃあどう解決すれば良いのか?を考えました。配列の添え字と同じ値を入れたい処理は2つのクラスで共通化したいという要求があると考えます。(zに値を入れないが元コードもそうなのでよしとする)また、簡単化のために与えられるデータは全て正しいと仮定します。(実際は適切な箇所でエラーチェックが必要)テンプレートでキャストを回避する今回のバグは暗黙的キャストが行われ、かつキャストした状態でアドレス計算をするのが問題のため、キャストされないように、テンプレートを使って両方のクラス用の関数を用意する事で回避する方法です。0;}アドレス計算を先にする型が違う状態でアドレス計算しているのが問題なので、アドレス計算部分を外に出してしまう方法です。関数ではなくクラスにメソッドとして持たせるとより良さそうです。この場合、他の誰かが元コードのような処理を書くことを防げません。0;}設計から変える意図的にバグを入れているコードに対して、全体を書き換えるのはナンセンスな気がしますが、たぶんこういうことをする前提なら最も良い書き方はこうではないかと。型が違う状態でアドレス計算が行われることはありません。ota42yC++/Ruby/RoR/golang/rust/flutter。