วิธีการวิเคราะห์โค้ดแบบคงที่ใน PHP? [ปิด]


466

มีเครื่องมือวิเคราะห์แบบคงที่สำหรับไฟล์ต้นฉบับ PHP หรือไม่? ไบนารีตัวเองสามารถตรวจสอบข้อผิดพลาดทางไวยากรณ์ แต่ฉันกำลังมองหาบางอย่างที่ทำได้มากกว่าเช่น:

  • การมอบหมายตัวแปรที่ไม่ได้ใช้
  • อาร์เรย์ที่กำหนดให้โดยไม่ต้องถูกกำหนดค่าเริ่มต้นก่อน
  • และอาจมีคำเตือนเกี่ยวกับลักษณะโค้ด
  • ...

57
Righty-o: ปิดโดย SO เมื่อเห็นได้ชัดว่าคำตอบประเภทนี้มีประโยชน์อย่างเหลือเชื่อ
Ira Baxter

3
ตกลง. คำถามนี้สำคัญมาก php lint (ไฟล์ php -l) ล้มเหลวในการจัดเตรียมอีกครึ่ง: เรียกใช้ autoload ตรวจสอบให้แน่ใจว่ามีฟังก์ชั่นที่เรียกว่ามีอยู่ตัวแปรนั้นมีอยู่คุณสมบัติของวัตถุที่มีอยู่ ฯลฯ
สูงสุด

6
@IraBaxter มีประโยชน์ แต่ไม่ได้พูดอย่างเคร่งครัดในหัวข้อ softwarerecs.stackexchange.comอาจเป็นตำแหน่งเพิ่มเติมในหัวข้อ แน่นอนประชดนี่คือนักพัฒนาอื่น ๆ อีกมากมายมีความคุ้นเคยกับ SO กว่านั้นพี่น้อง ...
เวย์นเวอร์เนอร์

7
ความจริงที่ว่ามีคนจำนวนมากพบว่าคำถามประเภทนี้มีประโยชน์น่าจะเป็นเหตุผลว่าทำไมซอฟต์แวร์ปัจจุบันจึงมีอยู่ แน่นอนมันดูเหมือนในหัวข้อย้อนกลับเมื่อนี่เป็นเว็บไซต์แลกเปลี่ยนกองเดียว ตอนนี้มีสถานที่ที่ชัดเจนสำหรับมันมันทำให้รู้สึกโยกย้าย?
eswald

4
ปิดเนื่องจาก closers ที่กระตุ้นให้มีความสุข Bah!
Roadowl

คำตอบ:


356

เรียกใช้ php ในโหมด lint จากบรรทัดคำสั่งเพื่อตรวจสอบความถูกต้องของไวยากรณ์โดยไม่ต้องดำเนินการ:

php -l FILENAME

เครื่องวิเคราะห์เชิงสถิตระดับสูงประกอบด้วย:

เครื่องวิเคราะห์ระดับล่าง ได้แก่ :

ตัววิเคราะห์รันไทม์ซึ่งมีประโยชน์มากกว่าสำหรับบางสิ่งเนื่องจากลักษณะไดนามิกของ PHP ได้แก่ :

ไลบรารีเอกสารphpdocและdoxygenทำการวิเคราะห์รหัส Doxygen ตัวอย่างเช่นสามารถกำหนดค่าการแสดงผลกราฟมรดกที่ดีกับGraphviz

อีกทางเลือกหนึ่งคือxhprofซึ่งคล้ายกับ xdebug แต่เบากว่าทำให้เหมาะสำหรับเซิร์ฟเวอร์ที่ใช้งานจริง เครื่องมือนี้มีส่วนต่อประสานกับ PHP


20
+1 สำหรับการใช้เวลา 6 ชั่วโมงในชีวิตของฉันในการลองใช้สารพัดเหล่านี้!
Abe Petrillo

14
@dimitko: นั่นเป็นเพราะphp -lสามารถอ่านไฟล์อินพุตได้ครั้งละหนึ่งไฟล์เท่านั้น (นั่นคือมันจะไม่ทำงานหากคุณทำphp -l file1.php file2.php) แต่คุณต้องใช้-n 1ตัวเลือกซึ่งบอกxargsให้ใช้เพียงหนึ่งบรรทัดอินพุตต่อกระบวนการคำสั่ง ที่จะทำให้มันแทนphp -l file1.phpตามด้วยphp -l file2.phpแทน ในเวลาเดียวกันคุณสามารถใช้-P <n>เพื่อเรียกใช้กระบวนการ "n" ในแต่ละครั้งเพื่อทำการประมวลผลแบบขนาน:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;ทำงานได้น่าเชื่อถือ
โคเอ็น

