quinta-feira, 1 de maio de 2014

Erros de hoje têm as marcas? Seja ainda meu coração sangramento [logo]


SANS - Pesquisa sobre programas de segurança de aplicativos


Verity Stob Tendo em vista a situação muito-muito-aberto-furado de segurança em curso, tomei a decisão de convocar uma reunião de emergência do ERCOCC, o Comitê Reg El de programadores competentes, para analisar o que ocorreu e como devemos seguir em frente.


Não há tempo para chitter-vibração. Acalmem-se todos, e suco o projetor PowerPoint favor Eric.


Bug # 1: Ir à falha


A última vez que vi um goto na natureza era de cerca de 15 anos atrás. Foi incorporado em uma classe C + + data-hora eu tinha preguiçosamente escalfado partir de um determinado site de compartilhamento de código, em que o arquivo foi disponibilizado sob a licença WYGIWYD contraversial (que você recebe é o que você merece).


Esse uso de Goto foi bastante gratuita. Ele brilhou na fonte de fora, como os corantes brilhantes adotadas por certos insetos peçonhentos para avisar os pássaros não comê-los. E, como o mais estúpido, pombo recém-desenvolvido, eu inalei a vespa e sofreu as conseqüências. Escusado será dizer, que teria sido mais rápido e mais divertido para copiar Letts 2002 Diário do bulbo Dimmer com a mão.







Porque ninguém usa empreendedores em código real, certo? Claro, de volta ao dia, Donald Knuth - não um herói óbvio Nigel Farage-stylee de princípios reacionários - bateu para fora um papel rápida em sua defesa. Mas isso foi em 1974, quando os relógios digitais ainda eram uma idéia bastante puro, cigarros fumar era engraçado e inteligente e determinada Top of the Pops ugh apresentadores blah-di-blah.


Assim - e eu tenho certeza que você chegou aqui antes de mim - quando o tumulto Goto Falha SSL ocorreu, você poderia ter bateu na minha gob em última terça-feira com uma pena dobrada. Naturalmente eu cliquei através dos links para o arquivo C em questão: ir aqui e desça até SSLVerifySignedServerKeyExchange para ver por si mesmo, ou aqui para uma análise crescido.


Ou, para economizar tempo e excesso clickage, dê uma olhada neste reconstrução dramática. Veja se você pode detectar que a linha problemática:


OSStatus SSLVerifySignedServerKeyExchange(/*loadsa params*/)

{

/* Declare some local variables, including: */

SSLBuffer signedHashes;

/* More mucking about with local variables, eg */

signedHashes.data = 0;

/* Then the main rhythm of the function: */

if ((err = SSLImportantManInTheMiddleDefence(hashCtx, otherStuff)) != 0)

goto fail;

if ((err = SSLBitTwiddlingBogeymanBaffling(whatever)) != 0)

goto fail;

if ((err = SSLTumTittyTumTum(tum)) != 0)

goto fail;

if ((err = SSLNotForYourTinyBrainYouEarthling(params)) != 0)

goto fail;

if ((err = SSLAnotherFunctionYouDontUnderstand(hohoHo)) != 0)

goto fail;

/* ... */

/* After many more lines of the same ilk: */

if ((err = SSLYadaYadaYada(stuff)) != 0)

goto fail;

goto fail;

if ((err = SSLDoTheActualImportantCheck(stuff)) != 0)

goto fail;

fail:

SSLFreeBuffer(&signedHashes);

SSLFreeBuffer(&hashCtx);

return err;

}


Com suas repetidas goto fail refrão, a estrutura do código parece familiar. Ah sim, eu sei: a canção obscena três oficiais alemães cruzaram o Reno. Substitute 'Goto falhar "para" Parlez-vous "e você pode praticamente assobiar-la:


se errar é igual a ess ess ell tum-tum-tee

Ir à ​​falha,

se errar é igual a ess ess ell tum-tee-dum

Ir à ​​falhar ...


Goto repete é como a frase "Simon diz" em um jogo de "Simon diz": ela só existe para te enganar. Ele torna-se um estilo cheio de tiques entediado.


Os programadores não deve ser infligir, tarefas repetitivas chato em si mesmos. É por isso que eles fazem amigos com computadores.


E esta empreendedores simplesmente não é necessário. Apesar de a linha não-comittal feita pelo esta página , existem maneiras melhores de fazer isso.


Por exemplo, o mantenedor do código poderia simplesmente deixar cair os gotos e codificar todo o lote com ifs aninhados. Claro, ele provavelmente iria querer refazer a função em pedaços menores, para evitar acabar com a sua lógica desconfortavelmente apertado contra a margem direita, como o rosto de uma criança com fome esmagado contra uma janela restaurante em um filme comovente. Mas e daí? Este programa poderia usar um pouco de reorganização extra.


Ou - e essa é solução preferida do bebê - ele poderia simplesmente ligar o interruptor C + + do que bem grande compilador que ele tem lá, e proteger seus recursos com um pouco de RAII . Com isso no lugar, seus gotos horríveis tornar felicidades.


Leitor: Existe alguma outra função para o qual gostaria de chamar a minha atenção?


Stob: Para o curioso incidente do signedHashes variável no corpo da função.


Reader, corajosamente tocando junto: Mas o signedHashes variável não faz nada no corpo da função.


Stob, triunfante: Esse é o curioso incidente.







via Alimentação (Feed)

Nenhum comentário:

Postar um comentário