-
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
StaticString::Length()の戻り値をintにキャストする #1564
StaticString::Length()の戻り値をintにキャストする #1564
Conversation
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3503 completed (commit 4de08c1736 by @berryzplus) |
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.
本来は負の値を取らない長さやサイズ用の型なので色々と size_t
にするべきだと思います。
動的確保はしない用途向けの型なので実際に INT_MAX
より大きい値が使われる事は無いと思いますが、宣言上の型は明確に用途に適したものにした方が良いかなと…。
分かりやすく例えていうとJRAの馬運車の見た目が右翼の街宣車になっていても機能的には問題無いかもしれないけれど適さないという外観上の話です。
最終的には それをやると修正範囲が広がってしまうので、このPRは内部的な縮小変換にキャストを付けることにより、警告を潰そうとしています。「潰しても問題ない」と判断するのに十分な客観的な理由を提示できていると考えていて、「警告を潰すためにやみくもに付けるキャスト」とは異質だと思っています。 |
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.
x64考慮が不十分でコンパイラ警告が出てしまう件は解決できてそうに見えました。
「サイズを返すメソッドの戻り型にintを採用しているのは誤りかも?」には同感ですが、x64対応とは関係ない話題だと思います。
本来は |
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.
その対応で問題ないと思います。
レビューありがとうございます。マージしちゃいます。 |
これについては近年対立する意見が浸透してきています。signed と unsigned との変換はバグの温床であるため最小限にするべきものですが、最終的な結果が常に正の値になる計算であっても中間結果が負になることは考えられるため、可能な限り signed に統一したほうがよい、というものです。std::ssize が C++20 に入ったのはこの手の主張を反映しています。Google C++ Style Guide は size_t を historical accident とまで呼んでいたりします。 私個人の感覚としては、int で事足りるなら int のままで良いと思います。unsigned という十分に注意しないとバグが出る型は使わないに越したことないですし、値域が足りないなら1ビット増やしても焼け石に水というやつだと思います。 |
この発言は変でしたね。値域が足りないならビット幅を明示したほうがいい、に訂正します。 |
おお、勉強になります。説明ありがとうございます。 unsigned型は気を付けないと不具合を生むよというのはその通りですね。やねうらおさんも昔ブログに書いていた気がします。unsigned型の変数の四則演算でも減算の記述が有ると被減数より減数の方が大きい場合に演算結果が本来はsigned型で表現するべき値になるので問題になりますね。プログラマが気を使ってなるべく不具合が無いようにするべきですが人間なので見逃す事はよくあると思います。 clang だと
x64ビルドでの警告除去はケースバイケースでの対応になると思いますが、警告を無くすために |
PR の目的
x64対応のために、x64ビルドで発生する警告に対処します。
カテゴリ
PR の背景
#1541 で x64 対応ブームが始まったので対応してみます。
PR のメリット
x64 ビルドの警告が 2個減ります。
PR のデメリット (トレードオフとかあれば)
とくにありません。
仕様・動作説明
変更対象は、独自定義の拡張配列に格納された文字数を返す関数です。
独自関数auto_strlen()はsize_tの値を返しますが、関数の戻り型定義がintであるため、
暗黙の縮小変換となってコンパイラが警告を吐いています。
StaticStringはスタックまたは共有メモリ上に固定サイズの配列を確保するための型です。
文字列長がINT_MAXな場合、配列サイズは4GBになります。
「スタックに4GB確保」はありえないので、問題になる可能性があるのは共有メモリのみになります。
x64化したからといって、共有メモリにそんなバカでかいデータを載せたいかというと、それもありえないと思います。
発生しているのは暗黙の縮小変換に対する警告のみです。
PRでは、より安全性の高い
auto_strnlen
を使うように修正しています。PR の影響範囲
実害はありません。
テスト内容
すでに作成している単体テストがカバーする範囲の修正であるため、追加のテストは不要と考えています。
関連 issue, PR
#1563
#1541
参考資料