Skip to content
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

構造体比較にmemcmpを使うのをやめる #877

Conversation

berryzplus
Copy link
Contributor

目的

SonarQube導入PRのレビューで実験的に行った修正を適用します。

SonarQubeの指摘内容

https://sonarcloud.io/project/issues?id=sakura-editor_sakura&open=AWnxcxsuO9B58BDk-CUh&resolved=false&types=BUG

修正内容

構造体の比較でmemcmpを使うと、構造体内のパディング部分の差異で等価判断を正しく行えなくなることがあります。構造体に比較演算子を実装して、比較演算が正しく行われるようにします。

このPRに関しての備考

同種の指摘を全部つぶしにいこう、という意図ではありません。
せっかく修正したしもったいないから入れとこう程度の認識です。

構造体の比較でmemcmpを使うと、構造体内のパディング部分の差異で等価判断を正しく行えなくなる恐れがある。
構造体に比較演算子を定義して、有効なメンバだけを比較するように変更する。
@berryzplus
Copy link
Contributor Author

期待した感じにリンクが作れなかったので貼り直し。
https://sonarcloud.io/code?id=sakura-editor_sakura&selected=sakura-editor_sakura%3Asakura_core%2Fprint%2FCPrintPreview.cpp
1077行目。

GitHub

@m-tmatma m-tmatma added this to the v2.4.0 milestone Apr 29, 2019
文字列比較に_tcscmpではなく_tcsncmpを使う。
完全に同じ構造体同士を比較した場合にバッファオーバランが発生する可能性があるため。
物理的に同じ構造体を比較した場合の判定をショートカットできるようにthis == &rhsの判定を追加。
@m-tmatma
Copy link
Member

あと、単体テストの実装お願いできますか?

変更しない引数にはconst修飾を付けるべきだが付けていなかった。
この変更を適用しておかないと定数との比較ができない。
単体テスト作成中に発見した凡ミス修正。
@berryzplus
Copy link
Contributor Author

単体テスト。書いてみたのはいいんだけど、CodeFactorが警告を発している・・・。

等価演算子/否定の等価演算子のテストなので、
構造体の初期値にテキトーな値を突っ込んでいる。

数値型のテキトーな値といえばmin/maxなわけで、
これならば構造体メンバ定義をコピってきたものをテキスト整形すれば出来上がるわけで、
テストコードもそういう作り方をしたわけだが、それがDuplicateと判定されているわけで。
いまとっても Ignore したい衝動に駆られているわけで・・・:cry:

@berryzplus
Copy link
Contributor Author

いまとっても Ignore したい衝動に駆られているわけで・・・cry

Ignoreしました。

@m-tmatma
Copy link
Member

m-tmatma commented Apr 29, 2019

単体テスト。書いてみたのはいいんだけど、CodeFactorが警告を発している・・・。

何をするテストかのコメントがあってわかりやすいです。

  • m_szPrinterDriverName 等の文字列で NULL 文字がないぐらいデータが詰まっていた時に
    落ちないことと、誤動作しないことの確認があるほうがいいと思います。
  • 上限と下限だけでなく、真ん中らへんのテストもあったほうがいいと思います。(これはこのケースの場合そんなに必要ではないですが)

@berryzplus
Copy link
Contributor Author

ふむ。Release版の単体テストが失敗しておる・・・。

•m_szPrinterDriverName 等の文字列で NULL 文字がないぐらいデータが詰まっていた時に
落ちないことと、誤動作しないことの確認があるほうがいいと思います。

この条件を証明するために、アクセスしてよいメモリ領域とアクセスしてはならないメモリ領域が連続して配置されるように api でゴリゴリして、「アクセスしてはならないメモリ領域にアクセスしました!」という例外(=一般保護違反、セグメンテーションフォールト)を意図的に発生させるようなテストを書いた。

2019-04-30T14:45:11.7427924Z [ RUN      ] MYDEVMODETest.StrategyForSegmentationFault
2019-04-30T14:45:11.7431347Z D:\a\1\s\tests\unittests\test-mydevmode.cpp(303): error: Death test: { ::wcscmp(pValues[0].m_szPrinterDeviceName, pLargeStr); }
2019-04-30T14:45:11.7434257Z     Result: failed to die.
2019-04-30T14:45:11.7437127Z  Error msg:
2019-04-30T14:45:11.7440254Z [  DEATH   ] 
2019-04-30T14:45:11.7443405Z [  FAILED  ] MYDEVMODETest.StrategyForSegmentationFault (146 ms)

エラーメッセージは、死亡想定のアクセス違反コードでセグフォールトが発生しなかった、と取れる内容。とりあえず、このままはマズい・・・。

失敗する原因が不明なので当面は実行しないように対策する。
@berryzplus
Copy link
Contributor Author

•上限と下限だけでなく、真ん中らへんのテストもあったほうがいいと思います。
(これはこのケースの場合そんなに必要ではないですが)

分かってそうだったのであえてスルーしました。
等価比較演算子の良し悪しを判定するのに必要なのは、異なる2つの値です。
上限下限の組み合わせでなくても、0と1とか、255と1024とかでもいいです。
範囲外でない限り、値域に意味はありません。

状況的に中間値付近のテストがどうしても必要と考えているように見えてるんですけど、やっぱり欲しいですか?

@m-tmatma
Copy link
Member

m-tmatma commented May 4, 2019

状況的に中間値付近のテストがどうしても必要と考えているように見えてるんですけど、やっぱり欲しいですか?

いえ、不要です。

@m-tmatma
Copy link
Member

m-tmatma commented May 4, 2019

エラーメッセージは、死亡想定のアクセス違反コードでセグフォールトが発生しなかった、と取れる内容。とりあえず、このままはマズい・・・。

時間がかかりそうなら、チケットだけ作っておいて後回しでもいいです。
そこは臨機応変に。

@berryzplus
Copy link
Contributor Author

エラーメッセージは、死亡想定のアクセス違反コードでセグフォールトが発生しなかった、と取れる内容。とりあえず、このままはマズい・・・。

時間がかかりそうなら、チケットだけ作っておいて後回しでもいいです。
そこは臨機応変に。

対処は完了しています。 ⇒ c0d02c5 (MSVCリリース版ではテストを実行しない

チェック結果が × になってるのはCodeFactorのせいです。
エラー内容を確認しにいくと、No issue Found(1 ignored)となっています。

@berryzplus
Copy link
Contributor Author

レビューありがとうございます。
マージしちゃいます。

@berryzplus berryzplus merged commit b061fb4 into sakura-editor:master May 4, 2019
@berryzplus berryzplus deleted the feature/implements_MyDEVMODE_equals branch May 4, 2019 16:23
m-tmatma added a commit that referenced this pull request May 18, 2019
#877 で導入した単体テストで DISABLED テストを実装
HoppingTappy pushed a commit to HoppingTappy/sakura that referenced this pull request Jun 11, 2019
…ts_MyDEVMODE_equals

構造体比較にmemcmpを使うのをやめる
HoppingTappy pushed a commit to HoppingTappy/sakura that referenced this pull request Jun 11, 2019
…ch-test-count

sakura-editor#877 で導入した単体テストで DISABLED テストを実装
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants