HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0827
.Hrk1度も使用されない変数について16解決


.Hrk

リンク

2008/8/27(Wed) 04:32:14|NO.18709

HSPで長いコードを書いていると、タイプミス等で変数名を間違えることが
多々有ります。このバグを見つけるのはかなりしんどいです。

そこで、よく他の言語にあるstrictモードみたいな、文法を厳しくチェック
する機能があるといいなと思います。
1度も使われない変数があるとエラーを吐くようにすれば、タイプミスで変
数名を間違えることで予期しない動作をすることを防げるのではないでしょ
うか。



この記事に返信する


S&R(楓)

リンク

2008/8/27(Wed) 06:46:54|NO.18713

前からちらほらと要望は出てますが、まさにそのとおりです。
また、大文字小文字を区別して欲しいという要望も見かけます。
後者は割りと簡単で、プリプロセスの段階ですべて小文字に変換している処理をやめてしまえばいいだけなのです。
このあたりはOpenHSPコミッターの方々が取り入れてくれるでしょう。

前者はどうですかね。
#funcやらなにやらは#cmpoptで最適化できますが、
定義のない変数に対して、「未使用」というものを定義しなくてはならないですね。

変数名の現れるステートメントが1箇所だけのものが未使用?
1つのステートメントにおいてパラメータで何度も使われていた場合は?
ある変数名をdupやdupptrで参照していて、
ある変数名は1度きりしか現れないが、メモリはいたるところで参照されていたりすることも
考慮する必要があったり

まぁこのくらいの話はMLで議論されてることでしょう!



SYAM

リンク

2008/8/27(Wed) 08:51:53|NO.18717

もしHSPのほうで対応できなくても、外部のでもいいから静的解析ツールがあれば便利そうですね。あるのかな?
エディタに統合されたりしてるとさらに便利ですけど。



なっきぃ

リンク

2008/8/27(Wed) 13:49:19|NO.18721

デバッグ機能で変数確認して
使ってない変数を見つけたら
その変数名でソースを検索し
検出という作業をすればいい
のではないでしょうか?



axobj

リンク

2008/8/27(Wed) 14:02:52|NO.18722

>>なっきぃさん
ぶっちゃけ面倒じゃないですか(笑)



SYAM

リンク

2008/8/27(Wed) 14:45:40|NO.18723

面倒なのも確かですし
人間の目と頭は見落としもします。
こういう機械的な作業をしらみつぶしに行うのは、機械にやらせるのがうまいやり方でしょう。
ミスも出にくく、且つ比較にならないくらい速いです。
その機械を作るのも動かすのも人間だからミスは完全にはなくなりませんが、(人間がやるのと比較して)よほど信用できるものを作ることはできます。



.Hrk

リンク

2008/8/27(Wed) 14:55:13|NO.18725

>なっきぃさん
>デバッグ機能で変数確認して使ってない変数を見つけたら

使ってない変数かどうか確認するというのは、一覧から自分が
使った覚えが無い変数名を探すというような作業をするのでし
ょうか。

だとすると、やはり作成した全ての変数名を覚えておく必要が
あります。この覚えておくという作業?が大変だからこそ欲し
いと思うわけです。



FUJI

リンク

2008/8/27(Wed) 20:14:43|NO.18734

動的にいくなら、実行時に未代入の変数を参照したら警告するとかですかね。しかし、そうすると実行されない部分をチェックできません。
静的にいくならオブジェクトファイルからどこにも代入がない変数を探すとか...。これの場合は代入より前に参照を実行していてもそれをチェックできないですね。
どちらにしても、代入がなくても命令や関数に変数を渡して値が格納されるかもしれない(たとえばdim命令)ので、そこをどう誤判定させないかが難しいかもです。

互換性の問題があるのでデフォルトで識別子の大文字小文字の区別をつけるようには出来ないと思います。そういうモードを作るというのならアリかもしれません。



コンテスト出品者

リンク

2008/8/27(Wed) 21:13:27|NO.18738

変数は定義しないと使えないようにするモードも作って、
ユーザー側で切り替えられるようにするとか。



Kpan

リンク

2008/8/27(Wed) 21:48:12|NO.18740

