EXPRESS ˜ AO CONSTANTE, C ´ ODIGO INACESS´IVEL E LOOP

No documento Análise estática de código para o portal de algoritmos da UCS (páginas 55-59)

3 ESCOLHA DA T ´ ECNICA PARA CADA ERRO

3.3 EXPRESS ˜ AO CONSTANTE, C ´ ODIGO INACESS´IVEL E LOOP

O erro de express ˜ao constante, c ´odigo inacess´ıvel e loop s ˜ao erros que podem ser encontrados da mesma forma, pois um c ´odigo inacess´ıvel ocorre quando existe um condicional que nunca ir ´a passar por uma das arestas portanto ´e uma express ˜ao constante e o loop ´e um lac¸o que contem uma express ˜ao cons- tante que faz com que o lac¸o nunca encontre a sa´ıda. Para detectar estes erros foi escolhida a forma e-SSA com o algoritmo de an ´alise de intervalo de valores mas adicionando um passo a mais. Ao terminar o c ´alculo de intervalo de valores o algoritmo ir ´a utilizar os dados dos intervalos para detectar se existem as ex- press ˜oes constantes com isso detectando c ´odigo inacess´ıvel e loop (STAIGER et al., 2007; XU, 2001).

O Trecho de C ´odigo 9 mostra um exemplo onde h ´a c ´odigo inacess´ıvel, express ˜ao constante e um loop. A express ˜ao j = 15 vai ser sempre verdadeira pois a vari ´avel j ´e composta pela multiplicac¸ ˜ao de a e b que s ˜ao 3 e 5 respec- tivamente, resultando no valor 15, e assim temos um c ´odigo inacess´ıvel que ´e o caminho da aresta-falsa do teste. No loop a express ˜ao i <> a ser ´a sempre verdadeira pois o i sempre ser ´a 3 e diferente de a que possui valor 5.

Trecho de C ´odigo 9 — Exemplo de algoritmo com express ˜ao constante, c ´odigo inacess´ıvel e loop

1 a l g o r i t m o 2 var

3 a , b , j , k , i : i n t e i r o 4 i n i c i o 5 a = 5; 6 b = 3; 7 j = a * b ; 8 9 se j = 15 e n t ~a o 10 i = 3; 11 s e n ~a o 12 i = 1; 13 f i m s e 14 15 e n q u a n t o i < > a f a ¸c a 16 i n i c i o 17 k = k + 1; 18 j = i + b ; 19 f i m e n q u a n t o 20 21 f i m a l g o r i t m o

Fonte: Pr ´oprio autor

3.4 ´INDICES DE VETORES

O erro de ´ındices de vetores ocorre quando ´e feita uma tentativa de acesso a uma posic¸ ˜ao do vetor que n ˜ao existe. Este erro ´e detectado utilizando a forma e-SSA com o algoritmo de an ´alise de intervalo de valores, da mesma forma da Sec¸ ˜ao 3.3. Ao propagar os intervalos de valores o algoritmo testar ´a o ´ındice do vetor com a declarac¸ ˜ao dele, se o ´ındice estiver fora do declarado ser ´a identificado como erro (BIRCH; ENGELEN; GALLIVAN, 2004).

No Trecho de C ´odigo 10 temos um exemplo de erro de ´ındices de ve- tores. A vari ´avel vet ´e um vetor com posic¸ ˜oes de intervalo de 1 a 10, no lac¸o repita o i ´e incrementando de uma unidade a cada iterac¸ ˜ao e o teste de sa´ıda ´e atei > 10. Portanto na pen ´ultima iterac¸ ˜ao o i estar ´a valendo 10 mas ir ´a para o in´ıcio do lac¸o novamente pois 10 n ˜ao ´e maior que10, com isso i ser ´a incremen- tado para o valor 11 e ocorrer ´a o erro.

Trecho de C ´odigo 10 — Exemplo de algoritmo com erro de ´ındice de vetores

1 a l g o r i t m o 2 var 3 vet : v e t o r [ 1 . . 1 0 ] de i n t e i r o 4 i : i n t e i r o 5 i n i c i o 6 i = 0; 7 // na ´u l t i m a i t e r a ¸c ~a o o i v a i s e r i n c r e m e n t a d o p a r a 11 8 // a s s i m o c o r r e n d o um e r r o 9 r e p i t a 10 i = i +1;

