Falha de segmentação do compilador Swift ao construir

Adicionar uma propriedade de height calculada (conveniente) ao UIView no meu arquivo UIViewExtension.swift está fazendo com que o compilador do Swift segfault … O que poderia estar dando errado aqui?

 0 swift 0x00000001061e5608 llvm::sys::PrintStackTrace(__sFILE*) + 40 1 swift 0x00000001061e5af4 SignalHandler(int) + 452 2 libsystem_platform.dylib 0x00007fff894da5aa _sigtramp + 26 3 libsystem_platform.dylib 0xb03939841e997c88 _sigtramp + 2504775416 4 swift 0x00000001064c8bb9 swift::NominalTypeDecl::getMembers(bool) const + 41 5 swift 0x00000001055efab9 swift::irgen::ClassMetadataLayout::addClassMembers(swift::ClassDecl*) + 329 6 swift 0x00000001055e97b2 swift::irgen::emitVirtualMethodValue(swift::irgen::IRGenFunction&, llvm::Value*, swift::SILType, swift::SILDeclRef, swift::CanTypeWrapper, swift::ResilienceExpansion) + 434 7 swift 0x00000001056550d3 swift::SILVisitor::visit(swift::ValueBase*) + 42611 8 swift 0x000000010564a266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 8678 9 swift 0x00000001055cb6f8 swift::irgen::IRGenModule::emitGlobalTopLevel() + 184 10 swift 0x00000001056376e3 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1859 11 swift 0x0000000105638033 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51 12 swift 0x00000001055aa65a frontend_main(llvm::ArrayRef, char const*, void*) + 4842 13 swift 0x00000001055a935d main + 1533 14 libdyld.dylib 0x00007fff8a82e5fd start + 1 

 1. While emitting IR SIL function @_TFCSo6UIViewg6heightSd for 'anonname=0x7ff422892fd0' at /UIViewExtension.swift:60:5 :0: error: unable to execute command: Segmentation fault: 11 :0: error: swift frontend command failed due to signal (use -v to see invocation) Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254 

Se mais informações forem necessárias para quebrar isso, apenas comente. Obrigado!

Editar:

Aqui está um .xcodeproj relacionado que retorna o erro do compilador desta questão. Baixe aqui

Eu tive esse erro porque estava fazendo isso:

 if(currentMeal?.State == .Deleted){ } 

ao invés de

 if(currentMeal!.State == .Deleted){ } 

então eu acho opcional não desembrulhado se condição pode causar esse erro

Quando você se depara com um segfault do compilador no Swift, não recebe um número de linha e uma mensagem de erro úteis. Veja como você pode rastrear o problema:

  1. Crie um novo arquivo chamado SegFaultDebugger.swift em seu projeto.
  2. Neste novo arquivo, defina uma extensão para a class que está causando problemas.
  3. Mova um grupo de methods do arquivo principal para SegFaultDebugger.swift .
  4. Compilar.

Neste ponto, uma das três coisas acontece:

  • Você ainda obtém o segfault no arquivo original : Mova os methods de SegFaultDebugger.swift volta para o arquivo original e mova um conjunto diferente de methods para o SegFaultDebugger.swift . Repetir
  • Você recebe um segfault no SegFaultDebugger.swift : Ótimo! Agora, use a pesquisa binária para fixar o segfault em um método específico até que você possa descobrir qual construção está causando isso.
  • Você obtém erros significativos no compilador : Ótimo! Corrigir os erros. Depois que tudo for compilado, mova seus methods de volta para o arquivo original.

Eu recebi este erro ao estender um dos meus protocolos e typescript incorretamente e argumento de tipo opcional.

 protocol SomeProtocolName: class { var someProtocolVariable: String { get set } func someProtocolFunction(someProtocolVariable: String) } // MARK: extension SomeProtocolName { func someProtocolFunction(someProtocolVariable: String?) { self.someProtocolVariable = someProtocolVariable } } 

A diferença nos argumentos da function String in prototype and String? em extensão causou a falha de segmentação 11 .

Eu também tive esse erro, e consertei assim:

Verifique seu projeto e descubra quais arquivos são usados ​​duas vezes e remova um ou exclua e adicione novamente todos eles.

Erros no meu Xcode:

: 0: erro: nome do arquivo “AttributedString.swift” usado duas vezes: ‘/Users/…/CNJOB/CNJOB/AttributedString.swift’ e ‘/Users/…/CNJOB/CNJOB/AttributedString.swift’

: 0: note: nomes de arquivos são usados ​​para distinguir declarações privadas com o mesmo nome

: 0: erro: nome do arquivo “APIClient.swift” usado duas vezes: ‘/Users/…/CNJOB/CNJOB/APIClient.swift’ e ‘/Users/…/CNJOB/CNJOB/APIClient.swift’

: 0: note: nomes de arquivos são usados ​​para distinguir declarações privadas com o mesmo nome

Comando / Aplicações / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc falhou com o código de saída 1

