ทีมพัฒนาของ facebook ได้ปล่อย infer ออกมาให้ใช้งานกัน
มันคือ static analysis tool ซึ่งพัฒนาด้วยภาษา OCaml
ใช้สำหรับตรวจสอบ code ที่เราเขียนขึ้นมา
ว่าใน code มีส่วนไหนที่อาจจะก่อให้เกิด bug ได้
ดังนั้นมาทำความรู้จักกับมันหน่อยสิ
Facebook infer นั้นสนับสนุนภาษา program ดังนี้
- Java
- Android
- Objective-C
- C
มีขั้นตอนการทำงานดังรูป
โดยที่ Facebook infer นั้นจะพยายามหา code
ที่จะทำให้ระบบงานมันเกิด bug
เพื่อลดการทำงานที่แย่ๆ
รวมทั้งไม่ให้ระบบงาน crash อีกด้วย ซึ่งสำคัญมากๆ สำหรับ mobile application
ความสามารถสำหรับ Java และ Android
- ทำการหา Null pointer exception
- Resource leak เช่น memory leak เป็นต้น
ความสามารถสำหรับ Objective-c และ C
หลักๆ จะเป็นเรื่องของ Memory leak
แล้วใครบ้างล่ะ ที่ใช้งาน Facebook infer ?
แน่นอนล่ะ ก็เป็นทีมพัฒนาของ facebook ไงล่ะ
ซึ่งเป็นส่วนหนึ่งในขั้นตอนของการพัฒนาของ Mobile application
โดยจะทำงานทุกๆ ครั้งที่มีการเปลี่ยนแปลงนั่นเอง
เช่น
- Facebook app for Android/iOS
- Facebook messenger
ทำการติดตั้ง และ ใช้งานกันดีกว่า
การติดตั้งนั้นไม่ยากเลย
เพียง download Facebook infer มาจาก Getting Start Page
แต่ตอนนี้สนับสนุนเฉพาะ Mac OS และ Linux 64 bit เท่านั้นนะ
ส่วนผมใช้งาน Mac OS นะ
ให้ทำการ extract และใช้งานได้เลย
โดยตัว program ที่ให้ใช้งานอยู่ใน folder infer-osx-v0.1.0/infer/infer/bin
ทดลองใช้งานด้วยคำสั่ง
$infer
จะแสดงผลการทำงานดังนี้
จากนั้นลองใช้งาน facebook infer สำหรับการวิเคราะห์หน่อยสิ
เริ่มจากภาษา Java แล้วกัน
ซึ่งทาง facebook infer ก็มีตัวอย่าง code ให้ดังนี้
เป็น code ที่น่าโง่มากๆ ใครเห็นก็รู้ว่า
มันก่อให้เกิด Null pointer exception
แต่เชื่อไหมว่า code ลักษณะนี้เกิดขึ้นบ่อยมากๆ
ดังนั้น มาวิเคราะห์กัน ด้วยคำสั่ง
$infer — javac Hello.java
ผลการวิเคราะห์เป็นดังนี้
ซึ่งบอกไปเลยว่า จะเกิดอะไรขึ้นบ้าง ในบรรทัดไหน
ดังนั้น คุณก็ควรจะทำการแก้ไขซะ
เพื่อให้มันผ่านดังรูป
ส่วนภาษาอื่นๆ ลองไป Hello World กับ Facebook infer ได้เลย
แล้วผลการวิเคราะห์มันอยู่ที่ไหนล่ะ ?
โดยค่า default จะสร้างอยู่ใน folder infer-out นะ
ซึ่งจะมี file และ folder เพียบเลยดังรูป
แต่ไฟล์ที่เราต้องให้ความสนใจก่อนคือ
- bugs.txt
- report.csv และ report.json
เนื่องจากมันคือ report ของการวิเคราะห์นั่นเอง
และสามารถนำใช้งานต่อได้
เช่นนำไป integration เข้ากับระบบการ build นั่นเอง
และถ้าต้องการดูว่า ตอนนี้มี bug อะไรบ้าง สามารถใช้คำสั่ง
$inferTraceBugs
มาดูข้อจำกัดกันหน่อยสิ
เนื่องจากเป็นเครื่องมือสำหรับทีมพัฒนาของ Facebook
ดังนั้น มันจึงทำการตรวจสอบในสิ่งที่ทีมต้องการ
และมันเหมาะสำหรับ Facebook นั่นเอง
ซึ่งประกอบไปด้วย
Bug report ของ Java และ Android ประกอบไปด้วย
- Resource leak
- Null dereference
Bug report ของ Cและ Objective-C ประกอบไปด้วย
- Resource leak
- Memory leak
- Null dereference
- Parameter not null checked
- Ivar not null checked
- Premature nil termination argument
Bug report เฉพาะ Objective-C ประกอบไปด้วย
- Retain cycle
สามารถดูเพิ่มเติมได้ที่ Infer bug type
ส่วนที่ยังไม่มีใน facebook infer ก็เช่น
- Cast exception
- Array bound error หรือ Array index out of bound
- Race condition
ลองไปดูตัวอย่างของการใช้งานสำหรับ Android application
ได้ที่นี่ DuckDuckGo
คำถาม
ทุกวันนี้ในขั้นตอนการพัฒนา software
คุณมีขั้นตอนสำหรับวิเคราะห์ code แบบอัตโนมัติกันหรือเปล่านะ ?