<?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>Luiz on Nothing &#187; Hacking pt_BR</title>
	<atom:link href="http://blog.cpu.eti.br/category/hacking-pt_br/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.cpu.eti.br</link>
	<description></description>
	<lastBuildDate>Wed, 03 Nov 2010 13:14:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Compiladores</title>
		<link>http://blog.cpu.eti.br/2008/09/08/compiladores/</link>
		<comments>http://blog.cpu.eti.br/2008/09/08/compiladores/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 14:59:05 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>
		<category><![CDATA[compiladores]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=102</guid>
		<description><![CDATA[Compiladores é um dos assuntos da computação que não sei absolutamente nada sobre ele mas gostaria muito de aprender um pouco.
Infelizmente não vou ver nada sobre isso na faculdade, pois o curso que estou fazendo é de tecnologia e não tem muito sobre softwares de sistema no currículo.
Vou ter que aprender sozinho.
De vez em quando, [...]]]></description>
			<content:encoded><![CDATA[<p>Compiladores é um dos assuntos da computação que não sei absolutamente nada sobre ele mas gostaria <strong>muito</strong> de aprender um pouco.</p>
<p>Infelizmente não vou ver nada sobre isso na faculdade, pois o curso que estou fazendo é de tecnologia e não tem muito sobre softwares de sistema no currículo.</p>
<p>Vou ter que aprender sozinho.</p>
<p>De vez em quando, ao longo deste ano, eu faço uma pesquisa sobre os livros disponíveis. Qualquer aluno de computação sabe (ou deveria saber) que <a href="http://www.amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/0321486811/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1220884680&#038;sr=8-1">o livro do dragão</a> é <strong>a</strong> referência sobre compiladores. Eu dei uma passada rápida em alguns capítulos e gostei do livro, o único problema é que eu gostaria de algo mais prático.</p>
<p>Eu achei o <a href="http://www.amazon.com/Crafting-Compiler-C-Charles-Fischer/dp/0805321667/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1220885013&#038;sr=8-1">Crafting a Compiler with C</a>. Este parece ter uma abordagem muito mais prática. Acho que vou começar com ele, quando quiser me aprofundar na teoria compro o livro do dragão.</p>
<p>O problema agora é tempo. Só vou ter tempo de mexer com isso quando terminar a faculdade. Se tudo ocorrer bem isso deve acontecer no final do primeiro semestre de 2009.</p>
<p>Para você ter uma idéia de como essa vontade me persegue: no começo do ano estava conversando sobre isso com o Paulo (aka pcpa, se você nunca ouviu falar nele basta dizer que ele é o autor do driver vesa do X, e já escreveu um interpretador <a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)">LISP</a>, é um dos hackers que conheço pessoalmente que mais admiro) ele disse que também tinha interesse no assunto e que estava escrevendo uma máquina virtual. A descrição da máquina dele me empolgou.</p>
<p>Nessa época eu estava lendo o <a href="http://www.amazon.com/Inside-Machine-Introduction-Microprocessors-Architecture/dp/1593271042/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1220885145&#038;sr=8-1">Inside the Machine</a> e bem no começo do livro o autor apresenta uma descrição de uma máquina extremamente simples que não tem nenhuma utilidade prática, a não ser ser discutida num livro de introdução a arquitetura de computadores.</p>
<p>Não teve jeito&#8230; Fiz o projetinho da máquina virtual e escrevi um assembler para ela &#8216;na loca&#8217; (ie, sair escrevendo código sem pensar muito e sem ter embasamento teórico sobre o assunto). O código está <a href="http://repo.or.cz/w/lcapit-junk-code.git?a=tree;f=DLW-1e;h=93785c063ac0e2e4db878f5710a07f6f52b01bc6;hb=HEAD">aqui</a>. Embora o assembler tenha funcionado eu nunca cheguei a implementar a maquininha virtual&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2008/09/08/compiladores/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Hacks do final de semana</title>
		<link>http://blog.cpu.eti.br/2008/07/01/hacks-do-final-de-semana/</link>
		<comments>http://blog.cpu.eti.br/2008/07/01/hacks-do-final-de-semana/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 02:05:39 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=100</guid>
		<description><![CDATA[Meu filho tem uma certa mania de jogar celulares em baldes com água ou algo que se pareça com isso. Primeiro foi o celular do meu pai (relativamente caro) que ele jogou em um balde com cândida no ano passado. No último sábado ele jogou o nosso celular na privada.
Eu dei o celular como morto [...]]]></description>
			<content:encoded><![CDATA[<p>Meu filho tem uma certa mania de jogar celulares em baldes com água ou algo que se pareça com isso. Primeiro foi o celular do meu pai (relativamente caro) que ele jogou em um balde com cândida no ano passado. No último sábado ele jogou o nosso celular na privada.</p>
<p>Eu dei o celular como morto logo de cara (não gosto de celulares). Alguém sugeriu usar um secador, mas não temos. Minha esposa abriu o celular todo, secou e limpou tudo o que foi possível. No domingo de manhã ela montou, ligou e o bicho renasceu. Um a zero para o celular.</p>
<p>O outro acontecimento interessante foi que o <a href="http://raisama.net/diary/">boto</a> emprestou a máquina dele para usarmos no final de semana. Domingo à noite, minha esposa foi tentar apagar algumas fotos para abrir espaço e acabou apagando tudo. Ok, eu havia copiado as fotos de sábado, mas todos ficaram tristes achando que as fotos de domingo tinham ido para o céu dos bits.</p>
<p>Tentei googlar por algum programa para recuperar as fotos mas só encontrei para Windows (não tenho Windows em casa, e no wine não funcionou). Cansei de procurar. Pensei em escrever um programa para abrir o dispositivo do cartão de memória e dumpar tudo o que se parecesse com uma foto. Funcionou para grande parte das fotos (código <a href="http://repo.or.cz/w/lcapit-junk-code.git?a=blob;f=jpeg-recovery.c;h=d131df2875f667fa8d704f07e177edc37e116597;hb=HEAD">aqui</a>). Falei sobre isso com o pessoal do trabalho e o <a href="http://caio.ueberalles.net/log/">Caio</a> sugeriu o <a href="http://www.cgsecurity.org/wiki/PhotoRec">Photorec</a>, este recuperou 100%.</p>
<p>Pelo menos o programinha serviu para minha esposa ir dormir feliz, bom pra mim. :P</p>
<p><img src="http://www.cpu.eti.br/fotos/gabriel/gabriel-caipira-2008.jpg" alt="Oia eu sô" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2008/07/01/hacks-do-final-de-semana/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dicas para seu projeto de software ser uma falha exemplar</title>
		<link>http://blog.cpu.eti.br/2008/03/09/dicas-para-seu-projeto-de-software-ser-uma-falha-exemplar/</link>
		<comments>http://blog.cpu.eti.br/2008/03/09/dicas-para-seu-projeto-de-software-ser-uma-falha-exemplar/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 16:25:14 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=89</guid>
		<description><![CDATA[1. Depois de levantar os requerimentos, escreva vários documentos com dezenas de páginas cada um. Bons exemplos são: diagramas,  glossários, requerimentos, relatórios, design, etc&#8230;
2. Baseando-se nesses documentos, faça um design detalhado da arquitetura do software
3. Obrigue os programadores a seguirem a arquitetura e todos os outros documentos quando forem implementar o software, não permita [...]]]></description>
			<content:encoded><![CDATA[<p>1. Depois de levantar os requerimentos, escreva vários documentos com dezenas de páginas cada um. Bons exemplos são: diagramas,  glossários, requerimentos, relatórios, design, etc&#8230;<br />
2. Baseando-se nesses documentos, faça um design detalhado da arquitetura do software<br />
3. Obrigue os programadores a seguirem a arquitetura e todos os outros documentos quando forem implementar o software, não permita modificações nos documentos (muito menos na arquitetura)<br />
4. Não incentive unit testing, não use controle de versão nem bug tracking<br />
5. Tente extrair o máximo de produtividade dos programadores: evite distrações como ficar conversando com colegas de trabalho ou sites de internet não relacionados (filtre tudo o que puder, inclusive email externo e IRC)<br />
6. Testes e integração serão feitos somente na fase final do projeto, quando todos os componentes estiverem praticamente prontos<br />
7. Não permita interferências do cliente, ele não sabe o que quer</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2008/03/09/dicas-para-seu-projeto-de-software-ser-uma-falha-exemplar/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Repita comigo&#8230;</title>
		<link>http://blog.cpu.eti.br/2008/02/04/repita-comigo/</link>
		<comments>http://blog.cpu.eti.br/2008/02/04/repita-comigo/#comments</comments>
		<pubDate>Mon, 04 Feb 2008 21:23:49 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>
		<category><![CDATA[engenharia de software]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=83</guid>
		<description><![CDATA[&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;
Toda vez que pego um programa para ler ou começo um novo projeto&#8230;
&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. [...]]]></description>
			<content:encoded><![CDATA[<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Toda vez que pego um programa para ler ou começo um novo projeto&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Tenho que lembrar que a parte fundamental&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>De qualquer programa de computador são&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Os dados que esse programa manipula. Isso significa que se eu&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Focar nas estruturas de dados ao invés de&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Sair escrevendo ou lendo código&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Provavelmente terei mais sucesso, isto é&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Entenderei os programas de outras pessoas mais rapidamente e&#8230;</p>
<p><i>&#8220;Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won&#8217;t usually need your flowchart; it&#8217;ll be obvious.&#8221;</i></p>
<p>Meus programas terão mais qualidade!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2008/02/04/repita-comigo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>printf() e scanf()</title>
		<link>http://blog.cpu.eti.br/2007/08/26/printf-e-scanf/</link>
		<comments>http://blog.cpu.eti.br/2007/08/26/printf-e-scanf/#comments</comments>
		<pubDate>Sun, 26 Aug 2007 17:27:21 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=69</guid>
		<description><![CDATA[Esta semana aprendi dois truquezinhos (se é que posso chamar assim) que me deixaram um pouco impressionado por nunca ter ouvido falar neles, embora estejam devidamente documentado nas páginas de manual de suas respectivas funções (printf() e scanf()).
O truque de scanf() permite ler strings com espaços. Por exemplo, se você fizer:
scanf("%s", line);
E digitar &#8220;foo bar&#8221;, [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana aprendi dois truquezinhos (se é que posso chamar assim) que me deixaram um pouco impressionado por nunca ter ouvido falar neles, embora estejam devidamente documentado nas páginas de manual de suas respectivas funções (<a href="http://linux.die.net/man/3/printf">printf()</a> e <a href="http://linux.die.net/man/3/scanf">scanf()</a>).</p>
<p>O truque de scanf() permite ler strings com espaços. Por exemplo, se você fizer:</p>
<p><code>scanf("%s", line);</code></p>
<p>E digitar &#8220;foo bar&#8221;, scanf() vai ler apenas &#8220;foo&#8221; em line. Mas se você fizer:</p>
<p><code>scanf("%[^\n]s", line);</code></p>
<p>Aí sim, scanf() vai ler &#8220;foo bar&#8221; em line. Não sei se tem jeito mais fácil e estou com preguiça de ler toda documentação (ah, não esqueça que a maneira recomendada de ler strings é com <a href="http://linux.die.net/man/3/fgets">fgets()</a>).</p>
<p>O que me impressionou mais, no entanto, foi o truque de printf(): você pode passar a quantidade de caracteres a ser impresso por paramêtro, por exemplo:</p>
<p><code>printf("%.*s\n", 2, line);</code></p>
<p>Vai imprimir apenas os dois primeiros caracters de line, pois %.*s significa &#8220;pegue a quantidade de caracteres a ser impresso no próximo parâmetro&#8221;, que neste exemplo é 2.</p>
<p>Resta confirmar se tudo isso faz parte do padrão, mas pelo que diz a documentação creio que faz.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2007/08/26/printf-e-scanf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bubble sort</title>
		<link>http://blog.cpu.eti.br/2007/07/30/bubble-sort/</link>
		<comments>http://blog.cpu.eti.br/2007/07/30/bubble-sort/#comments</comments>
		<pubDate>Tue, 31 Jul 2007 01:09:04 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=67</guid>
		<description><![CDATA[Você&#8230;
aprendeu bubble sort na faculdade?
acha bubble sort bonitinho?
acha bubble sort útil?
usa bubble sort?!
Se você respondeu sim pelo menos uma vez, recomendo fortemente ler este artigo.
]]></description>
			<content:encoded><![CDATA[<p>Você&#8230;</p>
<li>aprendeu <a href="http://en.wikipedia.org/wiki/Bubble_sort">bubble sort</a> na faculdade?
<li>acha bubble sort bonitinho?</li>
<li>acha bubble sort útil?</li>
<li>usa bubble sort?!</li>
<p>Se você respondeu sim pelo menos uma vez, recomendo <em>fortemente</em> ler <a href="http://www.cs.duke.edu/~ola/papers/bubble.pdf">este artigo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2007/07/30/bubble-sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Curso de SO do MIT</title>
		<link>http://blog.cpu.eti.br/2007/07/24/curso-de-so-do-mit/</link>
		<comments>http://blog.cpu.eti.br/2007/07/24/curso-de-so-do-mit/#comments</comments>
		<pubDate>Tue, 24 Jul 2007 21:06:14 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=65</guid>
		<description><![CDATA[O MIT disponibiliza material de muitos de seus cursos na web, inteiramente grátis.
Um dos materias que está disponível é do curso de engenharia de sistemas operacionais, do departamento de engenharia elétrica e ciência da computação.
A proposta é escrever um sistema operacional pequeno, baseado em exokernel, durante o semestre. O curso é dividido em seis laboratórios [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://web.mit.edu/">MIT</a> disponibiliza material de muitos de seus cursos <a href="http://ocw.mit.edu/index.html">na web</a>, inteiramente <a href="http://c2.com/cgi/wiki?FreeBeer">grátis</a>.</p>
<p>Um dos materias que está disponível é do <a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-828Fall-2006/CourseHome/index.htm">curso de engenharia de sistemas operacionais</a>, do departamento de engenharia elétrica e ciência da computação.</p>
<p>A <a href="http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-828Fall-2006/Syllabus/index.htm">proposta</a> é escrever um sistema operacional pequeno, baseado em <a href="http://en.wikipedia.org/wiki/Exokernel">exokernel</a>, durante o semestre. O curso é dividido em seis laboratórios e aulas teóricas.</p>
<p>As aulas teóricas não são muito úteis para quem faz o curso a distância, o filé são as aulas de laboratório.</p>
<p>Funciona assim: cada aula de laboratório é composta de um arquivo pdf e código. O arquivo pdf tem um pouco de teoria, explica o que o código faz e tem exercícios. Em sua maioria os exercícios são de modificação e implementação das partes do sistema que estão faltando. As aulas são incrementais.</p>
<p>E não é só isso!</p>
<p>Para saber se as soluções dos exercícios estão corretas, cada laboratório disponibiliza um script que verifica a implementação. Além disso alguns laboratórios também tem o que poderíamos chamar de <a href="http://en.wikipedia.org/wiki/Test_suite">suite de testes</a> (em modo kernel mesmo).</p>
<p>É um curso prático, que foca no que é importante. Não há como terminar o curso sem aprender o que foi proposto (eu agarântio!).</p>
<p>Fiz um pouco mais da metade &#8211; diga-se de passagem que a primeira metade é a mais importante e mais difícil &#8211; minha versão do SO está aqui:</p>
<p><a href="http://repo.or.cz/w/mit-so-course.git">http://repo.or.cz/w/mit-so-course.git</a></p>
<p>Para clonar faça:</p>
<p>$ git clone git://repo.or.cz/mit-so-course.git</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2007/07/24/curso-de-so-do-mit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>fsfuzz e mangle</title>
		<link>http://blog.cpu.eti.br/2007/01/28/fsfuzz-e-mangle/</link>
		<comments>http://blog.cpu.eti.br/2007/01/28/fsfuzz-e-mangle/#comments</comments>
		<pubDate>Sun, 28 Jan 2007 20:50:16 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=52</guid>
		<description><![CDATA[Quer ajudar a achar bugs no kernel? Especialmente em sistema de arquivos?
Uma maneira simples é usar o fsfuzz.
Basicamente, é só construir o binário e executar &#8216;mkdir /media &#038;&#038; ./fsfuzz&#8217; como root. Mas você vai ter que conhecer um pouco sobre kernel para saber fazer o bug report corretamente e ATENÇÃO: você pode peder seus dados.
O [...]]]></description>
			<content:encoded><![CDATA[<p>Quer ajudar a achar bugs no kernel? Especialmente em<em> </em>sistema de arquivos?</p>
<p>Uma maneira simples é usar o <a href="http://people.redhat.com/sgrubb/files/fsfuzzer-0.6.tar.gz">fsfuzz</a>.</p>
<p>Basicamente, é só construir o binário e executar &#8216;mkdir /media &#038;&#038; ./fsfuzz&#8217; como root. Mas você vai ter que conhecer um pouco sobre kernel para saber fazer o bug report corretamente e <strong>ATENÇÃO:</strong> <strong>você pode peder seus dados</strong>.</p>
<p>O fsfuzz é composto de um programa em C e três scripts em bash, ele funciona assim:</p>
<ol>
<li>Um sistema de arquivos é criado em um arquivo</li>
<li>Esse arquivo é aberto e bytes randômicos são escritos de maneira aleatória</li>
<li>O arquivo (agora contendo um sistema de arquivos provavelmente corrompido) é montado no <a href="http://en.wikipedia.org/wiki/Loop_device">dispositivo de loop</a> e alguns testes simples, como criação e remoção de arquivos, são executados</li>
</ol>
<p>No pior caso o sistema de arquivos sendo testado <a href="http://en.wikipedia.org/wiki/Linux_kernel_oops">vai explodir</a>, mas outros erros não esperados são possíveis. Alguns bugs já descobertos podem ser encontrados <a href="http://kernelfun.blogspot.com/search/label/fsfuzzer">aqui</a> e <a href="http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.19.2">aqui</a>.</p>
<p>Se o script principal (fsfuzz) for executado sem argumentos, os testes rodarão para os sistemas de arquivos ext3, ext2, cramfs e swap (este último tem testes diferentes, claro) se as ferramentas para manipulação dos mesmos estiverem disponíveis em seu sistema. Mas você também pode especificar um sistema de arquivos na linha de comando. Leia o README para mais informações.</p>
<p>O principal componente do fsfuzz é um programinha em C, chamado mangle. Ele é o responsável por executar o passo número 2 na explicação acima e faz exatamente isto: abre um arquivo e espalha bytes randômicos nele.</p>
<p>Por padrão os bytes randômicos são escritos nos primeiros 1K bytes do arquivo (onde costumam residir cabeçalhos em arquivos binários) mas isso é configurável através de opções de linha de comando. Você pode até especificar um offset, que determina onde o mangle deve começar a escrever.</p>
<p>O mangle também pode ser usado em outras áreas do kernel. Por exemplo, você pode rodá-lo em um binário e depois tentar executá-lo (isso irá testar o código que carrega o binário).</p>
<p>E não é só isso!</p>
<p>Como você provavelmente já percebeu, o mangle pode ser usado em qualquer programa que aceite um arquivo como entrada. O mplayer por exemplo, rode o mangle em um arquivo mp3 ou avi e tente rodá-lo. Que tal o arquivo de configuração do Apache? E o interpretador Python?</p>
<p align="left">As possibilidades são muitas, e para programas em user-level o comportamento esperado é que eles identifiquem o problema e tomem alguma ação, como imprimir uma mensagem de erro e sair. Se o programa travar, ganhar uma <a href="http://en.wikipedia.org/wiki/Segmentation_fault">falha de segmentação</a> ou qualquer outro comportamento bizarro, guarde o arquivo que você usou para reproduzir o problema e reporte o bug para o mantenedor do programa.</p>
<p>Note que todos esses testes não estão restritos ao Linux. O mangle deve compilar em qualquer Unix (se houver problemas com mmap() é fácil escrever uma versão com lseek() e write()) e você também pode rodar o mangle em arquivos do Windows no Linux e depois tentar usá-los no Windows (eg, arquivos .doc e binários).</p>
<p>Muito bom, não? :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2007/01/28/fsfuzz-e-mangle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pegadinha da realloc()</title>
		<link>http://blog.cpu.eti.br/2006/12/26/pegadinha-da-realloc/</link>
		<comments>http://blog.cpu.eti.br/2006/12/26/pegadinha-da-realloc/#comments</comments>
		<pubDate>Tue, 26 Dec 2006 16:04:25 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=41</guid>
		<description><![CDATA[A função da biblioteca C padrão realloc() é normalmente utilizada para aumentar o tamanho de uma área de memória previamente alocada. Seu protótipo é:
void *realloc(void *ptr, size_t size);
Se a nova alocação é feita com sucesso, realloc() retorna um ponteiro para a nova área de memória (a qual contêm os mesmos dados da área anterior). Caso [...]]]></description>
			<content:encoded><![CDATA[<p>A função da <a href="http://en.wikipedia.org/wiki/Libc">biblioteca C padrão</a> <a href="http://en.wikipedia.org/wiki/Realloc#realloc">realloc()</a> é normalmente utilizada para aumentar o tamanho de uma área de memória previamente alocada. Seu protótipo é:</p>
<pre>void *realloc(void *ptr, size_t size);</pre>
<p>Se a nova alocação é feita com sucesso, realloc() retorna um ponteiro para a nova área de memória (a qual contêm os mesmos dados da área anterior). Caso contrário a chamada retorna NULL, e a área anterior<strong> não é liberada</strong>.</p>
<p>A pegadinha acontece quando se acredita que realloc() nunca irá  falhar, ou quando o programador simplesmente desconhece que em caso de falha a área anterior ainda é válida. Exemplo:</p>
<pre>char *buf;
size_t size;

...

buf = malloc(size);

...

buf = realloc(buf, size*2);</pre>
<p>Se realloc() falhar, &#8216;buf&#8217; recebe NULL e você perde o ponteiro para a área anterior, a qual foi alocada com malloc() e ainda <strong>é</strong> válida. Ou seja, o resultado é um <a href="http://en.wikipedia.org/wiki/Memory_leak">memory  leak</a> de &#8217;size&#8217; bytes. O código correto seria:</p>
<pre>char *buf, *p;
size_t size;

...

buf = malloc(size);

...

p = realloc(buf, size*2);
if (!p) {
/* error handling */
...
free(buf);
return;
}
buf = p;</pre>
<p>Há programadores que não se importam em consertar bugs como esse, eles argumentam que as funções da família alloc() raramente falham.</p>
<p>Não caia nesse conto, pois você não pode prever em quais máquinas e sob quais condições seu programa vai rodar.</p>
<p>Programas robustos costumam reagir bem a situações adversas, ou ao  menos falham quando se espera que isso ocorra. Os mal escritos falham aleatoriamente em situações não esperadas, e apresetam bugs difíceis de reproduzir.</p>
<p>Sempre escreva código correto e robusto, você e seus usuários só tem a ganhar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2006/12/26/pegadinha-da-realloc/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>10 dicas para se tornar um mantenedor ruim</title>
		<link>http://blog.cpu.eti.br/2006/12/18/10-dicas-para-se-tornar-um-mantenedor-ruim/</link>
		<comments>http://blog.cpu.eti.br/2006/12/18/10-dicas-para-se-tornar-um-mantenedor-ruim/#comments</comments>
		<pubDate>Tue, 19 Dec 2006 00:58:49 +0000</pubDate>
		<dc:creator>Luiz Capitulino</dc:creator>
				<category><![CDATA[Hacking pt_BR]]></category>

		<guid isPermaLink="false">http://blog.cpu.eti.br/?p=37</guid>
		<description><![CDATA[1. Não use controle de versão
2. Não faça releases frequêntes
3. Quando fizer uma release, não faça changelog
4. Quando fizer uma release, não envie e-mails de anúncio
5. Crie uma lista de discussão moderada para desenvolvedores (sendo que apenas você pode aprovar mensagens)
6. Não use nenhum sistema de bugtracking
7. Ignore bug reports
8. Demore para dar qualquer tipo [...]]]></description>
			<content:encoded><![CDATA[<p>1. Não use <a href="http://en.wikipedia.org/wiki/Version_control">controle de versão</a></p>
<p>2. Não faça <a href="http://catb.org/~esr/writings/cathedral-bazaar/cathedral-bazaar/ar01s04.html">releases frequêntes</a></p>
<p>3. Quando fizer uma release, não faça changelog</p>
<p>4. Quando fizer uma release, não envie e-mails de anúncio</p>
<p>5. Crie uma lista de discussão moderada para desenvolvedores (sendo que apenas você pode aprovar mensagens)</p>
<p>6. Não use nenhum sistema de <a href="http://en.wikipedia.org/wiki/Bugtracker">bugtracking</a></p>
<p>7. Ignore <a href="http://en.wikipedia.org/wiki/Bug_report">bug reports</a></p>
<p>8. Demore para dar qualquer tipo de feedback, principalmente aprovação das mensagens da lista moderada e patches submetidos</p>
<p>9. Perca alguns patches e esqueça quem os enviou</p>
<p>10. Desapareça de vez em quando, e desconsidere tudo o que aconteceu quando você estava fora</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.cpu.eti.br/2006/12/18/10-dicas-para-se-tornar-um-mantenedor-ruim/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

