
ابحث عن الاستخدامات unsafe وحسابها في حزم GO وتبعياتها.
go-geiger -v github.com/jlauinger/go-geiger

يمكن أن تتجنب حزمة GO القيود التي يتم تحديدها بشكل طبيعي على استخدام المؤشر باستخدام unsafe.Pointer . قد يكون هذا أمرًا ذا قيمة لتحسين الكفاءة أو حتى على سبيل المثال ، على سبيل المثال للتفاعل مع رمز C أو Syscalls.
ومع ذلك ، يجب على المطورين توخي الحذر الشديد مع unsafe.Pointer .
نظرًا لأن استخدامات unsafe.Pointer .
يساعد go-geiger المطورين على تحديد الحزم في شجرة الاستيراد الخاصة بحزمة GO بشكل unsafe.Pointer unsafe.Pointer
لتثبيت go-geiger ، استخدم الأمر التالي:
go get github.com/jlauinger/go-geiger
سيؤدي ذلك إلى تثبيت go-geiger على $GOPATH/bin ، لذا تأكد من تضمينه في متغير بيئة $PATH .
قم بتشغيل Go-Geiger على حزمة مثل هذا:
$ go-geiger example/cmd
أو توفير حزم متعددة ، مفصولة بالمسافات:
$ go-geiger example/cmd example/util strings
للتحقق من الحزمة في الدليل الحالي ، يمكنك الاتصال بـ go-geiger بدون معلمات:
$ go-geiger
يطبع العلم --help العلم-معلومات الاستخدام لـ go-geiger :
$ go-geiger --help
هناك الأعلام التالية المتاحة:
--filter-context string Count only lines of requested context type (all,variable,parameter,assignment,call,other). Default all (default "all")
--filter-match string Count only lines of requested match type (all,pointer,sizeof,offsetof,alignof,sliceheader,stringheader,uintptr). Default pointer (default "pointer")
-h, --help help for geiger
-q, --hide-stats Hide statistics table, print only code. --show-code needs to be set manually
--include-std Show / include Golang stdlib packages
-l, --link Print link to pkg.go.dev instead of package name
-d, --max-depth int Maximum transitive import depth (default 10)
--show-code Print the code lines with unsafe usage
--show-only-once Do not repeat packages, show them only once and abbreviate further imports (default true)
-v, --verbose Show usage counts by different usage types
بشكل افتراضي ، لن يحسب go-geiger استخدامات unsafe.Pointer فقط. reflect.SliceHeader خلال تعيين وسيطة --filter-match إلى واحدة من sizeof uintptr offsetof أو alignof أو sliceheader أو stringheader reflect.StringHeader uintptr أو all unsafe.Alignof يمكنك أيضًا استخدام go-geiger للعثور على استخدامات unsafe.Sizeof unsafe.Offsetof
باستخدام الوسيطة --verbose ، يمكنك توجيه go-geiger لإظهار تهم فردية لسياقات الاستخدام المختلفة غير الآمنة. يميز go-geiger بين ما يلي:
عامل
var x unsafe. Pointerالمعلمة
func foo ( x unsafe. Pointer ) {}تكليف
x := unsafe . Pointer ( & y )يتصل
x := unsafe . Pointer ( & y )
foo ( x )آخر ، والذي يتضمن كل ما لا يندرج تحت الأربعة الأولى.
استخدم وسيطة مرشح --filter-context لتصفية العد إلى نوع سياق محدد. يمكنك استخدام variable أو parameter أو assignment أو call أو other أو all .
إذا كان مشروعك يستخدم وحدات GO وملف go.mod ، فسوف يجلب go-geiger جميع التبعيات تلقائيًا قبل تحليلها. إنه يتصرف تمامًا مثل go build .
إذا كنت تستخدم شكلًا مختلفًا من إدارة التبعية ، أو ، فإن GO go get ، أو ، go mod vendor أو أي شيء آخر ، فأنت بحاجة إلى تشغيل إدارة التبعية قبل تشغيل go-geiger من أجل تحديث جميع التبعيات قبل التحليل.
go-geiger مستوحى من Cargo Geiger ، وهي أداة مماثلة للعثور على كتل رمز غير آمنة في برامج الصدأ وتبعياتها.
يحتوي Jlauinger/Go-unsafepointer-POC على دليل على مفاهيم استغلال نقاط الضعف الناجمة عن سوء استخدام unsafe.Pointer . لقد كتبت أيضًا سلسلة منشورات مدونة حول المشكلات المحددة ونقاط الضعف.
Go-Safer هي أداة GO Linter التي يمكن أن تساعد في تحديد أنماط الاستخدام الشائعة والخطيرة لـ unsafe.Pointer .
للحصول على رمز المصدر وتجميع الثنائي ، قم بتشغيل هذا:
$ git clone https://github.com/jlauinger/go-geiger
$ cd go-geiger
$ go build
تشغيل الاختبارات مع go test .
مرخصة بموجب ترخيص معهد ماساتشوستس للتكنولوجيا ("الترخيص"). لا يجوز لك استخدام هذا المشروع إلا في الامتثال للترخيص. يمكنك الحصول على نسخة من الترخيص هنا.
حقوق الطبع والنشر 2020 يوهانس لاوينجر
تم تطوير هذه الأداة كجزء من أطروحة الماجستير في مجموعة تكنولوجيا البرمجيات في TU Darmstadt.