-
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
ファイルパスに「ファイルに使えない文字」を含めた場合の処理を改善する #1449
ファイルパスに「ファイルに使えない文字」を含めた場合の処理を改善する #1449
Conversation
szPathのサイズチェックをせずにswprintfに渡しているのでバッファが溢れる危険性があるのを対策する。 strprintfは必要なバッファを動的に再確保するため問題は起きない。
✅ Build sakura 1.0.3215 completed (commit ef1347e2fe by @berryzplus) |
a2589a5
to
a2fb2c0
Compare
✅ Build sakura 1.0.3218 completed (commit 727b07d030 by @berryzplus) |
|
||
// 文字列中の最後のパス区切り位置を検出してファイル名を抽出する | ||
const auto lastPathSep = strPath.find_last_of( L"\\/" ); | ||
const auto strFilename = lastPathSep == std::wstring_view::npos ? strPath : strPath.substr( lastPathSep + 1 ); |
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.
パスからファイル名部分を抽出する記述は他の場所でもあったので関数化した方が良いと思います。
shlwapi.h
に PathFindFileNameW
という関数があるのでそれでも良い気がしますがどうでしょうか?
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.
PathFindFileNameは :
をパス区切りとして扱うので使えませんでした。
const auto szPath = L"localhost:8080";
const auto pszFile = ::PathFindFileNameW(szPath);
//pszFile is "8080".
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.
こっちは対応すると仕様を満たせないので対応しないです。
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.
localhost:8080
こういうのも扱う必要があるんですね、知りませんでした…。
既存の関数が仕様を満たせないので使えないとしても、同じ記述が他の場所でも追加されたような気がするので別途関数化はした方が良い気がします。というかファイルパスからファイル名を取り出す記述って色々な場所である気がしますが、全体的に統一されてるんでしょうか?
ここについてはコマンドラインに関するところで他の場所の処理とはまた話が違うのでしょうか?
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.
localhost:8080
こういうのも扱う必要があるんですね、知りませんでした…。既存の関数が仕様を満たせないので使えないとしても、同じ記述が他の場所でも追加されたような気がするので別途関数化はした方が良い気がします。というかファイルパスからファイル名を取り出す記述って色々な場所である気がしますが、全体的に統一されてるんでしょうか?
ここについてはコマンドラインに関するところで他の場所の処理とはまた話が違うのでしょうか?
localhost:8080
で分かりづらければ、C:\work\test:001.txt
とかでも良いです。
この関数は、「ファイル名に使えない文字」を検出する関数なので :
は検出できる必要があります。
コマンドラインの処理だから、は関係ないです。
他の処理で冗長な _wsplitpath を使っていて非効率なのは知っています。
ここで話を広げても論点がボヤけて一歩も進めなくなるだけなのでスルーしときます。
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.
既存の関数が仕様を満たせないので使えないとしても、同じ記述が他の場所でも追加されたような気がするので別途関数化はした方が良い気がします。というかファイルパスからファイル名を取り出す記述って色々な場所である気がしますが、全体的に統一されてるんでしょうか?
全体的に統一されてるか?って観点で見ると、サクラエディタはたぶん0点でしょう。
統一できてない理由としては、次のようなことを考えられます。
- 単体テストがないので、実装済みの関数が使い物になるかどうか判断できない
- 自分が触る箇所以外に影響を与える変更を、できればしたくない
CheckXXX → IsXXX
✅ Build sakura 1.0.3219 completed (commit 559ee14b0a 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.
問題なさそうに思います。
レビューありがとうございます。マージしちゃいます。 |
一足先にマージされてしまいましたが、一応コメントしておきます。 NTFSには代替データストリーム(ADS)というものがあり、ファイル名またはフォルダ名に sakura/sakura_core/charset/charcode.h Line 181 in 8acb720
今までの動作では、メッセージでは:がファイル名に使えないと表示されていますが、実際の処理では:をチェックしていません。 OS側の処理として、ドライブレター以外のコロンが2つあったり、パスの途中にあったりした場合はどうなのかとかは、ちょっと知らないです。 |
PR の目的
ファイルパスに「ファイルに使えない文字」を含めた場合の処理を改善します。
カテゴリ
PR の背景
#1420 の修正の一部切り出しです。
問題箇所があまりにも多過ぎるので、普通に理解できそうな小分けのブロックを先出しでPR作成します。
このPRで修正する内容は、 #1283 で解決したい問題を結果的に解決します。
このPRで解決する問題は2つです。
「不具合対策」とすると説明がうっとおしいので、「ただのリファクタリング」として修正します。
PR のメリット
PR のデメリット (トレードオフとかあれば)
仕様・動作説明
Windowsには「ファイル名に使えない文字」があります。
サクラエディタもこれに対応していて、コマンドラインから指定したファイル名が「ファイル名に使えない文字」を含んでいた場合には警告メッセージが出るようになっています。
このPRでは、仕様・動作を変更しません。
テスト内容
新規関数のテストケースを作成しています。
新規関数を利用するコマンドライン解析のテストケースを追加しています。
したがって、追加のテストを実施する必要はないと思われます。
PR の影響範囲
コマンドライン解析の結果に影響する変更です。
関連 issue, PR
#1420
close #1283
参考資料