Skip to content
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

ヘッダのプロトタイプ宣言で変数名が省略されて型名しかないものに明示的に変数名を指定する #224

Open
m-tmatma opened this issue Jul 6, 2018 · 18 comments
Labels
refactoring リファクタリング 【ChangeLog除外】

Comments

@m-tmatma
Copy link
Member

m-tmatma commented Jul 6, 2018

ヘッダのプロトタイプ宣言で変数名が省略されて型名しかないものに明示的に変数名を指定する

例えば以下部分

BOOL Command_PUTFILE( LPCWSTR, ECodeType, int ); /* 作業中ファイルの一時出力 maru 2006.12.10 */

cpp では以下のように定義されている。

BOOL CViewCommander::Command_PUTFILE(
LPCWSTR filename, //!< [in] filename 出力ファイル名
ECodeType nCharCode, //!< [in] nCharCode 文字コード指定
//!< @li CODE_xxxxxxxxxx:各種文字コード
//!< @li CODE_AUTODETECT:現在の文字コードを維持
int nFlgOpt //!< [in] nFlgOpt 動作オプション
//!< @li 0x01:選択範囲を出力 (非選択状態でも空ファイルを出力する)
)

@m-tmatma m-tmatma added the refactoring リファクタリング 【ChangeLog除外】 label Jul 6, 2018
@m-tmatma
Copy link
Member Author

m-tmatma commented Jul 6, 2018

他の PR とかぶると嫌なので調査だけしておく。

@m-tmatma
Copy link
Member Author

何らかのツール、コンパイラ等で検出できたらいいのだけど

@m-tmatma
Copy link
Member Author

こんな情報があった。根拠には疑問を感じるが。
https://www.jpcert.or.jp/sc-rules/c-api08-c.html

@berryzplus
Copy link
Contributor

根拠に挙げられた障害への対策は、できるだけマクロを使わないとか汎用的に使われる名詞にマクロを割り当てないとかになるような気がしました。公的推奨も結構いい加減ですねぇw

ちなみにこの件、intellisenseの拡張apiを使えばなんとかなるような気がしています。ツールを作るかどうかは優先度によるのかな、と思っています。

@berryzplus
Copy link
Contributor

berryzplus commented Aug 25, 2018

保留中 #326 を解決するために、関数宣言に引数を付ける対応が必要かも知れません。

いまのところ、対応方法は ~~~二択~~~ 三択だと思っています。

No 方法 メリット デメリット
1 手作業で追記 すぐに着手できる レビューが困難
2 ツール化する ~~~すぐに着手できない~~~ レビューが楽 ~~~レビューが楽~~~ すぐに着手できない
3 既存ツールを使う 修正&レビューが楽 使えるツールがあるか分からない

 ※8/26 No3を追加しました。

追記箇所の数が多いので「ツール化」で進めたい感じです。

ツール化する場合のアプローチは3つだと思っています。

  • 完全独自方式
    テキスト整形が得意な言語(Perl/Ruby/Python等)で自由に作る方法です。
    作る立場で、いちばん書きやすいのはこのやり方です。
    レビューする立場で、いちばん判断に困るのがこのやり方です。
  • VC++のIntellisenseが作るSQLite3(データベース)を活用する方式
    EntitiyFrameworkを使ったDBアプリを作る方法です。
    DBアプリは普通TDD開発なので、レビューしやすいと思います。
    ただ、開発言語がC#一択なので、違う意味でレビューしづらいかも知れません。
    参考: https://aquasoftware.net/blog/?p=935
  • VSIX(Visual Studio eXtension Installer) を書く方式
    vs2017の言語拡張機能として実装する方法です。
    ソースコードに何かするなら、いちばん正当なやり方です。
    サンプル等を見る限り、VSIXにはテストを書く文化がないようです。
    開発言語がC#一択なので、レビューしづらい可能性があります。
    参考: https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/Code_Sweep

どの方式をとったとしても一度作ってしまえば、
他の目的に流用できる余地があると思っています。

普通に考えるとVSIXは修羅道です。
ただ、流用前提で考えるとVSIXは少しの変更で様々なニーズに対応できます。
理想をいえば VSIX、手軽さでいけば完全独自、悩ましいところです。

@m-tmatma
Copy link
Member Author

no 2 のメリットとデメリットが逆のような気がします

