? Arguard
Go for Goは、ファンクションガード(別名契約)に対する静的コール引数をチェックします。
例
たとえば、次の機能があります。
func div ( n , d float64 ) float64 {
if d == 0 {
panic ( "denominator must not be zero" )
}
return n / d
}そして、あなたはそれをこのように呼びます:
userInputがわからなくても、2番目の引数が常にゼロであるため、この関数呼び出しがランタイムでパニックになることがわかります。
リナーは、安全な部分コード実行とブラックマジックを使用して、そのような場所を見つけて報告します。
?インストール
go install github.com/orsinium-labs/arguard@latest
使用法
利用可能なフラグ:
-
-contracts.follow-imports :このフラグをfalseに設定して、インポートされたモジュールから契約を抽出しないようにします。言い換えれば、契約(ガード)違反は、契約と関数呼び出しが同じ分析されたパッケージにある場合にのみ報告されます。パフォーマンスの向上に役立ちます。 -
-contracts.report-contracts :検出されたすべての契約のメッセージを発します。デバッグに役立ち、契約がリナーによって検出されたかどうかを確認します。 -
-arguard.report-errors :契約の実行中に障害を示すようにこのフラグを設定します。デフォルトでは、Arguardが契約の実行に失敗した場合、何も報告せずに移動するだけです。契約エラーが報告されなかった理由を確認するためにデバッグに役立ちます。
? QNA
- ?どのように機能しますか?内部には2つのアナライザーがあります。最初のものは、コード内の安全な契約(ガード)を検出します。 2番目のものは、既知の契約で機能への呼び出しを検出し、静的に既知の引数を抽出し、Yaegiを使用して実行できる契約を実行します。
- ?ガード(契約)とは何ですか?安全な解実行チェックを使用して、関数の開始時のIF条件(他の契約のみがその前に行くことができます)と、エラーを返すか
panicを呼び出すだけです。 - ?結果はどのくらい信頼できますか?エラーが報告されている場合、おそらくエラーがあります。エラーが報告されていない場合でも、エラーが発生する可能性があります。それは、正式な検証剤ではなく、リナーです。
- projectプロジェクトはどれくらい安定していますか?特に部分的なコード実行を行う場合、GOの静的分析は乱雑になる可能性があります。リナーは故障したり、間違ったり、潜在的に賢くない場合があります。それでも、それは生産依存ではなく静的アナライザーであるため、あらゆる環境のどのプロジェクトでも使用しても安全です。ただし、部分的なコードの実行がまだあることに注意してください。したがって、安全にするために、信頼できないコードで実行する必要はないでしょう。
- ?壊れた変更はありますか?プロジェクトはSemverに続きます。ただし、パッチ1であっても、すべてのリリースでは、コードに新しい違反の報告を開始できます。したがって、ある意味では、すべてのリリースが破壊される可能性があります。
- ? Golangci-Lintの統合はありますか?まだではありませんが、最終的にはそうなるでしょう。分析駆動のリナーをGolangci-Lintと統合するのは簡単で、Arguardは分析駆動型です。乞うご期待。
- IDE統合はありますか?まだ。 Golangci-Lintの統合がある場合、IDE統合は無料で提供されます。
- ?これは新しいアイデアですか?このプロジェクトは、契約するための私のPythonライブラリが契約することができることの1つを実装しています。取引自体は世代の知恵に基づいて構築されています。このタイムラインを参照してください。
- Go APIはありますか、ライブラリとして使用できますか?はい。分析パッケージは、アナライザーを構成するネイティブの方法を提供します。これがプロジェクトの使用方法です。複数の
analysis.Analyzerを作成および作成する方法の例については、main.goを参照してください。 - ??§積極的に維持されていますか?このプロジェクトは、ユニックスウェイの最高の伝統において、非常に小さく明確に定義された範囲を持っています。私は時々それに戻り、眠れぬ夜に持っていた新しい興味深いアイデアをもたらすかもしれませんが、毎日維持することは何もありません。今日機能している場合、依存関係の短いリストとGo 1互換性の約束のおかげで、明日は壊れません。
- ?バグを見つけたらどうしますか?プロジェクトをフォークし、バグを修正し、いくつかのテストを書き、プルリクエストを開きます。私は通常、1日以内に貢献をマージしてリリースします。