クリップボード独自形式の長さフィールドを32bit固定に戻す - #2557
Conversation
|
berryzplus
left a comment
There was a problem hiding this comment.
対応ありがとうございます。
以下のフィールド名変更は、そのうち元に戻すと思います。
GlobalSakura::size_type = size_t; //TODO: int32_t に戻す
↓ リネーム
GlobalSakura::LengthFieldType
(名前が長い、「より分かりやすい」には見えない。)
レビューありがとうございます。 STLにもsize_typeがあるので個人的には違う名前が良いです。 |
|
ご対応ありがとうございます。 以下 1 点だけ気になりました。 長さフィールドの型が 2 箇所で独立に定義されている
両者が一致していることを保証しているのが現状コメントだけなので、将来どちらか片方だけが書き換えられてもビルドもテストも通ってしまい、異なるビルド間でコピー&ペーストしたユーザーだけが文字化けに遭遇する、という #2325 と同じ壊れ方を再現できてしまいます。本 PR がまさに「同一レイアウトを扱う箇所で型定義がずれていた」ことを直すものなので、統一を検討して頂ければと思いました。
|
「STLの命名法則嫌い」は分からなくないです。 STLっぽく使う意図を読み取りやすくしておくことで、 |
STLの命名規則については受け入れるしかないし好き嫌いとかは無いんですが、コードの読解をちゃんとしていない状態で
手続きを種別毎に書くやり方じゃなくて型でうまく分けていく書き方に寄せたいという事ですかね? CClipBoard.cpp 側での適用は現時点では出来ていないので、理想と現実との距離を埋めるのは大変そうです。 |
SAKURAClipW形式の先頭に置く文字数フィールドの型がsize_tになっており、x64/ARM64 ビルドでは8バイト、Win32ビルドでは4バイトとレイアウトが食い違っていた。このため 異なるビット数のビルド間や過去バージョンとの間でコピー&ペーストするとデータ位置が 4バイトずれ、文字化けやクラッシュを起こしていた。 長さフィールドの型をint32_t固定のSAKURAClipW_LengthFieldTypeとして定義し直し、 クリップボードとドラッグ&ドロップの読み書きで使う。表現できない長さのときは独自形式を 設定せずCF_UNICODETEXTのみとする。読み込み側にはGlobalSizeによる上限クランプを 追加し、壊れたデータや他ビルドが書き込んだデータを読んでも確保領域外を参照しない ようにした。 sakura-editor#2325 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
GlobalSakuraがサクラエディタ独自クリップボード形式SAKURAClipWを扱う クラスであることがクラス名にもコメントにも書かれておらず、実装を読まないと 用途が分からない状態だった。クラスコメントに対応形式とバイナリレイアウトを 明記し、他のGlobal*クラスにも対応形式を1行で追記する。 また文字数フィールドの型がCClipboard::SAKURAClipW_LengthFieldTypeと GlobalSakura::LengthFieldTypeの2箇所で独立に定義されており、一致保証が コメントだけだった。片方だけ書き換えてもビルドもテストも通ってしまい、 issue #2325と同じ壊れ方を再現できるため、CClipboard側の定義を唯一の正とし、 os.cppでそのエイリアスとしてsize_typeを定義する形に改める。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
e35978f to
7a1a3ca
Compare
|
Approveしていただいた後で申し訳ないですが、レビューコメントに対応する変更を行いました。 |



自分が #2067 で入れた不具合を放置していてすみません。@hpmy-dev さんが修正PR(#2450, #2453)を作ってくれたのですが差分内容がちょっと過大に感じたので別途PRを作成しました。単純に 2b921e0 をrevertで済む問題ではなかったのでClaude Codeに修正してもらいました。
PR対象
カテゴリ
PR の背景
#2325
仕様・動作説明
SAKURAClipW形式の先頭に置く文字数フィールドの型がsize_tになっており、x64/ARM64 ビルドでは8バイト、Win32ビルドでは4バイトとレイアウトが食い違っていた。このため異なるビット数のビルド間や過去バージョンとの間でコピー&ペーストするとデータ位置が4バイトずれ、文字化けやクラッシュを起こしていた。
長さフィールドの型をint32_t固定のSAKURAClipW_LengthFieldTypeとして定義し直し、 クリップボードとドラッグ&ドロップの読み書きで使う。表現できない長さのときは独自形式を設定せずCF_UNICODETEXTのみとする。読み込み側にはGlobalSizeによる上限クランプを 追加し、壊れたデータや他ビルドが書き込んだデータを読んでも確保領域外を参照しないようにした。
テスト内容
32bit版と64bit版を両方起動して相互でコピペが問題無く行える事を確認した。
関連 issue, PR
#2067 #2325 #2331 #2435 #2453 #2556