Làm thế nào để thực hiện phân tích mã tĩnh trong php? [đóng cửa]


466

Có một công cụ phân tích tĩnh cho các tệp nguồn PHP không? Bản thân nhị phân có thể kiểm tra lỗi cú pháp, nhưng tôi đang tìm kiếm thứ gì đó nhiều hơn, như:

  • bài tập biến không sử dụng
  • mảng được gán vào mà không được khởi tạo trước
  • và có thể cảnh báo kiểu mã
  • ...

57
Righty-o: bị đóng bởi SO, khi rõ ràng loại câu trả lời này rất hữu ích.
Ira Baxter

3
đồng ý. Câu hỏi này rất quan trọng. php lint (tệp php -l) không cung cấp cho nửa kia: chạy tự động tải, đảm bảo một hàm được gọi là tồn tại, các biến đó tồn tại, các thuộc tính đối tượng tồn tại. vv
Tối đa

6
@IraBaxter hữu ích, nhưng không, nói đúng ra, về chủ đề. softwarerecs.stackexchange.com có lẽ là một địa điểm nhiều chủ đề hơn. Tất nhiên điều trớ trêu ở đây là nhiều nhà phát triển quen thuộc với SO hơn anh chị em của nó ...
Wayne Werner

7
Thực tế là rất nhiều người thấy loại câu hỏi này hữu ích có lẽ là lý do tại sao phần mềm hiện đang tồn tại. Nó chắc chắn dường như trở lại chủ đề khi đây là trang web trao đổi ngăn xếp duy nhất. Bây giờ có một nơi rõ ràng cho nó, nó có ý nghĩa để di chuyển?
eswald

4
Đóng cửa do đóng cửa hạnh phúc kích hoạt. Bah!
Roadowl

Câu trả lời:


356

Chạy php trong chế độ lint từ dòng lệnh để xác thực cú pháp mà không cần thực thi:

php -l FILENAME

Máy phân tích tĩnh cấp cao hơn bao gồm:

Máy phân tích cấp thấp hơn bao gồm:

Các trình phân tích thời gian chạy, hữu ích hơn cho một số thứ do tính chất động của PHP, bao gồm:

Các thư viện tài liệu phpdocdoxygen thực hiện một loại phân tích mã. Doxygen, ví dụ, có thể được cấu hình để hiển thị biểu đồ thừa kế đẹp với graphviz .

Một tùy chọn khác là xhprof , tương tự như xdebug, nhưng nhẹ hơn, làm cho nó phù hợp với các máy chủ sản xuất. Công cụ này bao gồm một giao diện dựa trên PHP.


20
+1 khi mất 6 giờ trong cuộc đời tôi để thử tất cả những điều tốt đẹp này!
Abe Petrillo

14
@dimitko: Đó là bởi vì php -lchỉ có thể đọc một tệp đầu vào tại một thời điểm (nghĩa là, nó sẽ không hoạt động nếu bạn làm như vậy php -l file1.php file2.php). Thay vào đó, bạn cần sử dụng -n 1tùy chọn, thông xargsbáo chỉ sử dụng một dòng đầu vào cho mỗi quy trình lệnh. Điều đó thay vào đó sẽ khiến nó chạy php -l file1.phptheo sau php -l file2.php, riêng biệt. Đồng thời, bạn có thể sử dụng -P <n>để chạy các quy trình "n" tại một thời điểm, để song song hóa việc thực hiện:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;hoạt động đáng tin cậy.
Koen.

11
NB : Đối với built-in chức năng lint ( php -l) để làm việc, bạn phải thiết lập display_errors = ontrong php.ini, nếu không bạn sẽ chỉ nhận được một thông điệp chung về có bị lỗi cú pháp nhưng không có chi tiết về những gì lỗi (s) hoặc những gì dòng (s).
Synetech

8
Synetech - Tốt một. Bạn có thể ghi đè cài đặt trên dòng lệnh bằng cách sử dụng công -dtắc. Ví dụ:php -l -d display_errors=on $FILENAME
troelskn



24

PHP Mess dò tìm là tuyệt vời và nhanh chóng.


7
Cảm ơn bạn! Tôi đã tìm kiếm một tuyệt vời. Trong thực tế, tôi từ chối sử dụng bất cứ thứ gì ngoại trừ các công cụ tuyệt vời. :)
Hợp đồng của giáo sư Falken vi phạm vào

1
Đó là một khởi đầu và dường như đó là những gì Netbeans sử dụng, nhưng tôi không hoàn toàn tin tưởng vào nó. Một số tùy chọn của nó chỉ là số lẻ ("cảnh báo" cho bạn nếu bạn sử dụng một câu lệnh khác ??) và có rất nhiều lỗi lớn trong các phát hiện của nó, thậm chí còn không có phản hồi từ các nhà phát triển: github.com/phpmd / phpmd / vấn đề
NoBugs

khác thêm phức tạp chu kỳ và thường có thể được viết khác nhau để tránh và khác. ví dụ: nếu (đúng) {$ x = 1; } khác {$ x = 2; } có thể được viết lại: $ x = 2; if (đúng) {$ x = 1; }
RichardAtHome

