-
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
Wnd_GetText が一文字取りこぼす問題に対処 #1528
Wnd_GetText が一文字取りこぼす問題に対処 #1528
Conversation
✅ Build sakura 1.0.3420 completed (commit 1bab43a975 by @k-kagari) |
テストを書いてようやく気が付きましたが、問題が起きるのは GetWindowTextLengthW の結果が basic_string::capacity と同じ値だった場合に限られます。display がダメだったのは MSVC の basic_string の capacity のデフォルト値が7だからです。 発生条件が限られていたため今まで発覚しなかったのでしょう。 |
2f19369
to
ad4b0cd
Compare
✅ Build sakura 1.0.3421 completed (commit fd8966f248 by @k-kagari) |
ad4b0cd
to
d4a3547
Compare
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3422 completed (commit 5f15d9a342 by @k-kagari) |
レビューありがとうございました。 |
PR の目的
#1525 で報告された問題に対処します。
カテゴリ
仕様・動作説明
問題の箇所は GetWindowTextLengthW で必要文字長を取得し、必要分のバッファを確保して、 GetWindowTextW にバッファ長を渡しているところです。
ここで問題になるのが API が扱う文字列長にnull文字を含むものと含まないものが混在していることで、GetWindowTextLengthW が返すのはnull文字を含まない長さですが、GetWindowTextW はnull文字を含めた長さを要求するので、どこかで1を足さなければ結果の文字列が1文字不足します。
提案する修正では basic_string::capacity() に1を足して GetWindowTextW に渡します。data() + size() にnullを書き込む操作を行いますが、C++17 では安全です。
PR の影響範囲
ApiWrap::Wnd_GetText を利用しているすべての箇所で挙動が変わります。
テスト内容
#1525 を参照してください。
関連 issue, PR
#1439