• Nenhum resultado encontrado

Devido à complexidade e as inúmeras variáveis envolvidas na tarefa de programação, principalmente em grandes sistemas de software, é inevitável a existências de erros ou anomalias gerados na codificação. A análise estática de código visa facilitar a detecção dos problemas decorrentes da codificação dos sistemas de software. Além disso, pode ser utilizada de forma preventiva, obtendo análises da estrutura do código fonte, sobre o qual engenheiros de software podem tomar decisões para futuras implementações.

Existem diversas técnicas de análise estática de código:

Análise de Fluxo de Controle: análise dos pontos de decisão lógica do sistema, retornando informações sobre fluxo de controle do sistema;

Análise de Fluxo de Dados: testa os possíveis caminhos ou fluxos de execução, partindo da definição de uma variável até onde ela possivelmente será utilizada, formando um par que é chamado de definição-uso (definition-use). Neste método, conjuntos de teste são gerados para se conseguir 100% de cobertura, para cada par;

Compilação e Padronização de Código: verifica se o código obedece a normas de codificação, que abrangem tanto aspectos arquiteturais quanto estruturas de programação, permitindo que o software seja mais manutenível e testável;

Geração de Métricas sobre o Código: durante a análise estática podem ser geradas métricas de código que irão contribuir para um maior nível de manutenibilidade e confiança no código. Exemplos de tais métricas são: complexidade ciclomática, tamanho, número de chamadas a funções, dentre outras;

Análise Estática de Arquitetura: são análises feitas no código para verificar sua estrutura, como por exemplo: como os módulos e as classes se comunicam, tipos de retorno, parâmetros, chamadas indevidas, etc.

Um tipo muito comum de análise estática é a inspeção manual de código, na qual um stakeholder verifica manualmente o código fonte procurando por possíveis problemas de implementação. Essa abordagem de análise é muito trabalhosa e normalmente é realizada quando não há ferramentas para a linguagem de programação alvo ou quando as

ferramentas não são capazes de analisar algum aspecto desejado. A inspeção manual de código também é incluída em alguns processos (OpenUP, 2011) como uma atividade em que o programador realiza antes de enviar o código para a etapa de testes, e dessa forma detecta falhas previamente diminuindo a sobrecarga de atividades de testes.

Também existem abordagens automáticas para análise de código. Elas são baseadas em ferramentas que acessam os artefatos de implementação e realizam uma análise da estrutura do código. Essas ferramentas de análise são projetadas com o propósito de analisar algumas características específicas do código. Ainda há frameworks de análise estática de código que permitem aos usuários construir análises de código, embora os

frameworks também focalizem contextos específicos, eles permitem aos usuários construir

análises customizadas. Algumas ferramentas destacadas:

FindBugs: é um detector de padrões de erros para Java (COLE et. al., 2006). Utiliza uma série de heurísticas projetadas para balancear a precisão e eficiência da análise. Uma das principais técnicas utilizadas pelo FindBugs é a comparação da sintaxe do código com padrões de sintaxe identificados como más práticas de programação. Pode ser estendido utilizando Java para a construção de análises customizadas.

PMD: realiza análise com base na verificação da sintaxe do código, mas não analisa o fluxo de dados do programa (COPELAND, 2005). O PMD focaliza em verificações de convenções de boas práticas de codificação, por exemplo, indica um bloco de código catch vazio como erro. O PMD pode ser facilmente estendido por programadores, que podem escrever novos padrões de erros utilizando Java ou XPath.

Soot Framework: é um framework para otimização e análise de código baseado na sintaxe do código (VALL´EE-RAI et. al., 1999). O Soot provê quatro representações intermediárias do bytecode Java que podem ser adotadas de acordo com os aspectos que se deseja analisar. O Soot disponibiliza pontos de extensão que permitem aos usuários criar análises especializadas.

Checkstyle: analisa o código fonte Java em busca de violações de convenções de codificação com o objetivo de melhorar a legibilidade do código (BURN, 2011). O Checkstyle também identifica outros problemas como o alto nível de acoplamento entre

classes e o tamanho excessivo de métodos. O Checksyle provê uma interface para os usuários escreverem as próprias regras de verificação.

A importância de análise estática de código para a abordagem proposta neste trabalho é o suporte a extração de dependências de baixo nível de artefatos que implementam a LPS, ou seja, do espaço da solução. A idéia é utilizar uma ferramenta de análise estática de código para obter informações sobre a organização estrutural do código, e dessa forma estabelecer os relacionamentos de dependência que são imprescindíveis para a análise de impacto de mudanças em LPS.

Nesta seção apresentamos algumas ferramentas de análise de código, no entanto, para a implementação proposta neste trabalho adotou-se a ferramenta Design Wizard que é descrita em detalhes a seguir.

2.4.1 Design Wizard

A Design Wizard (BRUNET; GUERRERO; FIGUEIREDO, 2009) é uma API de inspeção automática de software, na qual as informações são extraídas de artefatos de programas Java com extensão jar ou class. Design Wizard provê uma série de métodos que verificam a existência de determinadas propriedades estrut urais do código, tais como: a chamada de métodos, o acesso aos atributos de classe, acessos a classes, acesso a pacotes, entre outros. Com esses métodos providos pela API é simples checar dependências entre componentes de código Java. A Design Wizard apóia a verificação de conformidade arquitetural de softwares, para que estes se tornem mais confiáveis. Também auxilia o acompanhamento do desenvolvimento de software, checando propriedades que devem ser mantidas para que não haja diferença entre a arquitetura inicial proposta e a implementação. A Design Wizard também pode ser utilizada para controlar a manutenção e a evolução do software, através da verificação de conformidade da arquitetura com a implementação.

No contexto desta dissertação, a Design Wizard será utilizada para extrair informações sobre dependências, chamadas e acesso de componentes (classes, interfaces) presentes no código de LPS implementadas na linguagem Java. Estes dados complementarão as informações de dependências entre artefatos do Squid Analyser Model. A Design Wizard é a ferramenta de análise estática de código escolhida para

implementação deste trabalho, principalmente por permitir a extração da relação de dependências de atributos, métodos, classes e pacotes, diferenciando os tipos de relacionamentos. Outro fator é a compatibilidade da extensão com o nosso projeto, que é implementado em Java. A adoção da Design Wizard apenas requer incluir a biblioteca em um projeto Java e iniciar a análise passando como argumento o caminho do projeto a ser analisado. Enfim, a Design Wizard atende as necessidades de análise de código requisitadas para este trabalho, apresenta uma interface de interação objetiva, e é uma ferramenta gratuita de código-fonte aberto.

Documentos relacionados