Как выполнить статический анализ кода в php? [закрыто]

466

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

  • неиспользуемые назначения переменных
  • массивы, которые назначаются без предварительной инициализации
  • и, возможно, предупреждения о стиле кода
  • ...
eswald
источник
57
Правильно: закрыто SO, когда явно такой ответ невероятно полезен.
Ира Бакстер
3
согласна. Этот вопрос имеет решающее значение. php lint (файл php -l) не может предоставить другую половину: запустите автозагрузку, убедитесь, что вызываемая функция существует, переменные существуют, свойства объекта существуют. и т. д.
Макс
6
@IraBaxter полезен, но, строго говоря, не по теме. softwarerecs.stackexchange.com , вероятно, является более тематическим местом. Конечно, ирония здесь заключается в том, что гораздо больше разработчиков знакомы с SO, чем с его братьями и сестрами ...
Уэйн Вернер
7
Тот факт, что столь многие люди находят этот тип вопросов полезным, возможно, объясняет, почему в настоящее время существует программное обеспечение. Это, конечно, показалось по теме назад, когда это был единственный сайт обмена стека. Теперь, когда для этого есть ясное место, имеет ли смысл мигрировать?
Эсвальд
4
Закрыто из-за довольных триггеров. Ба!
Roadowl

Ответы:

356

Запустите php в режиме lint из командной строки, чтобы проверить синтаксис без выполнения:

php -l FILENAME

Статические анализаторы более высокого уровня включают в себя:

Анализаторы нижнего уровня включают в себя:

Анализаторы времени выполнения, которые более полезны для некоторых вещей из-за динамической природы PHP, включают в себя:

Библиотеки документации phpdoc и doxygen выполняют своего рода анализ кода. Например, Doxygen можно настроить для визуализации хороших графов наследования с помощью graphviz .

Другой вариант - xhprof , похожий на xdebug, но более легкий, что делает его пригодным для производственных серверов. Инструмент включает в себя интерфейс на основе PHP.

troelskn
источник
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
Примечание : чтобы встроенная функция lint ( php -l) работала, вы должны установить ее, display_errors = onв php.iniпротивном случае вы получите только общее сообщение о том, что есть синтаксические ошибки, но нет сведений о том, какие ошибки или какие строки.
Synetech
8
Synetech - Хороший. Вы можете переопределить настройку в командной строке, используя -dпереключатель. Напр.php -l -d display_errors=on $FILENAME
troelskn
24

PHP Mess Detector - это круто и быстро.

aredridel
источник
7
Спасибо! Я искал потрясающий. На самом деле, я отказываюсь использовать что-либо, кроме потрясающих инструментов. :)
Проф. Фалькен нарушил контракт
1
Это начало, и похоже, что Netbeans использует его, но я бы не стал полностью этому доверять. Некоторые из его опций просто нечетны («предупреждают» вас, если вы используете оператор else ??), и в его обнаружениях есть множество больших ошибок, которые даже не получили ответа от разработчиков: github.com/phpmd / phpmd / Issues
NoBugs
иначе добавляет цикломатическую сложность и часто может быть написано по-другому, чтобы избежать и еще. например, если (верно) {$ x = 1; } else {$ x = 2; } можно переписать: $ x = 2; if (true) {$ x = 1; }
RichardAtHome
17

Я пытался использовать $ php -l и пару других инструментов. Однако лучший из моих опытов (YMMV, конечно) - это набор инструментов pfff . Я слышал о pfff на Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Вы можете скомпилировать и установить его. Нет хороших пакетов (на моем mint 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.
rjha94
источник
Спасибо. Он продолжает жаловаться на наш динамический импорт, но другие его возможности пока выглядят неплохо. Мне также нужно было установить binutils-gold, а scheck нужно было установить по произвольному пути, но теперь это работает.
Эсвальд
1
@eswald Сейчас я являюсь конвертером php-детектора (phpmd). Из всех инструментов, которые я пробовал до сих пор (сниффер 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 для "Я - автор" также)
Эрик Коуп
Бич любого коварного старшекурсника.
Wom
7

Среда IDE NetBeans проверяет синтаксические ошибки, неиспользуемые переменные и тому подобное. Это не автоматизировано, но отлично работает для небольших или средних проектов.

slikts
источник
6

Там новый инструмент под названием nWire для PHP . Это плагин для исследования кода для Eclipse PDT и Zend Studio 7.x. Он обеспечивает анализ кода в реальном времени для PHP и предоставляет следующие инструменты:

  • Визуализация кода - интерактивное графическое представление компонентов и ассоциаций.
  • Навигация по коду - уникальный навигационный вид показывает все ассоциации и работает с вами, пока вы пишете или читаете код.
  • Быстрый поиск - поиск по мере ввода методов, полей, файлов и т. Д.
zvikico
источник
1
это не ответ на вопрос. как ответ существует netbeans и т.д ..
Йосеф
5

PHP PMD (детектор беспорядка проекта) и PHP CPD (детектор копирования-вставки) как прежняя часть PHPUnit

erenon
источник
4

Существует RIPS - статический анализатор исходного кода для уязвимостей в PHP-скриптах . Источники RIPS доступны на SourceForge .

С сайта RIPS:

RIPS - это инструмент, написанный на PHP, для поиска уязвимостей в приложениях PHP с использованием статического анализа кода. Путем токенизации и синтаксического анализа всех файлов исходного кода RIPS может преобразовывать исходный код PHP в программную модель и обнаруживать чувствительные приемники (потенциально уязвимые функции), которые могут быть испорчены пользовательским вводом (под влиянием злонамеренного пользователя) во время выполнения программы. Помимо структурированного вывода обнаруженных уязвимостей RIPS также предлагает интегрированную структуру аудита кода для дальнейшего ручного анализа.

SteAp
источник
RIPS - это полумертвый проект, и он работает только с не-OOP php-кодом.
alexglue
3

Существует абсолютно новый инструмент для статического анализа кода, который называется PHP Analyzer .

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

ОБНОВЛЕНИЕ: PHP-Analyzer теперь устарел проект, но вы все еще можете получить к нему доступ в устаревшей ветке

fatganz
источник
2

Вы можете попробовать компилировать с хип-хопом Facebook.

Он выполняет статический анализ всего проекта и может быть тем, что вы ищете.

https://github.com/facebook/hiphop-php

Мартин Конечни
источник