11 vet [ i ] = i ; 12 ate i > 10 13

14 f i m l a g o r i t m o

4 IMPLEMENTAC¸ ˜AO

O analisador est ´atico de c ´odigo foi desenvolvido em Java SE (Stan- dard Editon) utilizando a vers ˜ao 1.8.0 171 JDK (Java Development Kit) que ´e mantido pela ORACLE. Maiores informac¸ ˜oes podem ser encontradas na p ´agina de apresentac¸ ˜ao (ORACLE, 2018) e na documentac¸ ˜ao da vers ˜ao 8 (ORACLE, 2017).

Para gerenciamento do projeto foi utilizada a vers ˜ao 3.5.2 do Apache Maven. Essa ferramenta gerencia o projeto, serve para fazer compilac¸ ˜ao, atuali- zar e manter depend ˆencias e tem integrac¸ ˜ao com o GitLab. ´E mantido pela Apa- che e maiores informac¸ ˜oes sobre podem ser encontradas na p ´agina de apresen- tac¸ ˜ao (APACHE, 2018).

Para versionamento e gerenciamento de fontes foi utilizado o Git utili- zando a vers ˜ao 2.6.2 que ´e mantido por Linus Torvalds e Junio Hamano. Maiores informac¸ ˜oes podem ser encontradas na p ´agina de apresentac¸ ˜ao (TORVALDS, 2018).

Foi criado um projeto novo contendo somente o analisador est ´atico de c ´odigo para separar os projetos por responsabilidades. Desta forma o analisador est ´atico de c ´odigo pode ser incorporado em outro portal de algoritmos e tamb ´em fica facilitada a evoluc¸ ˜ao.

Durante o desenvolvimento deste trabalho, buscou-se implementar o analisador de forma que a evoluc¸ ˜ao do mesmo seja garantida por testes unit ´arios. Testes unit ´arios foram desenvolvidos somente para classes com grande critici- dade no analisador. Estas classes foram identificadas ao longo do desenvolvi- mento, pois necessitavam incremento de funcionalidades e precisavam manter caracter´ısticas antes desenvolvidas, ent ˜ao foram criados testes unit ´arios para cada comportamento que a classe necessitava manter. Desta forma a evoluc¸ ˜ao do analisador foi produtiva e ao longo do desenvolvimento foram poucos momen-

tos que se identificou falhas das classes com testes unit ´arios.

Todas as an ´alises s ˜ao intra procedural, ou seja, cada func¸ ˜ao, procedi- mento e c ´odigo principal s ˜ao processados separadamente.

O projeto ´e separado em 5 pacotes principais, cada um cont ´em o nome que busca representar sua func¸ ˜ao na arquitetura. O pacoteTAC (br.com.staticc.co de.analysis.tac), respons ´avel pela convers ˜ao para c ´odigo de tr ˆes enderec¸os, Control Flow Graph (br.com.staticc.code.analysis.control.flow.graph), respons ´a- vel por gerar o grafo de fluxo de controle,Live Variable (br.com.staticc.code.ana lysis.live.variable), respons ´avel pela an ´alise de vida de vari ´aveis,Reaching Defi- nitions (br.com.staticc.code.analysis.live.reaching.definitions), respons ´avel pela an ´alise de definic¸ ˜oes incidentes eInterval Values (br.com.staticc.code.analysis. interval.values), respons ´avel pela an ´alise de intervalo de valores. A Figura 22 apresenta o diagrama UML de pacotes que comp ˜oem o analisador, indicando tamb ´em a relac¸ ˜ao de utilizac¸ ˜ao entre eles.

Figura 22 — Pacotes principais

Fonte: Pr ´oprio autor

As pr ´oximas sec¸ ˜oes descrevem e ilustram cada um destes pacotes mos- trando de forma sucinta as classes que os comp ˜oem. O c ´odigo completo pode ser encontrado no CD em anexo a este trabalho.

No documento Análise estática de código para o portal de algoritmos da UCS (páginas 55-59)