MASTG-TEST-0086: Falhas de Corrupção de Memória
Visão Geral¶
Análise Estática¶
Existem partes de código nativo? Se sim: verifique os problemas indicados na seção geral de corrupção de memória. O código nativo é um pouco mais difícil de identificar quando compilado. Se você tiver os códigos-fonte, poderá ver que arquivos C usam arquivos de origem .c e arquivos de cabeçalho .h, enquanto C++ usa arquivos .cpp e .h. Isso é um pouco diferente dos arquivos .swift e .m para Swift e Objective-C. Esses arquivos podem fazer parte dos códigos-fonte ou de bibliotecas de terceiros, registrados como frameworks e importados por meio de várias ferramentas, como Carthage, Swift Package Manager ou Cocoapods.
Para qualquer código gerenciado (Objective-C / Swift) no projeto, verifique os seguintes itens:
- O problema doubleFree: quando
freeé chamado duas vezes para uma determinada região em vez de uma. - Ciclos de retenção: procure por dependências cíclicas por meio de referências fortes de componentes entre si, que mantêm materiais na memória.
- O uso de instâncias de
UnsafePointerpode ser gerenciado incorretamente, o que permitirá vários problemas de corrupção de memória. - Tentar gerenciar manualmente a contagem de referência de um objeto usando
Unmanaged, levando a números de contador incorretos e uma liberação muito tardia ou muito antecipada.
Uma ótima palestra sobre este assunto é apresentada na Realm academy e um tutorial interessante para ver o que realmente está acontecendo é fornecido por Ray Wenderlich sobre este assunto.
Observe que com o Swift 5 você só pode desalocar blocos completos, o que significa que o playground mudou um pouco.
Análise Dinâmica¶
Existem várias ferramentas fornecidas que ajudam a identificar bugs de memória no Xcode, como o Debug Memory Graph introduzido no Xcode 8 e o instrumento Allocations and Leaks no Xcode.
Em seguida, você pode verificar se a memória é liberada muito rapidamente ou muito lentamente, habilitando NSAutoreleaseFreedObjectCheckEnabled, NSZombieEnabled e NSDebugEnabled no Xcode durante o teste do aplicativo.
Existem várias explicações bem escritas que podem ajudar no cuidado com o gerenciamento de memória. Elas podem ser encontradas na lista de referências deste capítulo.