No Xcode 7, você pode clicar no erro no Navegador de Depuração e você verá uma visualização expandida das falhas. Clicar no botão de hambúrguer à direita expande o erro e, se você percorrer todo o caminho até o final da mensagem de erro expandida, verá de onde ele vem.

insira a descrição da imagem aqui

Para mim, eu tive dois desses erros de falha de segmentação. Na foto acima, o primeiro é o que parece quando colapsado, o segundo é quando você expande o botão de hambúrguer. Na parte inferior da checkbox cinza expandida, você verá uma mensagem que diz onde o compilador falhou.

Note, entretanto, que a mensagem de erro pode às vezes não ser informativa o suficiente, então enquanto ela diz onde ela falhou, nem sempre diz por que e como consertá-la. Livrar-se desse erro ainda é uma questão de adivinhação.

Eu descobri uma solução simples até que o problema seja corrigido em uma futura compilation do Xcode / Swift:

  • Simplesmente coloque todas as extensões causando o problema no arquivo .swift que está sendo usado.

No projeto de exemplo fornecido, coloque o conteúdo de UIViewExtension.swift e CALayerExtension.swift acima de AppDelegate.swift

Espero que isso nos faça escrever código Swift funcionando até que o problema seja resolvido.

Quanto a mim, adicionando private particionamento private ao static var fixed clang crash:

 private static var taskId = 0 

Eu tive uma falha de segmentação do compilador em uma declaração como esta:

 someFunction(isFlagged ? "String1" : "String2") 

Acabei de fazer uma instrução if-else e funciona.

Você também pode ter esse problema se declarar uma condição com um Bool não compactado como uma propriedade

No meu caso, um cólon mal colocado durante a interpolação de string quebrou o meu (XCode 6.1.1).

Exemplo:

 println("\(value1:value2)") 

quando eu pretendia fazer:

 println("\(value1) : \(value2)") 

Este erro aconteceu comigo quando tentei replace a variável fraca da class pai.

Na class base:

 weak var stripeViewDelegate : StripeViewDelegate? = nil 