どんなものなのか分からないですが。。。「変数チェッカー」
http://www.geocities.jp/anachronism128/



.Hrk

リンク

2008/8/27(Wed) 21:51:50|NO.18741

こんなのはどうでしょう。

・非常に似通った(例えば1〜2文字違いの)変数があれば、警告する。
ただし、2文字以下の変数については、1文字違えば別の変数の
可能性が高いので無視する。

・値が代入されていない変数をデバッグウィンドウで列挙できる。
(命令の引数で使われていても、代入されていないので列挙する)

・実行されてから値が一度も変わっていない変数は、デバッグウィン
ドウのリストで例えば色を赤にしておく。値が書き換えられた場合
色を黒にして目立たなくする。

・値が0もしくは空文字列である、非配列変数は使われていない可能
性が高いので、列挙してみる。

完全に機械的に見つけ出せなくても、人間が容易に見つけられるなら
概ね満足じゃないでしょうか。



FUJI

リンク

2008/8/27(Wed) 21:58:16|NO.18742

代入されていない静的変数を列挙するプログラムを作ってみました。
http://svn.coderepos.org/share/lang/hsp/misc/unused_variable_lister/unused_variable_lister.hsp



.Hrk

リンク

2008/8/27(Wed) 22:51:11|NO.18744

>FUJIさん
すごいです!早速テストしてみました。
unused_variable_lister.hspから8個の未使用変数が見つかりましたw
誤判定どうにかしたいですね〜
ちょっといじってみたいと思います



FUJI

リンク

2008/8/28(Thu) 06:57:59|NO.18750

dim 命令など「パラメータの変数に代入する命令」に指定した引数を拾わないように変更しました。
これでだいぶ誤判定が改善されたのではないかと思います。
ほかにも、 UI の変更や ファイル名 行番号の表示の追加などを行いました。

DLL やユーザー定義の命令や関数で変数を参照渡ししているのを拾わないようにしようかなーと思うのですがどうでしょうね。



あねもね

リンク

2008/8/28(Thu) 11:54:56|NO.18754

>FUJIさん
とても良いスクリプトです。ありがたく使わせていただきます。
当方の環境では問題なく未使用の変数を見つけてくれました。

ご存知とは思いますが、一応報告しておきます。
cnvstowなどで代入された変数は検出されるようです。



s

リンク

2008/8/28(Thu) 23:39:06|NO.18763

す、すごいです!

標準装備されたらいいですねー!
FUJIさん、ありがたく使わせていただきます!



.Hrk

リンク

2008/9/1(Mon) 15:29:44|NO.18837

FUJIさんのソースファイルを少しいじってHSPエディタの外部ツールを
作ったので一応載せておきます


実行ファイル
http://zero.nthock.harisen.jp/test/uvlcmd.exe

ソースファイル
http://zero.nthock.harisen.jp/test/unused_variable_lister_cmdline-only.hsp

注:右クリックで保存してください。


【設定方法】

1. uvlcmd.exe、またはソースファイルから実行ファイル自動作成したものを、
HSP本体があるフォルダ(インストーラーでインストールした場合、標準では
"C:\Program Files\hsp31"等)にコピーする

2. HSPのメニューの[ツール]→[オプション]の[外部ツール]に以下の設定で追加する

ツール名 [ ※自由 ]
ファイルパス [ 1.で置いた場所 ]
コマンドライン [ %f ]
実行時に編集中のファイルを上書き保存する [ チェックボックス=ON ]


【使い方】

調べたいと思ったら外部ツールの[未使用変数チェッカー](ツール名は
2.で設定したやつ)を起動

結果がウィンドウで表示される

[ENTER]キーまたは[ESC]キーで閉じます
メニューの[HSP]→[エラー表示]を選択したときのダイアログを意識
しました


__hsp26__マクロ定義のON/OFFや、デバッグモードのON/OFFの制御は
現時点ではやってません。作った後そういえばコンパイルにモード指
定とかあったなと気づいたので。


とても便利なのでありがたく使わせていただいています。
FUJIさんありがとうございます。



ONION software Copyright 1997-2021(c) All rights reserved.