Skip to content

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 UnsafePointer pode 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.