Open m-tmatma opened 6 years ago
他の PR とかぶると嫌なので調査だけしておく。
何らかのツール、コンパイラ等で検出できたらいいのだけど
こんな情報があった。根拠には疑問を感じるが。 https://www.jpcert.or.jp/sc-rules/c-api08-c.html
根拠に挙げられた障害への対策は、できるだけマクロを使わないとか汎用的に使われる名詞にマクロを割り当てないとかになるような気がしました。公的推奨も結構いい加減ですねぇw
ちなみにこの件、intellisenseの拡張apiを使えばなんとかなるような気がしています。ツールを作るかどうかは優先度によるのかな、と思っています。
保留中 #326 を解決するために、関数宣言に引数を付ける対応が必要かも知れません。
いまのところ、対応方法は ~二択~ 三択だと思っています。
No | 方法 | メリット | デメリット |
---|---|---|---|
1 | 手作業で追記 | すぐに着手できる | レビューが困難 |
2 | ツール化する | ||
3 | 既存ツールを使う | 修正&レビューが楽 | 使えるツールがあるか分からない |
※8/26 No3を追加しました。
追記箇所の数が多いので「ツール化」で進めたい感じです。
ツール化する場合のアプローチは3つだと思っています。
どの方式をとったとしても一度作ってしまえば、 他の目的に流用できる余地があると思っています。
普通に考えるとVSIXは修羅道です。 ただ、流用前提で考えるとVSIXは少しの変更で様々なニーズに対応できます。 理想をいえば VSIX、手軽さでいけば完全独自、悩ましいところです。
no 2 のメリットとデメリットが逆のような気がします
案4 clang-tidy とかのツールでできるのならそれで、 できなくても、clang-tidy が使用している LibTooling というライブラリを使ってツールを書く
↑ 実現可能かは全く調べてません
http://clang.llvm.org/extra/clang-tidy/ http://clang.llvm.org/docs/LibTooling.html
↑ 誤植修正
no 2 のメリットとデメリットが逆のような気がします
修正してみました。
案3は「既存ツールでできる」ということ?
できるかはわからないです。
できるかはわからないです。
了解です。表を更新してみました。 まず、そういうツールがあるか探すところからですね。 とりあえず、貼ってもらった llvm のツールを見て見ます。
プロトタイプ宣言を自動生成するツールとして cproto というものがあり、Vimでも使っているのですが、さほど使いやすくもない (特にWindows) のが残念なところです。
できなくても、clang-tidy が使用している LibTooling というライブラリを使ってツールを書く
libclang というライブラリで clang のコンパイラ機能を使えるみたいだ。 解析はできるみたい。変更ができるかは不明。
python binding や c# 向けのライブラリがあって、プログラムから呼び出せる模様。 https://qiita.com/subaru44k/items/4e69ec987547011d7e63 https://qiita.com/atsushieno/items/f561c5d3c5308545c4f3
libclang を使うには clang でビルドできるようにはしとく必要があるとは思う。
llvm(=clang)のツールを見て見た感想・・・
VSIXでVC++のエラー一覧にタスクを突っ込むのと考え方が同じっぽい。 10年くらい前に Eclipse のプラグインも触ったことがあるんですが、 目的が同じだと考え方やコードも似るようです。
llvm で windows アプリ を作れるものなのかどうかは、よく知らないです。 vs2017がclang/llvmのビルドに対応していることと、 llvm で windows アプリ をビルドできるか?の間に関連性はないはず・・・。 (最近のvc++はクロスコンパイル環境としても使えるから。)
何らかのツール、コンパイラ等で検出できたらいいのだけど
完璧ではないですが、検出ツールを作成中です。 このツールで検出して、手動で変更する方向で検討中です。
https://github.com/m-tmatma/GrepFuncProtoType
GrepFuncProtoType.sln をビルドして、 以下を実行したら該当箇所を絶対パスと行番号付きで出力します。
GrepFuncProtoType.exe <ソースコードのあるフォルダパス>
visual studio の外部ツールに
コマンド → GrepFuncProtoType.exe の絶対パス
引数 → $(SolutionDir)
を指定して、登録した外部ツールを実行すれば、visual studio の出力ウィンドウに検索結果を表示します。 出力ウィンドウの該当箇所をダブルクリックすれば、該当箇所にジャンプします。
↑ 現状では const
や &
や *
を含む場合などは非対応です。
また、ある引数は、仮引数があるが、同じ関数の別の引数は非対応といったように
混ざった状態も非対応です。
一年以上も前の話だったのか!と気付くなど:sob:
↑ 現状では const や & や * を含む場合などは非対応です。 また、ある引数は、仮引数があるが、同じ関数の別の引数は非対応といったように 混ざった状態も非対応です。
wchar_t*
型など)たったりすると使えない、サクラエディタのコードってそんなんばっかな気がしないでもないですが :cry:
ヘッダのプロトタイプ宣言で変数名が省略されて型名しかないものに明示的に変数名を指定する
例えば以下部分
https://github.com/sakura-editor/sakura/blob/a1f053c55d5bb1617c15836f97315284425f8f90/sakura_core/cmd/CViewCommander.h#L121
cpp では以下のように定義されている。
https://github.com/sakura-editor/sakura/blob/a1f053c55d5bb1617c15836f97315284425f8f90/sakura_core/cmd/CViewCommander_File.cpp#L596-L603