? arguard
Linter for go yang memeriksa argumen panggilan statis terhadap fungsi penjaga (alias kontrak).
Contoh
Katakanlah, Anda memiliki fungsi berikut:
func div ( n , d float64 ) float64 {
if d == 0 {
panic ( "denominator must not be zero" )
}
return n / d
} Dan kemudian Anda menyebutnya seperti ini:
Bahkan jika kita tidak tahu userInput , kita dapat melihat bahwa panggilan fungsi ini akan panik dalam runtime karena argumen kedua selalu nol.
Linter menemukan dan melaporkan tempat -tempat seperti itu menggunakan eksekusi kode parsial yang aman dan sihir hitam.
? Instalasi
go install github.com/orsinium-labs/arguard@latest
Penggunaan
Bendera yang tersedia:
-
-contracts.follow-imports : Atur bendera ini ke false untuk tidak mengekstrak kontrak dari modul yang diimpor. Dengan kata lain, pelanggaran kontrak (penjaga) akan dilaporkan hanya jika fungsi dengan kontrak dan panggilan fungsi terletak di paket yang dianalisis yang sama. Berguna untuk kinerja yang lebih baik. -
-contracts.report-contracts Berguna untuk debugging untuk melihat apakah suatu kontrak terdeteksi oleh linter atau tidak. -
-arguard.report-errors : Tetapkan bendera ini untuk menunjukkan kegagalan selama eksekusi kontrak. Secara default, jika Arguard gagal menjalankan kontrak, itu hanya bergerak tanpa melaporkan apa pun. Berguna untuk debugging untuk melihat mengapa kesalahan kontrak tidak dilaporkan.
? QNA
- ? Bagaimana cara kerjanya? Ada dua penganalisa di dalamnya. Yang pertama mendeteksi kontrak aman (penjaga) dalam kode. Yang kedua mendeteksi panggilan untuk berfungsi dengan kontrak yang diketahui, mengekstraksi argumen yang diketahui secara statis, dan menjalankan kontrak yang dapat dieksekusi menggunakan Yaegi.
- ? Apa itu penjaga (kontrak)? Kondisi IF di awal fungsi (hanya kontrak lain yang dapat dilalui sebelumnya) dengan cek yang aman untuk dieksekusi dan tubuh hanya mengembalikan kesalahan atau memanggil
panic . - ? Seberapa andal hasilnya? Jika melaporkan kesalahan, ada kemungkinan kesalahan. Jika tidak melaporkan kesalahan, mungkin masih ada kesalahan. Ini linter, bukan verifier formal.
- ⚖️ Seberapa stabil proyeknya? Analisis statis di Go bisa berantakan, terutama ketika kita juga melakukan eksekusi kode parsial. Linter mungkin gagal, salah, atau tidak secerdas mungkin. Namun, ini adalah penganalisa statis, bukan ketergantungan produksi, sehingga harus aman untuk menggunakannya pada proyek apa pun di lingkungan apa pun. Perlu diingat, bahwa masih ada eksekusi kode parsial, jadi Anda mungkin tidak boleh menjalankannya pada kode yang tidak dipercaya, hanya untuk aman.
- ? Apakah akan ada perubahan yang melanggar? Proyek ini mengikuti SEMVER. Namun, setiap rilis, bahkan Patch One, dapat mulai melaporkan pelanggaran baru dalam kode Anda. Jadi, dalam arti tertentu, setiap rilis bisa pecah.
- ? Apakah ada integrasi Golangci-Lint? Belum tetapi akhirnya akan terjadi. Sangat mudah untuk mengintegrasikan linter yang bertenaga analisis dengan Golangci-Lint, dan Arguard bertenaga analisis. Pantau terus.
- ✏️ Apakah ada integrasi IDE? Belum. Ketika kami memiliki integrasi Golangci-Lint, integrasi IDE akan datang secara gratis.
- ? Apakah ini ide baru? Proyek ini mengimplementasikan salah satu hal yang berurusan, perpustakaan Python saya untuk desain berdasarkan kontrak dapat melakukannya. Kesepakatan itu sendiri dibangun di atas kebijaksanaan generasi, lihat garis waktu ini.
- Apakah ada API Go sehingga saya bisa menggunakannya sebagai perpustakaan? Ya. Paket analisis menyediakan cara asli untuk menyusun analisis, dan itulah cara Anda dapat menggunakan proyek ini. Lihat Main.go untuk contoh cara membuat dan menyusun beberapa
analysis.Analyzer instances. - ? ? ️ Apakah itu dipertahankan secara aktif? Proyek ini, dalam tradisi terbaik Unix-Way, memiliki ruang lingkup yang sangat kecil dan jelas. Saya mungkin kembali ke sana dari waktu ke waktu dan membawa ide -ide menarik baru yang saya miliki selama malam tanpa tidur, tetapi tidak ada yang bisa dipertahankan setiap hari. Jika berhasil hari ini, itu tidak akan rusak besok, berkat daftar ketergantungan pendek dan janji kompatibilitas Go 1.
- ? Bagaimana jika saya menemukan bug? Fork proyek, perbaiki bug, tulis beberapa tes, dan buka permintaan tarik. Saya biasanya menggabungkan dan memberikan kontribusi apa pun dalam sehari.