Go ialah bahasa yang ditaip kuat, ia mengelak daripada membuat kesilapan.
Saya tersilap mengandaikan Go sedang mengendalikan limpahan integer dan melaporkan ralat.
Inilah dunia yang sempurna di mana segala-galanya berfungsi seperti yang diharapkan
a := int64(42) b := uint8(a) fmt.Println(b) // 42
Jadi apakah kod berikut
a = 255 + 1 // 255 is the higher value an uint8 can reach b = uint8(a) fmt.Println(b) // ? a = -1 b = uint8(a) fmt.Println(b) // ?
Inilah penyelesaiannya
Spoiler: ia tidak berfungsi seperti yang diharapkan, atau sekurang-kurangnya seperti yang kita jangkakan.
Jadi di sini Go sedang melakukan penukaran senyap, sudah tentu ia tidak boleh menyimpan nilai dalam jenis integer yang disediakan, tetapi tiada ralat sama sekali.
Terdapat akibat: CWE-190
Disebabkan ini, gosec linter memfokuskan pada meningkatkan keselamatan dalam Go, menyediakan linter untuk mengesan isu: linter G115
Idea linter G115 adalah bagus.
Tetapi malangnya ia telah digabungkan dengan beberapa isu palsu, yang kini ditangani, kecuali beberapa isu.
Masalah menjadi besar selepas gosec v2.21.0 digabungkan menjadi golangci-lint
Ramai orang melumpuhkan gosec G115, kerana positif palsu dan bunyi bising yang dibawanya ke CI
Malangnya sekarang ramai orang telah melumpuhkan penyemak G115, anda boleh melihatnya dengan mudah di GitHub
Atas ialah kandungan terperinci Mengenai drama gosec G, atau cara saya menghadapi limpahan penukaran integer kembali dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!