Beruflich Dokumente
Kultur Dokumente
RESUMO – Este relatório foi criado tendo em vista as Técnicas de Detecção de Bugs utilizadas
no acto da Análise de Sistemas. Assim sendo, este relatório começa por dar uma definição
sobre o que é a Análise de Sistemas e sobre o que é um Bug. De seguida apresenta a
diferença existente entre bug e debug e os principais tipos de bugs existentes. Para finalizar, é
demonstrado o ciclo de vida de um bug e são dados alguns exemplos de software de detecção
de bugs existente.
————————————————————
1. INTRODUÇÃO
exemplo, o custo e o desempenho deste). Uma das fases da análise de sistemas consiste na
verificação de erros (bugs), a qual é tratada neste mesmo trabalho [1] e [2].
3. DEFINIÇÃO DE BUG
Por definição, um bug é a ocorrência de um erro de fábrica num software ou hardware. O termo
provém do ano de 1945, quando foi encontrada uma mariposa num circuito do computador
MARK II, desenvolvido na universidade de Harvard, e que provocava um erro constante no
funcionamento deste mesmo computador. Desde então, este termo é utilizado por engenheiros
para classificar pequenas falhas de máquinas de hardware e software. Pode ser também
definido como falha lógica de um programa, podendo causar discrepâncias nos resultados
esperados, ou impossibilidade de realização de uma funcionalidade de um programa [3] e [4].
Fig. 1 – Demostração de um erro no código que mais tarde dá origem a um Bug de Software
4. BUG E DEBUG
As palavras bug e debug começaram então a fazer parte do dialecto dos programadores para
designar respectivamente a ocorrência de falhas e o processo de depuração dessas falhas [3]
e [4].
5. TIPOS DE BUGS
Os bugs de software podem ter origem nas fases de requisitos de análise e desenho ou de
construção do software. São exemplos de bugs da fase de requisitos:
Mau entendimento das necessidades dos utilizadores;
Descrição funcional ambígua ou incompleta;
Interface gráfica pobre.
A fase de análise e desenho pode originar bugs associados a:
Arquitectura do software;
Modelo de dados;
Interfaces do sistema.
Na fase de construção podem surgir bugs devido:
-2-
Cristiano Santos, André Gonçalves: Análise Sistemas (Técnicas de Detecção de Bugs)
A fase de testes é crucial para a detecção de bugs recorrendo a um software. Esta fase é
muito importante, uma vez que se esta for mal implementada não contribui para detectar os
bugs. É importante manter um repositório de defeitos de forma a se obter indicadores de
origem dos defeitos e desta forma melhorar continuamente o desenvolvimento de software [1].
Dependendo da gravidade do bug, este pode causar diferentes tipos de prejuízo para as
empresas. Por exemplo, a Intel detectou um bug em operações com vírgula flutuante, no seu
Pentium, antes de este ser lançado em 1994, pensando que não seria grave, iniciou a sua
venda sem que o bug fosse corrigido. Teve depois de arcar com uma despesa de 400 milhões
de dólares para repor os chips com defeito [3].
Os métodos de detecção de bugs abaixo descritos existem desde 1999 pelo que é possível
que recentemente existam outros métodos um pouco mais avançados… Mesmo assim, estes
métodos ainda são muito utilizados hoje em dia [5].
Como o próprio nome indica, este método cria, de uma forma dinâmica, uma sequência de
instruções que formam um programa imediatamente antes da sua execução (em vez de
-3-
Cristiano Santos, André Gonçalves: Análise Sistemas (Técnicas de Detecção de Bugs)
começar este mesmo programa a partir do armazenado em disco). Assim sendo, torna-se
muito mais complicada a introdução de código forasteiro (código inserido por terceiros aquando
da execução do mesmo). Nos casos em que são geradas diversas sequências de instruções
(que sejam equivalentes do ponto de vista do algoritmo) a partir de um único algoritmo
fornecido, a probabilidade de existir distorção no programa devido a influências externas, pode
ser reduzida para um qualquer valor que tenha sido pré atribuído. Para que esta probabilidade
possa desaparecer definitivamente é necessário que, durante a execução do programa, o
sistema execute um programa de correcção automática após um determinado número de
ciclos. Algumas das operações realizadas por este método são implementadas via hardware,
uma vez que a geração de código pode ser demorada (dependendo do número de instruções a
serem geradas).
O funcionamento deste método (tal como o funcionamento do método de encriptação de
todos os programas e dados armazenados em disco) permite proteger os programas contra a
―infiltração‖ de bugs mas, no entanto, não permite detectar bugs que tenham sido introduzidos
durante a criação básica do programa pelo seu programador [5].
Este método fornece um sistema automático que faz a identificação do programa ou do módulo
do programa, utilizando para isso o conceito e os métodos do reconhecimento de padrões
(pattern recognition). O reconhecimento de padrões consiste em colocar dados de entrada nas
classes (categorias especificadas por um número de propriedades que é igual para todos os
elementos pertencentes a esta mesma categoria) responsáveis por extrair os atributos ou
propriedades essenciais que caracterizam esses mesmos dados, existentes no meio dos vários
detalhes ―insignificantes‖. A subdivisão dos elementos em classes é feita de acordo com os
seguintes princípios:
1. Enumeração dos membros da classe (uma vez que uma classe é caracterizada pela
lista dos seus membros);
2. Uniformização das propriedades (uma vez que uma classe é caracterizada por ter
algumas propriedades comuns em todos os seus membros);
3. Agrupamento (uma vez que as imagens de algumas classes são representadas por
vectores, cujos componentes são números reais);
Os softwares de protecção contra bugs baseados neste método nem sempre detectam
bugs existentes num ambiente de software. O principal motivo para que isto ocorra é a
impossibilidade de determinar os atributos que caracterizam inequivocamente uma classe à
qual pertence um programa [5].
-4-
Cristiano Santos, André Gonçalves: Análise Sistemas (Técnicas de Detecção de Bugs)
Este método é utilizado para analisar o software, em termos de segurança, no que diz respeito
à existência de meios de destruição de programas (DPM – Destructive Program Means) num
determinado sistema. Alguns exemplos de DPM’s são os vírus, os cavalos de Tróia, etc. A
forma de análise deste método encontra-se dividida em 3 fases:
1. Análise Lexical.
2. Análise Sintáctica.
3. Interpretação Semântica.
A primeira fase, denominada de Análise Lexical, é onde é feita uma verificação estática
num programa relativa à presença de pedaços de código de DPM’s conhecidos e de outros
pedaços de código suspeitos. De seguida vem a Análise Sintáctica responsável por desmontar
o código de um programa de forma estática e retraduzi-lo num conjunto de construções
algorítmicas, sendo depois feita uma comparação entre estas construções e as construções de
DPM’s conhecidos (existentes numa espécie de Base de Dados denominada de Base de
Conhecimento) e uma identificação entre estas construções e as construções estereotipadas
que são peculiares aos DPM’s. Finalmente, a terceira e última fase é a fase de Interpretação
Semântica, responsável por iniciar os programas num ambiente virtual para obter os seus
códigos actuais após os processos de auto-encriptação e de auto-extracção. Após o rastreio de
um determinado programa no ambiente virtual, deve ser obtido um protocolo de desafio-
resposta relativo ao programa rastreado e ao seu ambiente operacional.
Uma vantagem deste método é a utilização de uma Base de Conhecimento uma vez que
estas Bases de Conhecimento são muito utilizadas noutros meios de detecção de DPM’s. O
volume de dados destas Bases de Conhecimento é muito importante, uma vez que este é o
principal indicador da qualidade destes mesmos meios de detecção de DPM’s.
A desvantagem deste método (e de qualquer outro meio de detecção de DPM’s baseado
no uso de uma Base de Conhecimento) é a impossibilidade de detecção de DPM’s que não
estejam descritas na sua Base de Conhecimento. Além disso, a desmontagem e o rastreio de
um programa podem revelar-se desnecessários se um bug utilizar métodos especiais de
protecção a partir desta mesma desmontagem e deste mesmo rastreio e, existe uma forte
possibilidade de que nem todos os ramos de um programa sejam rastreados [5].
A base deste método é o facto de que um sistema computacional só está bem protegido se
estiver isolado. Assim sendo, antes da instalação de um sistema de protecção, é verificada a
existência de bugs nos seguintes elementos:
1. A BIOS (Basic Input/Output System);
-5-
Cristiano Santos, André Gonçalves: Análise Sistemas (Técnicas de Detecção de Bugs)
2. O Sistema Operativo;
3. O Software instalado.
Fazer a verificação de bugs (debug) em software muito grande pode tornar-se uma tarefa
complicada. Por isso foram criadas várias ferramentas para que este processo seja mais
rápido, cómodo e seguro. Por exemplo o software Goanna – verifica bugs em programas
escritos em C/C++.
-6-
Cristiano Santos, André Gonçalves: Análise Sistemas (Técnicas de Detecção de Bugs)
A maioria dos softwares de detecção de erros requere que sejam reproduzidos esses
mesmos erros durante a execução do software o que pode fazer com que este processo se
torne ainda mais lento. Por isso, uma equipa de investigadores criou softwares que examinam
directamente o código fonte do programa, detectando os erros. Por exemplo, muitas vezes os
programas são escritos com pedaços de código copiado de outros programas já desenvolvidos,
fazendo com que este fique já ―infectado‖. Para corrigir este problema, estes investigadores
criaram um software chamado CP-Miner que utiliza técnicas para encontrar o código copiado,
examinando-o e corrigindo as falhas. Este software é muito rápido nas verificações que faz,
conseguindo verificar entre 3-4 milhões de linhas de código em menos de 30minutos [7] e [8].
11. CONCLUSÃO
A realização deste relatório permitiu-nos saber os principais métodos de detecção de bugs que
são utilizados pelos softwares de detecção de bugs. Devido à falta de informação existente na
internet relativamente a este tema, os métodos anteriormente apresentados podem-se
encontrar já desactualizados, podendo mesmo existir novos métodos que derivem destes e que
forneçam melhores condições no acto da detecção de bugs.
Em termos de conclusão, podemos dizer que existem vários tipos de bugs, bem como
diversas formas de estes aparecem num programa mas, no entanto, também existem softwares
responsáveis por fazer a detecção da maior parte destes bugs, sendo estes softwares
-7-
Cristiano Santos, André Gonçalves: Análise Sistemas (Técnicas de Detecção de Bugs)
12. REFERÊNCIAS
[1] The Free Dictionary, Ano não definido, System Analysis Definition
Disponível em http://encyclopedia2.thefreedictionary.com/Systems+Analysis+Definition
Consulta em 09-12-2010
[2] BusinessDictionary, Ano não definido, System analysis (SA)
Disponível em http://www.businessdictionary.com/definition/systems-analysis-SA.html
Consulta em 09-12-2010
[3] Galeote, 2010, Qual a origem de bugs de software?
Disponível em http://blog.prasabermais.com/2010/05/18/qual-a-origem-dos-bugs-de-software/
Consulta em 07-12-2010
[4] Wikipédia, Ano não definido, Defeitos de software (actualizado em 9-12-2010)
Disponível em http://pt.wikipedia.org/wiki/Defeito_de_software
Consulta em 07-12-2010
[5] I. Shevchenkoª, 1999, Cybernetics and System Analysis, vol 35.
Consulta em 07-12-2010
[6] CentOs, 2009, Kernel Panic during first boot
Disponível em: https://www.centos.org/modules/newbb/viewtopic.php?topic_id=20410
Consulta em 12-12-2010
[7] NICTA, Ano não definido, GOANNA (software bug detection)
Disponível em http://www.nicta.com.au/research/projects/goanna
Consulta em 12-12-2010
[8] HPC, 2006, Reserarchers develop inteligente Bug detection Software
Disponível em http://www.hpcwire.com/offthewire/17886009.html
Consulta em 12-12-2010
-8-