27.09.2021

Выпуск статического анализатора 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.

>>> Подробности

Источник.