-
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
外部コマンド実行でキャンセルした時のメッセージが異なる問題を修正 #1721
外部コマンド実行でキャンセルした時のメッセージが異なる問題を修正 #1721
Conversation
✅ Build sakura 1.0.3903 completed (commit dcc6e4666c by @beru) |
@@ -570,7 +570,7 @@ bool CEditView::ExecCmd( const WCHAR* pszCmd, int nFlgOpt, const WCHAR* pszCurDi | |||
if( bCancelEnd && bOutputExtInfo ){ | |||
// 2006.12.03 maru アウトプットウィンドウにのみ出力 | |||
//最後にテキストを追加 | |||
oa.OutputW( LS(STR_EDITVIEW_EXECCMD_STOP) ); | |||
oa.OutputW( CLoadString().LoadStringW(STR_EDITVIEW_EXECCMD_STOP) ); |
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.
CSelectLang.h/cppのコード上のメソッド名定義はLoadString
ですね。
WIN32APIのマクロによりLoadStringW
に置換されるのだと思いますが、サクラ上の定義とは食い違います。
たぶんここはWなしのLoadStringのほうにしたほうがいいと思います。
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.
指摘ありがとうございます。 d0d63b7 で修正しました。
✅ Build sakura 1.0.3904 completed (commit 90f20ba942 by @beru) |
何がいけなかったんですかね? |
@@ -570,7 +570,7 @@ bool CEditView::ExecCmd( const WCHAR* pszCmd, int nFlgOpt, const WCHAR* pszCurDi | |||
if( bCancelEnd && bOutputExtInfo ){ | |||
// 2006.12.03 maru アウトプットウィンドウにのみ出力 | |||
//最後にテキストを追加 | |||
oa.OutputW( LS(STR_EDITVIEW_EXECCMD_STOP) ); | |||
oa.OutputW( CLoadString().LoadString(STR_EDITVIEW_EXECCMD_STOP) ); |
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.
全く分からんです。
この直し方で修正するってことは、他にも「直さないといけない箇所」がたくさん出てきそうで、影響調査とかめんどいです。
oa.OutputW()の呼出し箇所すべてで考慮が必要ですよね?
渡された引数の内容を処理完了までキープしておく責任があるのは呼ばれた側のような気がします。
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.
oa.OutputW()の呼出し箇所すべてで考慮が必要ですよね?
呼び出し箇所で問題が起きそうかどうかの見極めは必要だと思います。
文字列リテラル等の定数値を渡している箇所については特に問題無いと思います。
スタック上の文字列領域もリエントラントなので多分大丈夫だと思います。
LSマクロはstatic記憶領域の変数を使う CLoadString::LoadStringSt
の呼び出しになりリエントラントではなく問題が発生しました。
OutputW
で Grep したところ他にLSマクロと組み合わせて使用している記述は見当たりませんでした。
なので多分大丈夫な気もしますが、考慮漏れで同様の問題が起きる可能性は否定出来ません。
まぁワニワニパニック大好きなのでその時はまたなんとかすれば良いと思います。変更をする事で不具合がたくさん追加されるとかだとさすがにまずいと思いますが。。
渡された引数の内容を処理完了までキープしておく責任があるのは呼ばれた側のような気がします。
それは一概に言い切れないケースバイケースだと思います。
bool COutputAdapterDefault::OutputW(const WCHAR* pBuf, int size)
こういうプロトタイプのメソッドの呼び出しですが、第1引数のポインタが指す領域の内容が変わる事は、少なくとも利用する呼ぶ側では意識しないと思います(なのでLSマクロのままにしたいんだと言われたら納得しちゃいそう)。呼ばれる側の実装でもなかなか意識しにくいので問題が生じうる実装になっているのではないかと。
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.
影響確認実施済みなのは了解しました。
また、oa.OutputW()の呼ばれた側で対策するのがつらいのもなんとなく分かりました。
問題発生のメカニズムについては、#1720 (comment) に書かれている通り、下記の流れで問題が起きているんじゃないかと思います。
LSマクロがstatic記憶領域の変数を使う CLoadString::LoadStringSt の呼び出しになりリエントラントでは無いのが問題の根本的な原因です。ただLSマクロは使用頻度が高いのでメモリの動的確保を避ける為にstatic記憶領域を使う実装にした判断はなかなか否定出来ないです。 他に考えられる対策としては GUIのデザインが問題が起きうる操作を誘発している気がしますが、まぁ古いソフトなのでしょうがないですね。 |
妥協できる直し方を書いてみます //最後にテキストを追加
oa.OutputW( LS(STR_EDITVIEW_EXECCMD_STOP) ); 👇 // L"\r\n中断しました。\r\n"
std::wstring msg( LS(STR_EDITVIEW_EXECCMD_STOP) );
oa.OutputW( msg.c_str(), (int)msg.length() ); ・OutputWの処理内容を説明する無駄なコメントを削除。 こういう書き方にするメリットは、普通の人でも「ちょっと待て!」と言えるようになることです。 |
berryzplusさんがその書き方にしたいならそうします。ちなみに大文字の単語 個人的には |
「その書き方にしたいかどうか」は自明だと思いますが 😃
ほぼほぼお察しの通りです。 「標準的な記述プラスアルファ」にしておけば、
「異常者」と看做したつもりはないです。
👇
というわけで、総合的に見て結論は「妥協できる」になりました。 |
回答ありがとうございます。特にこの変更に関してこだわりがあるわけではないのでberryzplusさんが書いてくれた内容で更新しておきました。
事情を知らない人が見ると文字列型の一時変数にどうしてコピーしてるんだろう?と思うかもしれないですね。
命名はなんだか悩ましいですね。 |
Kudos, SonarCloud Quality Gate passed! |
✅ Build sakura 1.0.3910 completed (commit 2acbd09a5d by @beru) |
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.
対応ありがとうございます。
コードの意図を1行コメントで追加したほうがいいかも・・・と思ったので気が向いたら別件で追加修正の提案を出すかも知れません。
レビューありがとうございました。Mergeします。 |
PR の目的
#1720 で報告された、外部コマンド実行でキャンセルした時のメッセージが異なる問題を修正するのが目的です。
カテゴリ
テスト内容
テスト1
手順
関連 issue, PR
#1720