@m-tmatma
Copy link
Member Author

m-tmatma commented Aug 26, 2018

案4 clang-tidy とかのツールでできるのならそれで、
できなくても、clang-tidy が使用している LibTooling というライブラリを使ってツールを書く

↑ 実現可能かは全く調べてません

http://clang.llvm.org/extra/clang-tidy/
http://clang.llvm.org/docs/LibTooling.html

@m-tmatma
Copy link
Member Author

↑ 誤植修正

@berryzplus
Copy link
Contributor

no 2 のメリットとデメリットが逆のような気がします

修正してみました。

案3は「既存ツールでできる」ということ?

@m-tmatma
Copy link
Member Author

できるかはわからないです。

@berryzplus
Copy link
Contributor

できるかはわからないです。

了解です。表を更新してみました。
まず、そういうツールがあるか探すところからですね。
とりあえず、貼ってもらった llvm のツールを見て見ます。

@k-takata
Copy link
Member

プロトタイプ宣言を自動生成するツールとして cproto というものがあり、Vimでも使っているのですが、さほど使いやすくもない (特にWindows) のが残念なところです。

@m-tmatma
Copy link
Member Author

できなくても、clang-tidy が使用している LibTooling というライブラリを使ってツールを書く

libclang というライブラリで clang のコンパイラ機能を使えるみたいだ。
解析はできるみたい。変更ができるかは不明。

python binding や c# 向けのライブラリがあって、プログラムから呼び出せる模様。
https://qiita.com/subaru44k/items/4e69ec987547011d7e63
https://qiita.com/atsushieno/items/f561c5d3c5308545c4f3

@m-tmatma
Copy link
Member Author

libclang を使うには clang でビルドできるようにはしとく必要があるとは思う。

@berryzplus
Copy link
Contributor

llvm(=clang)のツールを見て見た感想・・・

VSIXでVC++のエラー一覧にタスクを突っ込むのと考え方が同じっぽい。
10年くらい前に Eclipse のプラグインも触ったことがあるんですが、
目的が同じだと考え方やコードも似るようです。

llvm で windows アプリ を作れるものなのかどうかは、よく知らないです。
vs2017がclang/llvmのビルドに対応していることと、
llvm で windows アプリ をビルドできるか?の間に関連性はないはず・・・。
(最近のvc++はクロスコンパイル環境としても使えるから。)

@m-tmatma
Copy link
Member Author

m-tmatma commented Sep 7, 2018

何らかのツール、コンパイラ等で検出できたらいいのだけど

完璧ではないですが、検出ツールを作成中です。
このツールで検出して、手動で変更する方向で検討中です。

https://github.com/m-tmatma/GrepFuncProtoType

GrepFuncProtoType.sln をビルドして、 以下を実行したら該当箇所を絶対パスと行番号付きで出力します。

GrepFuncProtoType.exe <ソースコードのあるフォルダパス>

visual studio の外部ツールに

コマンド → GrepFuncProtoType.exe の絶対パス
引数 → $(SolutionDir)

を指定して、登録した外部ツールを実行すれば、visual studio の出力ウィンドウに検索結果を表示します。
出力ウィンドウの該当箇所をダブルクリックすれば、該当箇所にジャンプします。

@m-tmatma
Copy link
Member Author

m-tmatma commented Sep 7, 2018

↑ 現状では const & * を含む場合などは非対応です。
また、ある引数は、仮引数があるが、同じ関数の別の引数は非対応といったように
混ざった状態も非対応です。

@berryzplus
Copy link
Contributor

一年以上も前の話だったのか!と気付くなど:sob:

↑ 現状では const や & や * を含む場合などは非対応です。
また、ある引数は、仮引数があるが、同じ関数の別の引数は非対応といったように
混ざった状態も非対応です。

  1. 引数型にconst修飾(=読み取り専用)が付いていたり、
  2. 引数型が参照(=‘std::wstring &`型など)だったり、
  3. 引数型がポインタ(=wchar_t*型など)たったりすると使えない、
  4. 引数が2つ以上あるメソッドの場合、全部の引数で引数名が欠落してないと修正されない
    ってことですかねぇ・・・。

サクラエディタのコードってそんなんばっかな気がしないでもないですが 😢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
refactoring リファクタリング 【ChangeLog除外】
Projects
None yet
Development

No branches or pull requests

3 participants