Classe derivada:

 override weak var stripeViewDelegate : StripeViewDelegate? = nil { didSet { self.stripeView.delegate = stripeViewDelegate } 

O erro desapareceu quando eu removi =nil da class derivada.

Eu pego alguma exceção hoje

 class func createByAny(instance: Any?) -> ApiCollectionResponse { ... } 

e isso resolveu:

 class func createByAny(instance: Any) -> ApiCollectionResponse { ... } 

Porque o tipo “Any” é qualquer tipo de evento “nil”, “AnyObject”, opcional, … 🙂 Não pode ser opcional, já é opcional.

 typealias Any = protocol<> 

Este erro também acontece se você acidentalmente declarar uma variável com um tipo correspondente a seu nome:

  var sectionGroup: sectionGroup? { ... } 

Correram este erro por causa de um tipo genérico estranho em uma function do operador, por exemplo

 func ==(lhs: Foo, rhs: Foo) -> Bool { return lhs.bar == rhs.bar } 

No meu caso, remover resolveu o problema.

No meu caso eu tinha declarado uma struct dentro de um func . Mover a struct para o nível de class resolveu o problema.

Agora que escrevo isso, lembro de ter tido problemas com struct dentro de func s antes. Foi algo mais do que a falha de segmentação (que parece se tornar notória com o beta Swift 1.2). OMG Apple, o que você está fazendo aí?

No meu caso, este erro porque eu uso o nome da class para a variável

 var MYClass : MYClass { get { return..... } } 

E isso resolve meu problema

 var myClass : MYClass { get { return..... } } 

Im meu caso, isso aconteceu quando eu fiz a boot estática incorreta em um protocolo. Eu encontrei uma maneira de contornar, mas um compilador nunca deve produzir uma falha de segmentação durante a construção.

Existem três arquivos envolvidos. Um protocolo NamedSegues.swift, um TableViewController personalizado que, entre outras coisas, implementa o protocolo que contém um retorno de chamada, um TableViewCell personalizado que contém referência a esse protocolo para chamar o retorno de chamada.

 //file1 import Foundation protocol NamedSegues { func executeSegueWithId(id: String) -> Void static func getDefault() -> NamedSegues // This was required because of init requirement in CustomCellView } //file2 class CustomController: UITableViewController, NamedSegues { override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("CustomCellID", forIndexPath: indexPath ) as! CustomCellView // Configure the cell... //App logic... cell.parent = self } //Mark: NamedSegues func executeSegueWithId(id: String) ->() { NSLog("Received callback to execute segue: \(id)") // } static func getDefault() -> NamedSegues { // I think this must be where it threw up. return self as! NamedSegues } } //file3 import UIKit class CustomCellView: UITableViewCell { var id: String = "NoName" var parent: NamedSegues = NamedSegues.getDefault() // This is where it was needed. override func touchesBegan(touches: Set, withEvent event: UIEvent) { NSLog("Touched id: \(id)") parent.executeSegueWithId(id) // This is where parent was used. } } 

Eu tenho em torno disso usando?

No arquivo de protocolo, file1: exclua a declaração de getDefault () No arquivo CustomController2: exclua a implementação de getDefault. No CustomCellView, file3:

  var parent: NamedSegues? ... parent?.executeSegueWithId(id) 

O compilador deve ter capturado isso e receber uma mensagem de erro em vez de lançar uma falha de segmentação durante a construção!

Parece que o compilador Swift 2 pode não estar pronto para o horário nobre! Caso isso ajude alguém, eu estava recebendo uma falha de segmentação: 11 devido a uma incompatibilidade com o tipo de variável em um header de encerramento, especificamente em um método Parse, PFQuery.query.findObjectsInBackgroundWithBlock .

Você pode ver o problema em mais detalhes aqui: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Como o @Fjohn disse, este foi um problema relacionado a desembrulhar um opcional para mim (quebrado no Xcode 7.0 beta 6 e no Xcode 7). No meu caso, eu não estava desembrulhando opcional do opcional (o que me deu a dica foi double ?? no descritor. Usando se deixar resolver o problema

dupla opcional causando falha de segmentação

Como outros escreveram acima, para mim isso aconteceu quando estou usando uma extensão sobre um protocolo, mas a assinatura de methods no protocolo não corresponde às implementações em uma extensão.

No meu caso, eu adicionei um novo parâmetro à implementação (na extensão), mas esqueci de adicioná-lo à assinatura do método no protocolo.

no meu caso, tentei adicionar um parâmetro de function após um parâmetro variadico.

Invertendo a sequência de parâmetros e tornando o parâmetro variadic o último parâmetro na lista de parâmetros, fixou-o.

Isso normalmente acontece quando o compilador não tem informações suficientes (apesar do que você pensa) para garantir / determinar o estado de uma instrução ou uma variável em uma instrução.

Por exemplo, imagine que você tenha um dictionary do tipo [String: String] que você preenche com nomes de cidades como chaves e uma lista separada por vírgulas de CEPs / códigos postais correspondentes.

Imagine que em algum lugar do seu código você queira atualizar a lista de códigos correspondentes:

 myDict[town] += newZipCode + "," 

Nesse caso, o compilador responderá com falha de segmentação, pois a town pode não estar no dictionary e, portanto, não pode garantir que a instrução acima tenha um valor válido.

Para resolver isso, você deve armazenar o estado atual de myDict[town] em uma variável separada, permitindo que você manipule o caso da key not in dict e, em seguida, atualize o valor para a chave fornecida:

 myDict[town] = guaranteedValue + "," newZipCode + "," 

Infelizmente, nem sempre é fácil determinar a causa raiz, então espero que este exemplo simples ajude.

O Swift 3.0 (Xcode 8.1) exibe esse problema quando um protocolo declara uma variável opcional e um implementador implementa essa variável como uma inicializada com lentidão.

Bug é relatado aqui: https://bugs.swift.org/browse/SR-1825

Xcode 8.2.

Adicionando a implementação do protocolo @nonobjc na extensão causando falhas de segmentação. Mover a implementação do protocolo @nonobjc para a implementação da class.

No meu caso, o culpado foi acidentalmente sobrecarregar uma function esperando um argumento de matriz com um argumento variádico :

 public required init(_ args: Node...) { } 

Quando a superclass definiu como uma matriz:

 public required init(_ args: [Node]) { } 

Para mim, o seguinte causou um segfault, enquanto o type é um opcional:

 switch type { case .aType: // Do Something default: break } 

e isso resolveu:

 switch type { case .Some(.aType): // Do Something default: break } 

Eu tenho esse erro com a seguinte assinatura de método em um UITableViewController personalizado.

 func filterContentForSearchText(searchText: String) 

mudando para:

 func filterContentForSearchText(searchText: String!) 

resolveu o problema.

Eu tive o mesmo problema em uma extensão. Minha extensão teve dois inicializadores de conveniência:

 convenience init(context: NSManagedObjectContext) { let entityDescription = NSEntityDescription.entityForName("PropertyEntity", inManagedObjectContext: context)! self.init(entity: entityDescription, insertIntoManagedObjectContext: context) } convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) { self.init(context: context) property1 = (dictionary["key"] as? String) ?? "" // More properties... } 

Para me livrar do erro, adicionei um mapa de método de instância (dictionary: NSDictionary) e o erro de falha de segmentação desapareceu.

 convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) { self.init(context: context) map(dictionary) } 

Para mim, o problema era não ter minhas arquiteturas definidas como padrão. Eu tinha adicionado i386 ou algo assim, basta configurá-lo de volta ao padrão xcodeproject arch e compilado bem.

Eu tive o mesmo problema em um projeto rápido. O problema era uma function que deveria ter retornado um object, mas não tinha retorno nele. Esse tipo de erro costumava ser sinalizado durante a edição com o Obj-C. Parece que não é o caso de Swift.