17

Tôi đã thử sử dụng $ php -l và một vài công cụ khác. Tuy nhiên, điều tốt nhất trong kinh nghiệm của tôi (YMMV, tất nhiên) là sơ đồ của bộ công cụ pfff . Tôi đã nghe nói về pfff trên Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Bạn có thể biên dịch và cài đặt nó. Không có gói nào đẹp (trên Debian mint của tôi, trước tiên tôi phải cài đặt libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev và libgimp2.0-dev) nhưng nó đáng để sử dụng.

Kết quả được báo cáo như

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.

Cảm ơn bạn. Nó tiếp tục phàn nàn về nhập khẩu năng động của chúng tôi, nhưng các khả năng khác của nó có vẻ tốt cho đến nay. Tôi cũng cần phải cài đặt binutils-gold, và scheck cần được cài đặt trong một đường dẫn tùy chỉnh, nhưng dường như nó hoạt động ngay bây giờ.
eswald

1
@eswald Bây giờ một ngày tôi là một trình phát hiện lộn xộn php (phpmd). Trong tất cả các công cụ tôi đã thử cho đến nay (mã php sniffer, scheck, php -l, phpmd), IMHO, phpmd hoạt động tốt nhất cho trường hợp của tôi.
rjha94

Bạn có biết nơi để tìm Scheck?
George Katsanos

1
@GeorgeKatsanos scheck là một phần của bộ công cụ pfff. github.com/facebook/pfff
rjha94

2
Scheck luôn cho tôi lỗi "Trình kiểm tra php cần một tệp biểu đồ". Các tài liệu chủ yếu không tồn tại không có ví dụ.
Robert Bruce

14

Xem CloneDR của Semantic Design , một công cụ "phát hiện bản sao" tìm mã sao chép / dán / chỉnh sửa. Nó sẽ tìm thấy các đoạn mã chính xác và gần bỏ lỡ, bất chấp khoảng trắng, các bình luận và thậm chí cả các lần thay đổi. Một báo cáo phát hiện mẫu cho PHP có thể được tìm thấy tại wesite. (Tôi là tác giả).


1
Nhìn vào trang web, đó có vẻ như là một công cụ đáng kinh ngạc. Tôi sẽ xem xét kỹ hơn sau! Cảm ơn vì liên kết (+1 cho "Tôi cũng là tác giả")
Eric đối phó

Các nguyên nhân của bất kỳ sinh viên liên kết.
WOM

7

IDE NetBeans kiểm tra các lỗi cú pháp, các biến không được sử dụng và như vậy. Nó không tự động, nhưng hoạt động tốt cho các dự án nhỏ hoặc vừa.


6

Có một công cụ mới gọi là nWire cho PHP . Nó là một plugin khám phá mã cho Eclipse PDT và Zend Studio 7.x. Nó cho phép phân tích mã thời gian thực cho PHP và cung cấp các công cụ sau:

  • Mã trực quan - biểu diễn đồ họa tương tác của các thành phần và hiệp hội.
  • Điều hướng mã - chế độ xem điều hướng duy nhất hiển thị tất cả các liên kết và hoạt động với bạn trong khi bạn viết hoặc đọc mã.
  • Tìm kiếm nhanh - tìm kiếm khi bạn nhập phương thức, trường, tệp, v.v.

1
Nó không trả lời cho câu hỏi. giống như câu trả lời tồn tại netbeans, v.v.
Yosef

5

PHP PMD (trình phát hiện lộn xộn dự án) và PHP CPD (trình phát hiện sao chép dán) là phần trước của PHPUnit


4

RIPS - Một bộ phân tích mã nguồn tĩnh cho các lỗ hổng trong các tập lệnh PHP . Nguồn của RIPS có sẵn tại SourceForge .

Từ trang RIPS:

RIPS là một công cụ được viết bằng PHP để tìm các lỗ hổng trong các ứng dụng PHP bằng cách sử dụng phân tích mã tĩnh. Bằng cách mã hóa và phân tích tất cả các tệp mã nguồn, RIPS có thể chuyển đổi mã nguồn PHP thành mô hình chương trình và phát hiện các bồn rửa nhạy cảm (các chức năng dễ bị tổn thương) có thể bị nhiễm bẩn bởi người dùng (bị ảnh hưởng bởi người dùng độc hại) trong luồng chương trình. Bên cạnh đầu ra có cấu trúc của các lỗ hổng được tìm thấy, RIPS cũng cung cấp một khung kiểm toán mã tích hợp để phân tích thủ công hơn nữa.


RIPS là một dự án đã chết một nửa và nó chỉ hoạt động với mã php không OOP.
alexglue

3

Có một công cụ hoàn toàn mới để phân tích mã tĩnh được gọi là Trình phân tích PHP .

Trong số nhiều loại phân tích tĩnh, nó cũng cung cấp chức năng sửa lỗi tự động cơ bản, xem tài liệu .

CẬP NHẬT: Trình phân tích PHP hiện là dự án không dùng nữa nhưng bạn vẫn có thể truy cập nó trên nhánh kế thừa


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.