11
หมายเหตุ : สำหรับฟังก์ชั่นผ้าสำลี ( php -l) ในการทำงานคุณต้องตั้งค่าdisplay_errors = onในphp.iniมิฉะนั้นคุณจะได้รับข้อความทั่วไปเกี่ยวกับการมีข้อผิดพลาดทางไวยากรณ์ แต่ไม่มีรายละเอียดเกี่ยวกับสิ่งที่ผิดพลาด (s) หรือสิ่งที่สาย (s)
Synetech

8
Synetech - หนึ่งที่ดี คุณสามารถแทนที่การตั้งค่าในบรรทัดคำสั่งได้โดยใช้-dสวิตช์ เช่นphp -l -d display_errors=on $FILENAME
troelskn

38

ผ้าสำลี PHP ออนไลน์

PHPLint

ตรวจสอบตัวแปรตามหน่วย ดูเหมือนว่าลิงก์ 1 และ 2 จะทำสิ่งนี้ได้ดี

ฉันไม่สามารถพูดได้ว่าฉันได้ใช้สิ่งเหล่านี้อย่างเข้มข้น :)


คำตอบของเขาทำให้วันนี้ของฉันยอดเยี่ยมมาก! +1
Guilherme Nascimento


24

PHP Mess Detectorน่ากลัวและรวดเร็ว


7
ขอบคุณ! ฉันกำลังมองหาที่ยอดเยี่ยม อันที่จริงฉันปฏิเสธที่จะใช้สิ่งใดนอกจากเครื่องมือที่ยอดเยี่ยม :)
ศ. Falken ผิดสัญญา

1
มันเป็นการเริ่มต้นและดูเหมือนจะเป็นสิ่งที่ Netbeans ใช้ แต่ฉันจะไม่เชื่อใจมันอย่างสมบูรณ์ ตัวเลือกบางตัวเป็นแบบคี่ธรรมดา ("เตือน" คุณถ้าคุณใช้คำสั่งอื่น?) และมีข้อบกพร่องขนาดใหญ่จำนวนมากในการตรวจจับซึ่งยังไม่ได้รับการตอบสนองจากนักพัฒนา: github.com/phpmd / phpmd / ฉบับที่
NoBugs

อื่นเพิ่มความซับซ้อนของวัฏจักรและมักจะเขียนแตกต่างกันเพื่อหลีกเลี่ยงและอื่น ๆ เช่นถ้า (จริง) {$ x = 1; } else {$ x = 2; } สามารถเขียนใหม่ได้: $ x = 2; ถ้า (จริง) {$ x = 1; }
RichardAtHome

17

ฉันลองใช้ $ php -l แล้วลองใช้เครื่องมืออื่น ๆ แต่ที่ดีที่สุดในประสบการณ์ของฉัน (YMMV ของหลักสูตร) เป็นScheck ของ pfff ชุดเครื่องมือ ฉันได้ยินเกี่ยวกับ pfff ใน Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

คุณสามารถรวบรวมและติดตั้ง ไม่มีแพ็คเกจที่ดี (ใน Debian มิ้นต์ของฉันฉันต้องติดตั้ง libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev และ libgimp2.0-dev พึ่งพากันก่อน) แต่มันควรจะคุ้มค่ากับการใช้งานจริง

ผลการรายงานมีดังนี้

rjha@mint ~ $ ~/sw/pfff/scheck ~/code/github/sc/
login-now.php:7:4: CHECK: Unused Local variable $title
go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl.

ขอบคุณ. มันยังคงบ่นเกี่ยวกับการนำเข้าแบบไดนามิกของเรา แต่ความสามารถอื่น ๆ ของมันดูดีมาก ฉันยังต้องติดตั้ง binutils-gold และ scheck จำเป็นต้องติดตั้งในเส้นทางที่กำหนดเอง แต่ดูเหมือนว่าจะใช้งานได้ในขณะนี้
eswald

1
@ eswald วันนี้ฉันเป็นเครื่องตรวจจับระเบียบ php (phpmd) ของเครื่องมือทั้งหมดที่ฉันได้ลองไปแล้ว (โค้ดดมกลิ่น php, scheck, php -l, phpmd), IMHO, phpmd ทำงานได้ดีที่สุดสำหรับกรณีของฉัน
rjha94

คุณรู้หรือไม่ว่าจะหา Scheck ได้จากที่ใด?
George Katsanos

