3.6% dos repositórios Python testados apresentavam erros de vírgula ausentes

Foram publicados os resultados de um estudo sobre a vulnerabilidade do código Python a erros relacionados ao uso incorreto de vírgulas no código. Os problemas são causados ​​​​pelo fato de que, ao enumerar, o Python concatena automaticamente as strings da lista se elas não estiverem separadas por vírgula, e também trata o valor como uma tupla se o valor for seguido por vírgula. Após realizar uma análise automatizada de 666 repositórios GitHub com código Python, os pesquisadores identificaram possíveis problemas de vírgula em 5% dos projetos estudados.

Uma inspeção manual adicional mostrou que erros reais estavam presentes em apenas 24 repositórios (3.6%), e os 1.4% restantes eram falsos positivos (por exemplo, uma vírgula poderia ser deliberadamente omitida entre linhas para concatenar caminhos de arquivos de várias linhas, hashes longos, HTML blocos ou expressões SQL). Vale ressaltar que entre os 24 repositórios com erros reais estavam projetos grandes como Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield e django-helpdesk. No entanto, problemas com vírgulas não são específicos do Python e frequentemente surgem em projetos C/C++ (exemplos de correções recentes são LLVM, Mono, Tensorflow).

Os principais tipos de erros estudados:

  • Falta acidental de uma vírgula em listas, tuplas e conjuntos, fazendo com que as strings sejam concatenadas em vez de serem interpretadas como valores separados. Por exemplo, no Sentry, um dos testes perdeu uma vírgula entre as strings "releases" e "discover" na lista, o que resultou na verificação de um manipulador "/releasesdiscover" inexistente, em vez de verificar "/releases" e " /descobrir" separadamente.
    3.6% dos repositórios Python testados apresentavam erros de vírgula ausentes

    Outro exemplo é que uma vírgula ausente no rapidpro fez com que duas regras diferentes fossem mescladas na linha 572:

    3.6% dos repositórios Python testados apresentavam erros de vírgula ausentes

  • Uma vírgula ausente no final de uma definição de tupla de elemento único, fazendo com que a atribuição atribua um tipo regular em vez de uma tupla. Por exemplo, a expressão "valores=(1,)" resultará em uma atribuição a uma variável de uma tupla de um elemento, mas "valores=(1)" resultará em uma atribuição de um tipo inteiro. Os parênteses nessas atribuições não afetam a definição do tipo e são opcionais, e a presença de uma tupla é determinada pelo analisador apenas com base na presença de vírgulas. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # receberá uma string em vez de uma tupla. ) }
  • A situação oposta são vírgulas extras durante a atribuição. Se uma vírgula for deixada acidentalmente no final de uma atribuição, uma tupla será atribuída como valor em vez do tipo usual (por exemplo, se “valor = 1,” for especificado em vez de “valor = 1”).

Fonte: opennet.ru

Adicionar um comentário