<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog do Sergio Prado &#187; pc-lint</title>
	<atom:link href="http://sergioprado.org/tag/pc-lint/feed/" rel="self" type="application/rss+xml" />
	<link>http://sergioprado.org</link>
	<description>Sistemas embarcados, Linux embarcado, RTOS e segurança</description>
	<lastBuildDate>Wed, 16 May 2012 00:49:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Análise estática de código</title>
		<link>http://sergioprado.org/analise-estatica-codigo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=analise-estatica-codigo</link>
		<comments>http://sergioprado.org/analise-estatica-codigo/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 01:48:25 +0000</pubDate>
		<dc:creator>Sergio Prado</dc:creator>
				<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[Linguagem C]]></category>
		<category><![CDATA[análise estática de código]]></category>
		<category><![CDATA[compilador]]></category>
		<category><![CDATA[pc-lint]]></category>

		<guid isPermaLink="false">http://www.embarcados.com.br/blog/?p=74</guid>
		<description><![CDATA[<p>Este artigo fala sobre a importância da análise estática de código, e exemplifica através da utilização de ferramentas disponíveis no mercado.</p><p><p>Sergio Prado atua com desenvolvimento de software para sistemas embarcados há mais de 15 anos. É sócio-fundador da Embed­ded Lab­works, uma empresa focada em te aju­dar a desen­volver soft­ware de qual­i­dade para sis­temas embar­ca­dos. Se você pre­cisa de ajuda para desen­volver seu pro­duto, ou quer saber mais sobre o que a Embed­ded Lab­works pode fazer por você, acesse <a href=”http://e-labworks.com/servicos/”> http://e-labworks.com/servicos</a>.</p>
<p>Este post foi originalmente publicado em <a href="http://sergioprado.org/analise-estatica-codigo/">Análise estática de código</a>.</p></p>
Posts relacionados:<ol>
<li><a href='http://sergioprado.org/otimizacao-de-codigo-em-linguagem-c-parte-1/' rel='bookmark' title='Otimização de código em Linguagem C — Parte 1'>Otimização de código em Linguagem C — Parte 1</a></li>
<li><a href='http://sergioprado.org/otimizacao-de-codigo-em-linguagem-c-parte-2/' rel='bookmark' title='Otimização de código em Linguagem C — Parte 2'>Otimização de código em Linguagem C — Parte 2</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Diz o ditado que, no processo de desenvolvimento de software, passamos 50% do tempo corrigindo bugs, e os outros 50% inserindo estes bugs — do inglês “In the software development process, we pass 50% debugging, and the other 50% bugging”.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">A melhor forma de perder menos tempo na correção de problemas, é não criar problemas em primeiro lugar. Mas somos humanos, e errar é humano. Portanto, vamos errar. Invariavelmente, vamos acabar inserindo alguns bugs no código. Portanto, precisamos de ferramentas que minimizem a probabilidade destes erros acontecerem. Uma destas ferramentas é o próprio compilador.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Mas na prática, não é assim que a maioria dos desenvolvedores/engenheiros enxergam esta ferramenta. Segundo estes, o objetivo do compilador é gerar o arquivo executável/binário, e ponto final. E aquele monte de warnings que o compilador “cuspiu” na tela? É facil de resolver, basta desabilitar um parâmetro do compilador. Pronto, compilou sem nenhum warning.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Mas os warnings continuam lá. O compilador bem que tentou te avisar: olhe, é bem provável que aquele ponteiro não tenha sido inicializado antes de você tentar usá-lo para referenciar alguma região de memória, ou então, preste atenção, esta variável é char (1 byte) e você esta tentando atribuir um inteiro de 2 bytes a ela.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Porque então não investir 10 minutos do seu tempo para checar as mensagens de warning do compilador? É muito menos custoso do que depois perder 4 horas para achar um problema que uma ferramenta poderia ter encontrado automaticamente para você. É extremamente importante criar o hábito de checar os warnings de compilação.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Eu sei, você pode dizer que o compilador é muito chato, e alguns warnings, ou a maioria, não são críticos ou não irão causar nenhum tipo de problema para a aplicação. O que eu posso te dizer é o seguinte: ninguém entende melhor da linguagem, sua sintaxe e semântica, do que o compilador. Portanto, não tente ser mais esperto do que ele. O objetivo então, e principalmente para quem trabalha com sistemas embarcados, é desenvolver um código extremamente portável, limpo, e o mais próximo possível do padrão ANSI. Desta forma, o compilador vai ser muito mais “bonzinho” com você.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">O que precisamos então é de uma ferramenta que possa gerar mais warnings, não menos. Uma ferramenta que analise o código e indique construções estranhas, potenciais problemas e usos não comuns da linguagem. Conforme já mencionei, alguns compiladores possuem uma boa parte desta funcionalidade, como o gcc através dos parâmetros “Wall”, “Wextra” e “pedantic” Mas existem ferramentas especificas para este trabalho. A estas ferramentas damos o nome genérico de <a href="http://en.wikipedia.org/wiki/Lint_%28software%29" target="_blank">LINT</a>.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Um artigo muito bom sobre o uso de LINT em sistemas embarcados, suas vantagens e como usá-la dentro do processo de desenvolvimento de software pode ser encontrado <a href="http://www.netrino.com/Embedded-Systems/How-To/Lint-Static-Analysis-Tool" target="_blank">aqui</a>. Nosso objetivo aqui é exemplificar através do uso de ferramentas disponíveis no mercado.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 16px;"><strong><span style="font-family: verdana,geneva,sans-serif;">Ferramentas</span></strong></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">O que as pessoas normalmente reclamam deste tipo de ferramenta é a quantidade excessiva de warnings gerados, muitos deles falso-positivos.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Pode-se chegar a mais de 10.000 warnings para um codigo de 1.000 linhas. Por isso, a ferramenta precisa ser treinada — leia-se configurada — antes de utilizada. E este processo pode levar um tempo. Um bom tempo na verdade. Mas as recompensas são grandes no final.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Existem muitas ferramentas disponíveis, tanto livres  quanto comerciais. Uma lista bem completa pode ser encontrada <a href="http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis" target="_blank">aqui</a>. Para efeitos demonstrativos vamos utilizar a ferramenta <a href="http://www.gimpel.com/" target="_blank">PC-LINT</a>.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">O PC-LINT é comercial, e uma das mais usadas ferramentas de análise estática de codigo para C/C++. Para efeito de testes, vamos utilizar um recurso <a href="http://www.gimpel-online.com/OnlineTesting.html" target="_blank">disponivel online no site da ferramenta</a>, onde é possivel testar trechos de codigo sem que seja necessário baixar e instalar a ferramenta.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Vamos testar aqui 2 trechos diferentes de código, um desenvolvido especificamente para os testes e um retirado de um pacote open-source usado em sistemas embarcados com Linux.</span></span></p>
<p style="text-align: justify;"><strong><span style="font-size: 16px;"><span style="font-family: verdana,geneva,sans-serif;">Teste 1: O jogo dos 4 erros<br />
	</span></span></strong></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">O programa abaixo tem o objetivo de varrer um vetor de números, somar apenas os números pares, e exibir o resultado. Você é bom naquele jogo dos 7 erros? Então tente encontrar aqui os 4 erros que inseri neste código.</span></span></p>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> soma<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">+</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> subtrai<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> b<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>a <span style="color: #339933;">-</span> b<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #993333;">int</span> ind<span style="color: #339933;">,</span> ret<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> buf<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000dd;">15</span><span style="color: #339933;">,</span><span style="color: #0000dd;">24</span><span style="color: #339933;">,</span><span style="color: #0000dd;">37</span><span style="color: #339933;">,</span><span style="color: #0000dd;">42</span><span style="color: #339933;">,</span><span style="color: #0000dd;">53</span><span style="color: #339933;">,</span><span style="color: #0000dd;">67</span><span style="color: #339933;">,</span><span style="color: #0000dd;">79</span><span style="color: #339933;">,</span><span style="color: #0000dd;">81</span><span style="color: #339933;">,</span><span style="color: #0000dd;">94</span><span style="color: #339933;">,</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> result<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>ind <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> ind <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">10</span><span style="color: #339933;">;</span> ind<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#91;</span>ind<span style="color: #009900;">&#93;</span> <span style="color: #339933;">%</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
            result <span style="color: #339933;">=</span> soma<span style="color: #009900;">&#40;</span>buf<span style="color: #009900;">&#91;</span>ind<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Soma = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>stdio.<span style="color: #202020;">h</span><span style="color: #339933;">&gt;</span></pre></td></tr></table></div>



<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Você encontrou os erros? Quanto tempo você levou? A ferramenta encontrou os erros de forma instantânea:</span></span></p>
<ul>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Warning 661:  Possible access of out-of-bounds pointer (1 beyond end of data) by operator ‘[‘ [Reference: file diy.c: lines 17, 18] <br />
		</span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Info 774:  Boolean within ‘if’ always evaluates to False [Reference: file diy.c: line 18] <br />
		</span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Info 734:  Loss of precision (assignment) (31 bits to 7 bits) <br />
		</span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Warning 530:  Symbol ‘result’ (line 15) not initialized </span></span></li></ul>
<p><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Seguem os erros, na ordem das mensagens acima: </span></span></p>
<ol>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Estou ultrapassando os limites do buffer “buf” ao acessá-lo no loop com a variável “ind”. Na linha 17 deveria trocar “ind&lt;=10″ por “ind&lt;10″. </span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Na comparação usada na linha 18, “acidentalmente” digitei “=” ao invés de “==”. </span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Na linha 19, estou atribuindo um inteiro a um byte. A variável “result” deveria ser, no minimo, um inteiro. </span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">A variavel “result” não foi inicializada com o valor 0 antes de iniciar a soma.</span></span></li></ol>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Além destes erros, a ferramenta ainda apontou alguns warnings de símbolos (variáveis e funções) não utilizados, e poderíamos utilizar estas dicas para deixar o código mais claro e limpo:</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Warning 529:  Symbol ‘ret’ (line 13) not subsequently referenced Info 714:  Symbol ‘subtrai(int, int)’ (line 7, file diy.c) not referenced</span></span></p>
<p style="text-align: justify;"><strong><span style="font-size: 16px;"><span style="font-family: verdana,geneva,sans-serif;">Teste 2: Ferramenta Date do Busybox<br />
	</span></span></strong></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Este teste foi feito com o pacote open-source <a href="http://busybox.net/" target="_blank">Busybox</a>. O Busybox é muito utilizado em sistemas embarcados com Linux, pois proporciona um conjunto de ferramentas comumente utilizadas em Linux, porém bem mais enxutas que suas versões originais. Os testes foram feitos com o módulo date.c.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">A ferramenta não encontrou nenhum erro crítico, mas algumas mensagens de warning foram exibidas, e uma análise e revisão do código poderia deixá-lo bem mais limpo e portável. Algumas das mensagens informadas pela ferramenta:</span></span></p>
<ul>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Loss of sign (assignment) (int to unsigned int) </span></span><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;"><br />
		</span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Type mismatch (assignment) (char * = int) <br />
		</span></span></li>
	<li><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Use of goto is deprecated Symbol ‘argc’ (line 41) not referenced Loss of precision (arg. no. 1) (unsigned int to int)</span></span></li></ul>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Que vergonha hein galera do software livre? Usando goto???</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Minha conclusão é a seguinte: se você tem 4 horas para cortar uma árvore, afie seu machado por 3 horas, e em menos de uma hora esta árvore estará cortada. Às vezes achamos que vamos perder muito tempo até aprender a usar ou configurar uma ferramenta, mas não percebemos que este investimento é valido, pois o tempo que perdemos depois para corrigir os problemas é muito maior. Sem contar que o aprendizado durante o processo vale, e muito, a pena.</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Um abraço a todos,</span></span></p>
<p style="text-align: justify;"><span style="font-size: 14px;"><span style="font-family: verdana,geneva,sans-serif;">Sergio Prado</span></span></p><div class="shr-publisher-74"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><p>Posts relacionados:</p><ol>
<li><a href='http://sergioprado.org/otimizacao-de-codigo-em-linguagem-c-parte-1/' rel='bookmark' title='Otimização de código em Linguagem C — Parte 1'>Otimização de código em Linguagem C — Parte 1</a></li>
<li><a href='http://sergioprado.org/otimizacao-de-codigo-em-linguagem-c-parte-2/' rel='bookmark' title='Otimização de código em Linguagem C — Parte 2'>Otimização de código em Linguagem C — Parte 2</a></li>
</ol><p><p>Sergio Prado atua com desenvolvimento de software para sistemas embarcados há mais de 15 anos. É sócio-fundador da Embed­ded Lab­works, uma empresa focada em te aju­dar a desen­volver soft­ware de qual­i­dade para sis­temas embar­ca­dos. Se você pre­cisa de ajuda para desen­volver seu pro­duto, ou quer saber mais sobre o que a Embed­ded Lab­works pode fazer por você, acesse <a href=”http://e-labworks.com/servicos/”> http://e-labworks.com/servicos</a>.</p>
<p>Este post foi originalmente publicado em <a href="http://sergioprado.org/analise-estatica-codigo/">Análise estática de código</a>.</p></p>]]></content:encoded>
			<wfw:commentRss>http://sergioprado.org/analise-estatica-codigo/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