1
@GeorgeKatsanos scheck เป็นส่วนหนึ่งของ pfff toolset github.com/facebook/pfff
rjha94

2
Scheck ให้ข้อผิดพลาดกับฉันเสมอ "ตัวตรวจสอบ php ต้องการไฟล์กราฟ" เอกสารที่ไม่มีอยู่ส่วนใหญ่ไม่มีตัวอย่าง
Robert Bruce

14

ดูCloneDR ของ Semantic Designs 'เครื่องมือตรวจจับโคลน' ที่ค้นหาคัดลอก / วาง / แก้ไขรหัส มันจะพบชิ้นส่วนของรหัสที่ถูกต้องและใกล้ถึงแม้จะมีช่องว่างความคิดเห็นและแม้แต่การเปลี่ยนชื่อตัวแปร ตัวอย่างรายงานการตรวจจับ PHP สามารถดูได้ที่เว็บไซต์ (ฉันเป็นผู้เขียน)


1
ดูเว็บไซต์ดูเหมือนว่าเป็นเครื่องมือที่เหลือเชื่อ ฉันจะเข้ามาดูในภายหลัง! ขอบคุณสำหรับลิงค์ (+1 สำหรับ "ฉันเป็นผู้แต่ง" ด้วย)
Eric Cope

ความหายนะของปริญญาตรี conniving ใด ๆ
wom

7

NetBeans IDE ตรวจสอบข้อผิดพลาดทางไวยากรณ์, ตัวแปรที่ผิดปกติและเช่นนั้น มันไม่อัตโนมัติ แต่ทำงานได้ดีสำหรับโครงการขนาดเล็กหรือขนาดกลาง


6

มีเครื่องมือใหม่ที่เรียกว่าnWire สำหรับ PHP มันเป็นปลั๊กอินสำรวจรหัสสำหรับ Eclipse PDT และ Zend Studio 7.x ช่วยให้การวิเคราะห์รหัสเรียลไทม์สำหรับ PHP และมีเครื่องมือดังต่อไปนี้:

  • การสร้างภาพรหัส - การแสดงกราฟิกแบบโต้ตอบของส่วนประกอบและการเชื่อมโยง
  • การนำทางรหัส - มุมมองการนำทางที่ไม่ซ้ำกันแสดงการเชื่อมโยงทั้งหมดและทำงานร่วมกับคุณในขณะที่คุณเขียนหรืออ่านรหัส
  • การค้นหาอย่างรวดเร็ว - ค้นหาในขณะที่คุณพิมพ์วิธีการฟิลด์ไฟล์ ฯลฯ

1
มันไม่ตอบคำถาม เหมือนคำตอบ NetBeans มีอยู่ ฯลฯ ..
โยเซฟ


4

นอกจากนี้การวิเคราะห์รหัสคงที่แหล่งที่มาสำหรับช่องโหว่ในสคริปต์ PHP - Rips แหล่งที่มาของ RIPS มีอยู่ที่SourceForge SourceForge

จากเว็บไซต์ RIPS:

RIPS เป็นเครื่องมือที่เขียนด้วย PHP เพื่อค้นหาช่องโหว่ในแอปพลิเคชั่น PHP โดยใช้การวิเคราะห์โค้ดแบบคงที่ โดย tokenizing และการแยกไฟล์ซอร์สโค้ดทั้งหมด RIPS สามารถแปลงซอร์สโค้ด PHP เป็นโมเดลโปรแกรมและตรวจจับ sinks ที่มีความละเอียดอ่อน นอกจากผลลัพธ์ที่เป็นโครงสร้างของช่องโหว่ที่พบแล้ว RIPS ยังมีเฟรมเวิร์กการตรวจสอบรหัสรวมสำหรับการวิเคราะห์ด้วยตนเองเพิ่มเติม


RIPS เป็นโครงการครึ่งตายและใช้ได้กับโค้ด PHP ที่ไม่ใช่ OOP เท่านั้น
alexglue

3

มีเครื่องมือใหม่สำหรับการวิเคราะห์รหัสแบบคงที่ที่เรียกว่าPHP Analyzerวิเคราะห์

ในการวิเคราะห์เชิงสถิตหลายประเภทมันยังมีฟังก์ชั่นการแก้ไขอัตโนมัติขั้นพื้นฐานดูเอกสารประกอบเอกสาร

ปรับปรุง: PHP-Analyzer ตอนนี้เลิกใช้โครงการแล้ว แต่คุณยังสามารถเข้าถึงได้ในสาขาเดิม


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.