Як виконати аналіз статичного коду в php? [зачинено]


466

Чи є інструмент статичного аналізу для вихідних файлів PHP? Сам двійковий файл може перевірити наявність синтаксичних помилок, але я шукаю щось, що робить більше, наприклад:

  • невикористані змінні призначення
  • масиви, які присвоєні без ініціалізації спочатку
  • і, можливо, попередження про стиль коду
  • ...

57
Righty-o: закритий SO, коли однозначно така відповідь неймовірно корисна.
Іра Бакстер

3
згоден. Це питання є вирішальним. php lint (файл php -l) не в змозі надати другу половину: запустити автозавантаження, переконайтесь, що функція, що називається, існує, що змінні існують, властивості об'єкта існують. пр.
Макс

6
@IraBaxter корисний, але не, строго кажучи, по темі. softwarerecs.stackexchange.com , мабуть, є більш тематичним місцем розташування. Звичайно, іронія тут полягає в тому, що набагато більше розробників знайомі з ТА, ніж це рідний брат ...
Wayne Werner

7
Той факт, що так багато людей вважає цей тип запитів корисним, мабуть, тому зараз існує програмне забезпечення. Це, звичайно, здавалося, що це був єдиний сайт обміну стеками. Тепер, коли для цього є чітке місце, чи є сенс мігрувати?
eswald

4
Закрито через радіоприймачів. Ба!
Roadowl

Відповіді:


356

Запустіть php в lint-режимі з командного рядка, щоб перевірити синтаксис без виконання:

php -l FILENAME

Статичні аналізатори вищого рівня включають:

Аналізатори нижнього рівня включають:

Аналізатори виконання, які є кориснішими для деяких речей завдяки динамічній природі PHP, включають:

Бібліотеки документації phpdoc і 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
Джо,

11
find /your/path -name '*.php' -exec php -l {} \;працює надійно.
Коен.

11
NB : Для вбудованої функції ворсинок ( php -l) на роботу, ви повинні встановити display_errors = onв php.iniіншому випадку ви отримаєте тільки загальне повідомлення про там бути помилки синтаксису , але ніяких подробиць про те, що помилка (и) або що лінія (и).
Synetech

8
Synetech - Хороший. Ви можете змінити налаштування в командному рядку, використовуючи -dперемикач. Напр.php -l -d display_errors=on $FILENAME
troelskn

38

Інтернет PHP обличчя

PHPLint

Перевірка неіціалізованих змінних . Хоча, посилання 1 і 2 вже здаються цим чудовими.

Я не можу сказати, що я інтенсивно використовував щось із цього :)


Його відповідь зробила сьогодні мій день чудовим! +1
Гільгерме Насіменто


24

PHP детектор безладу є приголомшливим і швидким.


7
Дякую! Я шукав дивовижного. Насправді я відмовляюся використовувати що-небудь, крім дивовижних інструментів. :)
Контракт професора Фолкена порушив

1
Це початок, і, здається, це те, що Netbeans використовує, але я б не довіряв йому цілком. Деякі з його варіантів просто незвичайні ("попереджають" вас, якщо ви використовуєте інший оператор ??), і в його виявленнях є численні великі помилки, на які навіть не було відповіді розробників: github.com/phpmd / phpmd / проблеми
NoBugs

інше додає цикломатичної складності і часто може бути написане по-різному, щоб уникнути і ще. наприклад, якщо (вірно) {$ x = 1; } else {$ x = 2; } можна переписати: $ x = 2; якщо (вірно) {$ x = 1; }
RichardAtHome

17

Я спробував використовувати $ php -l та пару інших інструментів. Однак найкращий з мого досвіду (YMMV, звичайно) - це набір інструментів 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 спочатку), але це повинно бути вартим intsall.

Результати повідомляються як

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). З усіх інструментів, які я пробував до цього часу (sniffer php-коду, scheck, php -l, phpmd), IMHO, phpmd працює найкраще для мого випадку.
rjha94

Ви знаєте, де знайти Шека?
Джордж Катсанос

1
@GeorgeKatsanos scheck є частиною набору інструментів pfff. github.com/facebook/pfff
rjha94

2
Scheck завжди дає мені помилку "php checker потрібен файл графа". Здебільшого неіснуюча документація не має прикладів.
Роберт Брюс

14

Див . CloneDR "Semantic Designs" , інструмент "виявлення клонів", який знаходить код копіювання / вставки / редагування. Він знайде точні та близькі фрагменти пропущеного коду, незважаючи на пробіли, коментарі та навіть змінні перейменування. Звіт про виявлення зразків для PHP можна знайти на веб-сайті. (Я автор).


1
Дивлячись на сайт, це здається неймовірним інструментом. Пізніше я ознайомлюсь детальніше! Дякую за посилання (+1 також "Я автор")
Ерік Коуп

Бана будь-якого покірного недограду.
жінка

7

IDE NetBeans перевіряє наявність синтаксичних помилок, непотрібних змінних тощо. Це не автоматизовано, але добре працює для малих та середніх проектів.


6

З'явився новий інструмент під назвою nWire для PHP . Це плагін дослідження коду для Eclipse PDT та Zend Studio 7.x. Він дозволяє аналізувати код у режимі реального часу для PHP та надає такі інструменти:

  • Візуалізація коду - інтерактивне графічне зображення компонентів та об'єднань.
  • Навігація по коду - унікальний перегляд навігації показує всі асоціації та працює з вами під час написання чи читання коду.
  • Швидкий пошук - пошук під час введення методів, полів, файлів тощо.

1
це не відповідає на питання. як відповідь існує netbeans тощо.
Йосеф

5

PHP PMD (детектор безладного проекту) та PHP CPD (детектор пасти копії) як колишня частина PHPUnit


4

Є RIPS - статичний аналізатор вихідного коду на вразливості в PHP-скриптах . Джерела RIPS доступні в SourceForge .

З сайту RIPS:

RIPS - це інструмент, написаний на PHP, щоб знайти вразливості в додатках PHP, використовуючи статичний аналіз коду. За допомогою токенізації та аналізу всіх файлів вихідного коду RIPS в змозі перетворити вихідний код PHP в модель програми та виявити чутливі раковини (потенційно вразливі функції), які можуть бути пошкоджені користувачем (під впливом зловмисного користувача) під час потоку програми. Окрім структурованого виводу знайдених вразливих місць, RIPS також пропонує інтегровану систему аудиту коду для подальшого ручного аналізу.


RIPS - це напів мертвий проект, який працює лише з PHP-кодом, який не є OOP.
alexglue

3

Існує абсолютно новий інструмент для статичного аналізу коду під назвою PHP Analyzer .

Серед багатьох типів статичного аналізу він також забезпечує основну функцію автоматичного закріплення, див. Документацію .

ОНОВЛЕННЯ: PHP-аналізатор тепер застарілий проект, але ви все одно можете отримати доступ до нього у застарілому відділенні


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.