Eu escrevi uma função que verifica se há um arquivo corrompido usando uma soma de verificação CRC.
Para testá-lo, acabei de abrir o arquivo e embaralhar o conteúdo com um editor hexadecimal. O problema é que não acredito que esta seja a maneira correta de gerar um arquivo corrompido.
Existe alguma outra maneira de criar uma "corrupção controlada", para que não seja totalmente aleatória, mas simule o que acontece com arquivos corrompidos reais? Eu nunca tive que corromper algo de propósito, então não tenho muita certeza de como fazê-lo, além da mistura aleatória de dados em um arquivo.
files
corruption
rataplan
fonte
fonte
Respostas:
Também não testei muito , mas aqui estão duas idéias:
Escreva alguns zeros no meio do arquivo. Use
dd
comconv=notrunc
. Isso grava um único byte (tamanho do bloco = 1 contagem = 1):Usar
/dev/urandom
como fonte também é uma opção.Como alternativa, faça vários furos de 4k com
fallocate --punch-hole
. Você pode atéfallocate --collapse-range
cortar uma página sem deixar um buraco com zero. (Isso mudará o tamanho do arquivo).Um download retomado no local errado corresponderia ao
--collapse-range
cenário. Um torrent incompleto corresponderá aopunch-hole
cenário. (Arquivo esparso ou extensões pré-alocadas, lidas como zero em qualquer lugar que ainda não tenha sido gravado.)Uma RAM ruim (no sistema do qual você baixou o arquivo) pode causar corrupção e as unidades ópticas também podem corromper arquivos (o ECC nem sempre é forte o suficiente para se recuperar perfeitamente de arranhões ou desbotamento do corante).
Os setores de DVD (blocos ECC) são 2048B , mas podem ocorrer erros de byte único ou até de bit único. Algumas unidades provavelmente fornecerão os dados incorretos incorretos, em vez de um erro de leitura para o setor, especialmente se você ler no modo bruto ou com o nome.
fonte
As outras respostas parecem principalmente preocupadas com erros de hardware. Deixe-me listar algumas corrupções causadas por software:
Essas coisas são bastante inofensivas ao acontecer com arquivos de texto, mas geralmente mortais quando aplicadas a arquivos binários.
fonte
Use
dd
para truncar o arquivo ou tente um editor binário comohexer
editar e introduzir algumas corrupções.Exemplo de arquivo de truncamento usando dd
Crie um arquivo de 5 MB
Truncar 10 bytes do final
Página de manual Hexer
fonte
dd
, isso simularia um cenário do mundo real onde apenas parte do arquivo é criada. E editar usandohexer
para introduzir algum conteúdo falso simularia outro tipo de corrupção. Como um aparte quemd5sum
pode valer a pena examinar, ele calcula a soma de verificação md5 para um arquivo.dd
?Sugestão:
Comece a gravar em um arquivo e interrompa a execução antes de terminar. Isso pode ocorrer durante cortes de energia e outros cenários.
Cenário da vida real:
Certa vez, danifiquei um arquivo zip tentando copiar mais dados do que caberia no meio. O Windows (este era o Windows 7 no modo de segurança ftr) tentou concluir a ação antes de descobrir se havia espaço suficiente e, quando o descobriu, o arquivo estava pela metade e, portanto, corrompido. Espero que eles tenham corrigido esse problema em versões posteriores do Windows ou que isso fosse apenas uma coisa do modo de segurança.
fonte
Outro tipo comum de corrupção é a manipulação de bits: onde um único bit (ou vários bits) é alternado em um fluxo de dados.
Portanto, um byte
1111 0000
pode se tornar, digamos,1111 0010
ou1011 0000
ou1110 1100
ou o que for.Os sistemas de soma de verificação de paridade e contagem de problemas têm problemas com coisas como
1110 1000
onde há um número igual de conjuntos e desabilitados, pois a paridade e o número de unidades permanecem os mesmos.Portanto, substituir todas as instâncias de um caractere aleatório pelo inverso, digamos 0x57 a 0x75 ('9' a 'K') ou vice-versa, pode não ser detectável. Para sistemas que possuem mysql, o comando "replace" existe apenas para esse propósito:
Você também pode tentar trocar as letras K e 9, o que será um teste particularmente bom se as duas aparecerem o mesmo número de vezes no arquivo:
Use
man replace
para mais informações.fonte
Alterações aleatórias nos dados de teste corrompidos não são uma boa abordagem, pois você não pode reproduzir a amostra para executar novamente os testes.
Eu ficaria feliz com apenas 3 amostras, mudando apenas 1 bit no primeiro byte, no último byte e em qualquer byte do meio. Mas apenas 1 bit, não o byte inteiro.
Mas a melhor amostra de teste seria aquela em que você poderia gerar amostras alterando cada bit do arquivo do primeiro ao último byte. Isso não pode ser (normalmente) obtido com as ferramentas usuais, você precisa criar uma (eu acho).
Com essa abordagem, você isola muitas possibilidades, incluindo endianess, se o seu algoritmo é baseado em um tipo de endianess. Em outras mãos, uma amostra grande pode consumir muito tempo para processar.
Por fim, alguns exemplos de truncamento ou adição de bytes concluirão seus testes.
fonte