Empresa Vimeo nova versão do analisador estático , que permite identificar tanto erros óbvios quanto sutis no código em PHP, além de corrigir automaticamente alguns tipos de erros. O sistema é adequado para detectar problemas tanto em código legado quanto em código que utiliza recursos modernos introduzidos nas novas versões do PHP. O código do projeto é escrito em PHP e sob a licença MIT.
Psalm identifica a maioria dos problemas relacionados ao uso incorreto de tipos, além de diversos . Por exemplo, suporta a emissão de avisos sobre a mistura de variáveis de diferentes tipos em uma expressão, verificações lógicas incorretas (como "if ($a && $a) {}", "if ($a && !$a) {}" e "if ($a) {} elseif ($a) {}"), e inicialização incompleta de propriedades de objeto. O analisador é executado em modo multithread. É possível realizar verificações incrementais, onde apenas os arquivos que mudaram desde a última verificação são analisados.
Além disso, fornece ferramentas de programação segura, permitindo anotações no formato ("/** @var Type */") para fornecer informações sobre tipos de variáveis, valores de retorno, parâmetros de funções e propriedades de objetos. Também suporta a definição de padrões de uso de tipos e a aplicação de expressões assert. Por exemplo:
/** @var string|null */
$a = foo();
/** @var string $a */
echo strpos($a, 'hello');
/** @psalm-assert-if-true B $a */
function isValidB(A $a) : bool {
return $a instanceof B && $a->isValid();
}
Para automatizar a correção dos problemas encontrados, é fornecida a ferramenta Psalter, que suporta plugins e corrige problemas típicos no código, adiciona anotações de tipo e também faz manipulações como mover classes de um namespace para outro, mover métodos entre classes, renomear classes e métodos.
Na nova versão do Psalm a opção «—taint-analysis», que permite rastrear a relação entre os parâmetros de entrada recebidos do usuário (por exemplo, $_GET[‘name’]) e seu uso em locais que exigem a escape de caracteres (por exemplo, echo «<h1>$name</h1>»), incluindo o rastreamento de cadeias de atribuições intermediárias e chamadas de funções. Como fontes de dados potencialmente perigosos, considera-se o uso de arrays associativos $_GET, $_POST e $_COOKIE, mas também é possível fontes próprias. Dentre as ações que requerem acompanhamento da escapagem, estão as operações de saída que resultam na formação de conteúdo em formato HTML, adição de cabeçalhos HTTP ou execução de consultas SQL.
A verificação é aplicada ao usar funções como echo, exec, include e header. Ao analisar a necessidade de escape, são considerados tipos de dados como texto, strings SQL, HTML e código Shell, além de strings com parâmetros de autenticação. O modo proposto permite identificar vulnerabilidades no código que podem levar a ataques de cross-site scripting (XSS) ou injeção de código SQL.
Adicionalmente, pode-se destacar beta de testes de uma nova versão do PHP 8.0. O lançamento está previsto para 26 de novembro. Espera-se que nesta nova versão haja , como:
- , cuja implementação permitirá aumentar o desempenho.
- Suporte , que definem coleções de dois ou mais tipos (por exemplo «public function foo(Foo|Bar $input): int|float;»).
- Suporte (anotações), que permitem vincular metadados (por exemplo, informações sobre tipos) a classes sem usar a sintaxe Docblock.
- para definição de classes, permitindo combinar a definição do construtor e das propriedades.
- Novo tipo de valores de retorno — .
- Novo tipo — , que pode ser usado para definir como a função recebe parâmetros de diferentes tipos.
- Expressão para tratamento de exceções.
- para criação de objetos que podem ser descartados durante a coleta de lixo (por exemplo, para armazenamento de caches opcionais).
- uso da expressão «::class» para objetos (semelhante à chamada get_class()).
- definição em bloco catch de exceções não vinculadas a variáveis.
- deixar a vírgula após o último elemento na lista de parâmetros da função.
- Uma nova interface para identificação de quaisquer tipos de string ou dados que podem ser convertidos em string (para os quais o método __toString() está disponível).
- Nova função , um análogo simplificado de strpos para determinar a ocorrência de uma substring, assim como as funções str_starts_with() e str_ends_with() para verificar correspondências no início e no final da string.
- Adicionada a função , realizando a operação de divisão sem gerar erro em caso de divisão por zero.
- a lógica de concatenação de strings. Por exemplo, a expressão ‘echo «soma: » . $a + $b’ antes era interpretada como ‘echo («soma: » . $a) + $b’, enquanto que no PHP 8 será processada como ‘echo «soma: » . ($a + $b)’.
- checagem de operações aritméticas e bitwise, como as expressões ‘[] % [42]’ e ‘$object + 4’ gerando erro.
- algoritmo de ordenação estável, onde a ordem de valores iguais é mantida entre execuções diferentes.
Fonte: opennet.ru
