Lançamento do Salmo 3.12, um analisador estático para a linguagem PHP. Versão alfa do PHP 8.0

Empresa Vimeo publicado nova versão do analisador estático Salmo 3.12, que permite identificar erros óbvios e sutis no código PHP, bem como corrigir automaticamente alguns tipos de erros. O sistema é adequado para identificar problemas tanto em código legado quanto em código que utiliza recursos modernos introduzidos em novos ramos do PHP. O código do projeto é escrito em PHP e distribuído por sob a licença do MIT.

O Salmo identifica a maioria dos problemas associados ao uso incorreto de tipos, bem como vários erros típicos. Por exemplo, ele suporta avisos sobre mistura de variáveis ​​de diferentes tipos em uma expressão, testes lógicos incorretos (como “if ($a && $a) {}”, “if ($a && !$a) {}” e “ if ($a) {} elseif ($a) {}"), inicialização incompleta das propriedades do objeto. O analisador é executado no modo multithread. É possível realizar varreduras incrementais, que analisam apenas os arquivos que foram alterados desde a última varredura.

Além disso, são fornecidas ferramentas de programação seguras para permitir usar anotações no formato Docblock (“/** @var Type */”) para fornecer informações sobre tipos de variáveis, valores de retorno, parâmetros de função, propriedades de objetos. A definição de padrões de uso de tipo e o uso de instruções assert também são suportados. Por exemplo:

/** @var string|nulo */
$a = foo();

/** @var string $a */
echo strpos($a, 'olá');

/** @salmo-afirmar-se-verdadeiro B $a */
função éValidB(A $a): bool {
return $a instância de B && $a->isValid();
}

Para automatizar a eliminação dos problemas encontrados, é fornecido o utilitário Psalter, que suporta plugins e permite solucionar problemas comuns de código, adicionar anotações de tipo e realizar manipulações como mover classes de um namespace para outro, mover métodos entre classes e renomear classes e métodos.

Na nova edição do Salmo implementado a opção "--taint-análise" permite rastrear a relação entre os parâmetros de entrada recebidos do usuário (por exemplo, $_GET['nome']) e seu uso em locais que exigem escape de caracteres (por exemplo, echo " $nome "), inclusive por meio de cadeias de rastreamento de atribuições intermediárias e chamadas de função. O uso de arrays associativos $_GET, $_POST e $_COOKIE é considerado fonte de dados potencialmente perigosos, mas também é possível definição fontes próprias. As ações que exigem rastreamento de escape incluem operações de saída que geram conteúdo HTML, adicionam cabeçalhos HTTP ou executam consultas SQL.

A validação é usada ao usar funções como echo, exec, include e header. Ao analisar a necessidade de escape, são levados em consideração tipos de dados como texto, strings com código SQL, HTML e Shell, strings com parâmetros de autenticação. O modo proposto permite identificar vulnerabilidades no código que levam ao cross-site scripting (XSS) ou à substituição de SQL.

Além disso, pode-se notar começar teste alfa do novo branch PHP 8.0. O lançamento está previsto para 26 de novembro. O seguinte é esperado na nova filial: inovaçõesComo:

  • Ativando Compilador JIT, cujo uso melhorará a produtividade.
  • apoio tipos de união, definindo coleções de dois ou mais tipos (por exemplo, “public function foo(Foo|Bar $input): int|float;”).
  • apoio atributos (anotações) que permitem vincular metadados (como informações de tipo) a classes sem usar a sintaxe Docblock.
  • Sintaxe abreviada definições de classe, permitindo combinar a definição de um construtor e propriedades.
  • Novo tipo de retorno - estático.
  • Novo tipo - misto, que pode ser usado para determinar se uma função aceita parâmetros de tipos diferentes.
  • Expressão jogar para lidar com exceções.
  • Mapa fraco para criar objetos que podem ser sacrificados durante a coleta de lixo (por exemplo, para armazenar caches desnecessários).
  • Oportunidade usando a expressão “::class” para objetos (análogo a chamar get_class()).
  • Oportunidade definições no bloco catch de exceções que não estão vinculadas a variáveis.
  • Oportunidade deixando uma vírgula após o último elemento da lista de parâmetros da função.
  • Nova interface Stringável para identificar quaisquer tipos de string ou dados que possam ser convertidos em uma string (para a qual o método __toString() está disponível).
  • Novo recurso str_contains (), um análogo simplificado de strpos para determinar a ocorrência de uma substring, bem como as funções str_starts_with() e str_ends_with() para verificar correspondências no início e no final de uma string.
  • Função adicionada fdiv(), que executa uma operação de divisão sem gerar erro ao dividir por zero.
  • Mudado lógica de junção de strings. Por exemplo, a expressão 'echo "sum:" . $a + $b' foi anteriormente interpretado como 'echo ("sum: " . $a) + $b', e no PHP 8 será tratado como 'echo "sum: " . ($a + $b)'.
  • Apertado verificar operações aritméticas e de bits, por exemplo, as expressões "[] % [42]" e "$object + 4" resultarão em erro.
  • Implementado um algoritmo de classificação estável no qual a ordem de valores idênticos é preservada em diferentes execuções.

Fonte: opennet.ru

Adicionar um comentário