-
Notifications
You must be signed in to change notification settings - Fork 167
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
マクロMakeStringBufferW0を廃止する #1203
マクロMakeStringBufferW0を廃止する #1203
Conversation
CShareData_IO::ShareData_IO_Type_Oneから CBlockComent,CLineCommentの入出力を分離。 メソッド内に固定サイズのローカルバッファを用意することにより、 MakeStringBufferW0(バッファサイズ不明)を利用しなくて良いように改善。
41679da
to
37d6c34
Compare
✅ Build sakura 1.0.2635 completed (commit 3b8584854e by @berryzplus) |
✅ Build sakura 1.0.2636 completed (commit e2c66ea0ae by @berryzplus) |
cBlockComment.SetBlockCommentRule( szFrom, szTo ); | ||
} | ||
|
||
return ret; |
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.
好みの問題かもしれませんが下記の書き方にした方が読み易いと思います。
WCHAR szFrom[BLOCKCOMMENT_BUFFERSIZE];
WCHAR szTo[BLOCKCOMMENT_BUFFERSIZE];
bool ret;
if( cProfile.IsReadingMode() ){
//対になる設定が揃った場合のみ有効
ret = cProfile.IOProfileData( pszSectionName, pszEntryKeyFrom, MakeStringBufferW( szFrom ) )
&& cProfile.IOProfileData( pszSectionName, pszEntryKeyTo, MakeStringBufferW( szTo ) );
// 読み込み後処理
if( ret ){
cBlockComment.SetBlockCommentRule( szFrom, szTo );
}
}
else{
// 書き込み準備
::wcscpy_s( szFrom, cBlockComment.getBlockCommentFrom() );
::wcscpy_s( szTo, cBlockComment.getBlockCommentTo() );
//対になる設定が揃った場合のみ有効
ret = cProfile.IOProfileData( pszSectionName, pszEntryKeyFrom, MakeStringBufferW( szFrom ) )
&& cProfile.IOProfileData( pszSectionName, pszEntryKeyTo, MakeStringBufferW( szTo ) );
}
return ret;
CDataProfile::IOProfileData
のメソッド呼び出しの記述が重複しちゃってますが、、まぁ…。
cLineComment.CopyTo( nDataIndex, lbuf, pos ); | ||
} | ||
|
||
return ret; |
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.
下記の書き方にした方が読み易いと思います( https://github.com/sakura-editor/sakura/pull/1203/files#r386084038 と同様)。
WCHAR lbuf[COMMENT_DELIMITER_BUFFERSIZE];
bool ret;
int pos;
// 書き込み準備
if( cProfile.IsReadingMode() ){
//対になる設定が揃った場合のみ有効
ret = cProfile.IOProfileData( pszSectionName, pszEntryKeyComment, MakeStringBufferW( lbuf ) )
&& cProfile.IOProfileData( pszSectionName, pszEntryKeyColumn, pos );
// 読み込み後処理
if( ret ){
cLineComment.CopyTo( nDataIndex, lbuf, pos );
}
}
else{
::wcscpy_s( lbuf, cLineComment.getLineComment( nDataIndex ) );
pos = cLineComment.getLineCommentPos( nDataIndex );
//対になる設定が揃った場合のみ有効
ret = cProfile.IOProfileData( pszSectionName, pszEntryKeyComment, MakeStringBufferW( lbuf ) )
&& cProfile.IOProfileData( pszSectionName, pszEntryKeyColumn, pos );
}
return ret;
(このPRではなくそれ以前の)元実装に色々と気になる点があります。 元実装では書き込みモード時に どうしてそういう実装になっているのを推測するに 下記のメソッドが呼び出しされますが、 void value_to_profile(const StringBufferW& value, wstring* profile)
{
*profile = value.pData;
} さて |
まぁ、サイズが分かる型のみをサポートしてるはずなのにサイズチェックはしてないんで、溢れたら落ちる間抜け実装なんですよね 😄 このPRの背景には、溢れたら落ちるを解消したい、ってことも含まれています。 IOProfileData系のメソッドが設定値に非const型を要求するのは、読み取りと書き込みの処理を別々に書いてどちらかを書き漏らすトラブルを防ぐためかと思っています。普通はやんないと思うのでそれって杞憂ですよね。 既存コードの突っ込みどころには、一括置換で対処できるもの以外できれば触れたくないです。 このPRが通ると、StringBufferWを「サイズが判明している書き込み可能なバッファを参照するクラス」に定義しなおせるようになります。 現状で5,6個ある文字列系クラスは、たぶん |
元のコードを実装した人がNUL終端文字列をサポートしなかった理由はもはや想像の世界ですね…。
元の実装でそういうケースがあるという事でしょうか?
読み書きのシリアライズ処理は工夫すれば読み書きの記述を結構共通化出来るのでサクラエディタの記述を見るともっとスマートに書けるだろう的に思ってしまいますが、現実的にはコード量が多いしケースバイケースなとこも多いから結局茨の道かもと思って変更諦めました。
うーん、でも分岐が多いと流れが追いにくいです…。まぁそんな長くないので無理難題ではないですが…。IOProfileDataの重複記述はクロージャを使えば解消出来ると思いますが、そうする事で可読性が上がるかは微妙なとこですね。
そもそもバッファ参照用の型なのに名前が
自前型を用意しないでも |
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のメリット(というか現状の実装だとどういうケースで問題が有るのか)がちょっと分かっていませんが、動作としては害は無いと思います。
こちらですが実使用で溢れて落ちる挙動に入るケースが判明しているなら、再現確認をしたいので記載してもらえると助かります。というか仮に実使用で落ちるパターンがあってそれが修正されるならカテゴリがリファクタリングだけではないですね。 |
ここの使用例だと落ちません。 このコメント #1203 で指摘されてるとおり、 この点をクローズアップして対策すると だからといって、このPRで提案している「 |
あれ、というか approve もらってますね(キヅイテナカッタ |
自分が確認した限りでは
自分の考えはそれとは違います。まず
下記のマクロ実装は時代遅れなので排除する事自体は良いと思います。
オーバーロードするコンストラクタでテンプレート引数から固定長配列の要素数は取得出来るので、 ただあえて動作しているものを無暗に触るなと〆られる可能性も…。 |
設定ファイルに書き込むモードは、設定値から値を読み取るモードです。 MakeStringBufferW0 の問題は、設定値に値を書き込みたいときに書き込んでよいサイズが不明である点にあります。実際の利用が、設定値から値を読み取る場合のみに使われているので問題ないって話でした。 分かりづらいコメントしててすんません。 |
その変更自体は次のPRで予定しています。設定値と
これは正直やりたいんですが、いっぱい変更しているように見えるので次のPRには含めないかもしれません。 |
ん?完全なフリー関数と public static なメンバ関数って違う・・・?w |
レビューありがとうございました。 |
C言語で static 関数というとファイルスコープに限定した関数ですね。 |
ではフリー関数として公開する方法で精査していきます。 名前重複があるとめんどいんで namespace を使う感じになると思います。 検討している候補は 設定ファイル読込イメージstd::wstring profile = L"255";
int value = 0;
bool ret = basis::TryParse( profile, value ); //元profile_to_value関数 設定ファイル書込イメージint value = 255;
std::wstring profile;
profile = basis::ConvertToString( value ); //元value_to_profile関数 PRまでには2~3日かかると思います。 |
…_anaware_of_buffer_limits マクロMakeStringBufferW0を廃止する
PR の目的
文字列バッファ参照
StringBufferW
を「サイズ指定なし(=0)」で作成するためのマクロMakeStringBufferW0
を廃止します。 変更により、StringBufferW
のサイズが「不明」であるケースを考慮しなくて良くなります。sakura/sakura_core/CDataProfile.h
Lines 45 to 47 in 32f03fd
StringBufferW(S,0)
は書き込める文字が 0 文字(=不明)ということです。カテゴリ
PR の背景
サクラエディタの設定読み取り機構にはなんか問題がある気がする(根拠なし
↓
#1152 [WIP] CDataProfileクラスの今後のリファクタリング予定を晒してみる
↓
#1188 設定項目がなかったらデフォルト設定を使うようにしたい
↓
CDataProfileで読み取り失敗を検出できるようにする、を作ろうとしてみた
↓
読み取り失敗の検出と全然関係ない変更をしないといかんことに気付いた(いまここ
PRの中身自体は #1152 で見せた一連のコミットの1つをそのまま使っています。
(しょーもない書き間違いを見つけたので修正して force-push しました 😭 )
やっていること
理由
対策内容
PR のメリット
StringBufferW
のサイズが「不明(=0)」であるケースを考慮しなくて良くなります。読み取ったデータサイズが書き込み可能データサイズを上回っていたら「失敗」にできるようになります。
PR のデメリット (トレードオフとかあれば)
PR の影響範囲
関連チケット
#1152 [WIP] CDataProfileクラスの今後のリファクタリング予定を晒してみる
#1188 設定項目がなかったらデフォルト設定を使うようにしたい
参考資料