ทีมพัฒนาของ facebook ได้ปล่อย infer ออกมาให้ใช้งานกัน
มันคือ static analysis tool ซึ่งพัฒนาด้วยภาษา OCaml
ใช้สำหรับตรวจสอบ code ที่เราเขียนขึ้นมา
ว่าใน code มีส่วนไหนที่อาจจะก่อให้เกิด bug ได้
ดังนั้นมาทำความรู้จักกับมันหน่อยสิ

Facebook infer นั้นสนับสนุนภาษา program ดังนี้

  • Java
  • Android
  • Objective-C
  • C

มีขั้นตอนการทำงานดังรูป
Screen Shot 2558-06-14 at 10.29.55 AM

โดยที่ 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
  • Instagram

ทำการติดตั้ง และ ใช้งานกันดีกว่า

การติดตั้งนั้นไม่ยากเลย
เพียง 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

จะแสดงผลการทำงานดังนี้
Screen Shot 2558-06-14 at 10.45.24 AM

จากนั้นลองใช้งาน facebook infer สำหรับการวิเคราะห์หน่อยสิ

เริ่มจากภาษา Java แล้วกัน
ซึ่งทาง facebook infer ก็มีตัวอย่าง code ให้ดังนี้

เป็น code ที่น่าโง่มากๆ ใครเห็นก็รู้ว่า
มันก่อให้เกิด Null pointer exception
แต่เชื่อไหมว่า code ลักษณะนี้เกิดขึ้นบ่อยมากๆ
ดังนั้น มาวิเคราะห์กัน ด้วยคำสั่ง

$infer — javac Hello.java

ผลการวิเคราะห์เป็นดังนี้
Screen Shot 2558-06-14 at 10.49.17 AM

ซึ่งบอกไปเลยว่า จะเกิดอะไรขึ้นบ้าง ในบรรทัดไหน
ดังนั้น คุณก็ควรจะทำการแก้ไขซะ
เพื่อให้มันผ่านดังรูป

Screen Shot 2558-06-14 at 10.51.47 AM

ส่วนภาษาอื่นๆ ลองไป Hello World กับ Facebook infer ได้เลย

แล้วผลการวิเคราะห์มันอยู่ที่ไหนล่ะ ?

โดยค่า default จะสร้างอยู่ใน folder infer-out นะ
ซึ่งจะมี file และ folder เพียบเลยดังรูป
Screen Shot 2558-06-14 at 11.10.51 AM

แต่ไฟล์ที่เราต้องให้ความสนใจก่อนคือ

  • 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 แบบอัตโนมัติกันหรือเปล่านะ ?