Выпуск статического анализатора NoVerify
Представлен новый релиз статического анализатора для PHP NoVerify, разрабатываемого компанией «В Контакте».
Изначально NoVerify разрабатывался для анализа исходного кода социальной сети ВКонтакте, размер которой превышает 5 миллионов строк кода. Поэтому преимущества данного статического анализатора можно заметить при большой кодовой базе (если размер проекта меньше 100 тысяч строк кода, рекомендуется использовать другие статические анализаторы).
NoVerify способен обрабатывать примерно 200 тысяч строк кода в секунду на современном компьютере (intel i5 + ssd).
Изменения проверок:
- проверка наличия блока комментариев
phpdoc
переименована вmissingPhpdoc
; - чекер
undefined
разбит на следующие проверкиmaybeUndefined
undefinedConstant
undefinedFunction
undefinedMethod
undefinedProperty
undefinedType
undefinedVariable
- проверка неочевидности порядка аргументов тернарного оператора
nestedTernary
включена по умолчанию; - чекеры
switchDefault
(наличиеdefault
в конструкцииswitch
),arrayAccess
(доступ к немассивам через синтаксис массивов),complexity
(сообщает об излишне сложных функциях); - проверка
undefinedType
разбита на два чекера:undefinedClass
undefinedTrait
- проверки
undefinedVariable
иmaybeUndefined
теперь не выводят предупреждение, если переменные являются левым операндом оператора объединения сnull
; phpdocLint
переименован вinvalidDocblock
;phpdocType
переименован вinvalidDocblockType
;phpdocRef
переименован вinvalidDocblockRef
;- добавлена новая проверка
parentNotFound
, обнаруживающая несуществующий родительский класс:
class Foo {
public function f() {
parent::b(); // Class Foo has no parent.
}
}
Исправлено:
- если в группе модификаторов регулярных выражений верхнего уровня присутствует неверный символ, то она не будет анализирована;
- вывод теперь показывает только время (без даты и миллисекунд);
- исправлены быстрые исправления, которые работали некорректно;
- если файл из директории vendor не может быть анализирован, ошибка не будет отображена;
- в нестрогом режиме теперь не будут отображены ошибки неизвестного метода и свойства для
null
иstdClass
; - добавлен атрибут
@disabled
который отключает проверку для динамических правил; - все варианты проверки
unused
теперь выбрасывают предупреждение; - исправлен баг с невозможностью использовать
self
внутри трейта; - исправлена паника при
enum
;
Добавлено:
- добавлена возможность установки через менеджер зависимостей Composer;
- добавлена поддержка анонимных классов;
- добавлена песочница, где можно попробовать использовать NoVerify без установки;
- улучшен вывод типов для сложных выражений с
instanceof
вif-else
:
/**
* @param mixed $a
*/
function f1($a) {
if ($a instanceof Foo || $a instanceof Boo) {
exprtype($a, "\Boo|\Foo");
}
}
/**
* @param Boo|Foo|Zoo $a
*/
function f1($a) {
if ($a instanceof Foo && $a instanceof Boo) {
exprtype($a, "\Boo|\Foo");
} else {
exprtype($a, "\Zoo");
}
}
- добавлено сужение типа:
/**
* @param mixed $a
*/
function f($a) {
if (!$a instanceof Foo) {
return;
}
exprtype($a, "\Foo");
}
- добавлена поддержка союзных типов и тайпхинтов;
- добавлена документация для режима diff;
- добавлено быстрое исправление для старого синтаксиса массивов в параметрах функции;
- специальные скалярные типы psalm теперь обрабатываются и превращаются в ближайшие обычные типы;
- добавлен тип
never
KPHP:
- типы
kmixed
иfuture
теперь нормализованы кmixed
.
>>> Подробности