-
Notifications
You must be signed in to change notification settings - Fork 163
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
DetectJisEscseq 関数の第2引数の型を int から size_t に変更 #1555
DetectJisEscseq 関数の第2引数の型を int から size_t に変更 #1555
Conversation
DetectJisEscseq 関数呼び出し時に引数の型が異なる為に出る警告を無くすためにキャストを追加
✅ Build sakura 1.0.3483 completed (commit bae6eb9b86 by @beru) |
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.
PR趣旨に賛同します。
不要なキャストを入れてる気がするので、そこを気にして一旦コメントにします。
なんかの間違いかと思いますが、一応以下突っ込んでおきます。
for ループの前で
pr
とpr_end
の値は下記のようにして設定されています。pr = pS; pr_end = pS + nLen;そして
nLen
変数の型はint
なのでpr_end - pr
の演算結果の値は必ずint
に収まるので暗黙的にint
にキャストしても実質的に問題は無いはずなんですが、コンパイラはそういう背景はお構いなしに警告を出します。
ここがダウトです。
nLen
変数の型はint
なのでpr_end - pr
の演算結果の値は必ずint
に収まる
pr
もpr_end
もポインタなので、数値じゃないです。
ポインタの加減算の演算結果は ptrdiff_t
になります。
WindowsはLLP64 なので x64
だと ptrdiff_t
が int
に収まらなくなります。
なお、該当コードは単体テストのカバー範囲に含まれるため、追加のテストは不要と思います。
ん?これは「キャストを付けないと警告が増える」と言ってますかね。 |
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.
実際にビルドして確認しました。
バージョン | 警告数 |
---|---|
変更前 | 608 |
このPR | 607 |
修正提案ver | 607 |
以上により、charset/codechecker.cpp
の 371 行目のキャスト追加は不要と考えられます。
型の話ではなくて取り得る値の範囲の話だと思いますが。 |
すみません、なんか違う話をされていますかね。 sakura/sakura_core/charset/codechecker.cpp Line 356 in b2178a2
宣言型がポインタである以上、引き算の結果型は |
Co-authored-by: berryzplus <berryzplus@gmail.com>
レビューありがとうございます。
|
Kudos, SonarCloud Quality Gate passed! 0 Bugs No Coverage information |
✅ Build sakura 1.0.3484 completed (commit b9f0381ded by @beru) |
第2引数の型の種類を変更したのと、関数呼び出し時に引数の型が異なる為に出る警告を無くすためにキャストを追加しました。
PR の目的
x64 ビルドで警告が大量に出るのでそれを減らす事が目的です。
このPRでは1つの警告しか減りませんが、千里の道も一歩から、という事で少しずつでも減らしていければと思います。
今回変更した関数の呼び出し元の
_CheckJisAnyPart
関数の第2引数が「チェック対象となるバッファの長さ」ですがこれがint
です。追っていくとCESI::SetInformation
以下の呼び出しがバッファ長の引数の型がint
なのでsize_t
に変えるべきです。カテゴリ
PR の背景
x64 のビルドで警告が大量に出る事が #430 で話されています。
PR のメリット
ビルド時の警告が1つ減ります。
PR のデメリット (トレードオフとかあれば)
あまり色々な型を区別して使いたくない人にとってはコードの可読性は落ちると思います。
ptrdiff_t
からsize_t
への cast は functional notation で行っていますが、人によって好き嫌いがありそうです。仕様・動作説明
DetectJisEscseq
関数は_CheckJisAnyPart
関数から呼び出しています。第2引数に渡す値は
pr_end - pr
というポインタの差分の演算で作られます。ポインタの差分値の型は
ptrdiff_t
という typedef された型で扱うべきですが、定義は以下のようになっています。C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\vcruntime.h
からコピペしました。for ループの前で
pr
とpr_end
の値は下記のようにして設定されています。そして
nLen
変数の型はint
なのでpr_end - pr
の演算結果の値は必ずint
に収まるので暗黙的にint
にキャストしても実質的に問題は無いはずなんですが、コンパイラはそういう背景はお構いなしに警告を出します。前置きが長くなりましたがこのPRでは
pr_end - pr
の結果をsize_t
にキャストしています。DetectJisEscseq
関数の第2引数の型を変更したのに合わせていますが、どうしてint
からsize_t
に変えたかというと一般的にバッファ長等の負の値を取りえない長さの値の型はsize_t
にするからです。処理内容的には文字列の先頭にあるかもしれないエスケープ文字列を検出するだけなのでint
型で十分サイズは収まって問題はありませんが、警告を取るためだけに変更を行いました。PR の影響範囲
DetectJisEscseq
関数とそれを呼び出している_CheckJisAnyPart
関数です。呼び出し元をたどっていくと日本語コードセット判定を行う
CESI::CheckKanjiCode
になり、文字コード種別の判定で使われます。テスト内容
テスト1
README.md
ファイルを開くREADME.md
ファイルを文字コードセット JIS でデスクトップに保存(ファイル > 名前を付けて保存)README.md
ファイルを開いて正常に読み込めることを確認する関連 issue, PR
#430 #1541