Falha de segmentação do compilador Swift durante a construção

101

Adicionar uma heightpropriedade computada (conveniente) ao UIViewmeu UIViewExtension.swiftarquivo está causando o segfault do compilador Swift ... O que pode estar 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<(anonymous namespace)::FindClassMethodIndex>::addClassMembers(swift::ClassDecl*) + 329
6  swift                    0x00000001055e97b2 swift::irgen::emitVirtualMethodValue(swift::irgen::IRGenFunction&, llvm::Value*, swift::SILType, swift::SILDeclRef, swift::CanTypeWrapper<swift::SILFunctionType>, swift::ResilienceExpansion) + 434
7  swift                    0x00000001056550d3 swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::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*>, 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 <path redacted>/UIViewExtension.swift:60:5
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>: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 pergunta. Baixe aqui

aleclarson
fonte
7
os compiladores não devem ter um segfault. se este for um novo problema, envie um relatório de bug.
Karoly Horvath
3
Parece um bug do compilador. Você deve informar a Apple para que eles possam resolver o problema.
Chuck
11
O compilador foi segmentado para a esquerda e para a direita, pois estou migrando um projeto Objective-C para o Swift. Tem sido desanimador, para dizer o mínimo.
aleclarson
1
@aleclarson Presumo que a versão de lançamento funcionará melhor, mas se você encontrar bugs, eu os relataria, pois essa pode ser a única maneira de serem corrigidos antes do lançamento.
Joachim Isaksson
6
Eu estava pensando que o Swift estaria pronto para ser usado logo no início. Esperar é uma merda! :)
aleclarson

Respostas:

75

Eu tive este erro porque estava fazendo isso:

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

}

ao invés de

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

}

então eu acho que a condição opcional não desembrulhada pode causar este erro

Fjohn
fonte
3
Essa foi a causa para mim também. Mas isso deveria estar correto, certo? É apenas um bug do compilador é
DeFrenZ
Mesmo. Verificação de enum opcional. Espero que consertem
mente
O código correto seria: if (currentMeal.State == .Deleted) {} ​​as Swift sobrecarrega == para dois opcionais que são igualáveis. A postagem de Fjohn é bastante perigosa.
mattyohe
1
É sobre um erro de compilação, o código que passei é perigoso se a variável não for verificada antes. e quanto ao seu código se currentMeal for nulo? é o mesmo não? você poderia me explicar por que meu código é mais perigoso que o seu, por favor? swift aproveite opcional sem usar "?" ?
Fjohn
Obrigado, este é o meu caso também. Swift tem me dado surpresas desagradáveis ​​ao longo do caminho, mas esta está além do limite.
CodeBrew de
26

Quando você encontra um segfault do compilador no Swift, não obtém um número de linha útil e uma mensagem de erro. Veja como você pode rastrear o problema:

  1. Crie um novo arquivo chamado SegFaultDebugger.swiftem seu projeto.
  2. Nesse novo arquivo, defina uma extensão para a classe que está causando problemas.
  3. Mova um grupo de métodos do arquivo principal para SegFaultDebugger.swift.
  4. Compilar.

Nesse ponto, uma das três coisas acontece:

  • Você ainda obtém o segfault no arquivo original : mova os métodos de SegFaultDebugger.swiftvolta para o arquivo original e mova um conjunto diferente de métodos para dentro SegFaultDebugger.swift. Repetir
  • Você obtém um segfault emSegFaultDebugger.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 do compilador : Ótimo! Corrija os erros. Depois que tudo estiver compilado, mova seus métodos de volta para o arquivo original.
Conta
fonte
1
Obrigado! Isso ajudou depois de horas coçando minha cabeça.
dejavu89
1
Isso foi muito útil! No meu caso, eu tinha meu NSFetchedResultsControllerDelegate em uma extensão e foi o suficiente para mesclá-lo de volta ao bloco de classe principal.
Mikael Grön
@ MikaelGrön - você pode expandir isso? O que exatamente você tem na extensão?
RyanJM
Mas como você sabe qual classe está apresentando os problemas?
o reverendo
@theReverend Se você não tiver certeza, terá que tentar cada classe no arquivo ofensivo. Mas o swiftc não tem realmente um problema de segfault há alguns anos - não tenho mais certeza se minha resposta é relevante.
Bill
12

Recebi este erro ao estender um dos meus protocolos e digitei incorretamente o 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 função Stringno protótipo e String?na extensão causou a falha de segmentação 11 .

victor.vasilica
fonte
3
Eu também tenho isso. Parece que a Apple tem alguns problemas com a digitação opcional. Uma questão importante é quando! é usado dentro de um tipo de variável. Não é opcional por padrão, mas o compilador fica confuso.
user1122069
@ user1122069 concorda, os protocolos ainda têm alguns problemas. Espero que nas próximas versões este problema seja corrigido.
victor.vasilica
Eu não estava falando sobre protocolos, apenas em geral. Eu só aprendi o quê! faz dentro de uma variável, mas o IDE e o compilador geralmente falham em obter erros precisos para!.
user1122069
@ user1122069 meu mal, sry.
victor.vasilica
Isso aconteceu comigo quando adicionei muitos itens em uma matriz
aguilarpgc
9

Eu também tive esse erro e o corrigi assim:

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

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: nota: 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: nota: nomes de arquivos são usados ​​para distinguir declarações privadas com o mesmo nome

Command / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc falhou com o código de saída 1

JNYJ
fonte
8

No Xcode 7, você pode clicar no erro no Debug Navigator e será exibida uma visão expandida das falhas. Clicar no botão de hambúrguer à direita expande o erro e, se você rolar até a parte inferior da mensagem de erro expandida, verá de onde ele vem.

insira a descrição da imagem aqui

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

No entanto, observe que a mensagem de erro pode às vezes não ser informativa o suficiente, portanto, embora diga onde ele travou, nem sempre diz por que e como corrigi-lo. Livrar-se desse erro ainda é uma questão de adivinhação.

MLQ
fonte
1
Foi capaz de rastrear os erros do Navigator. Obrigado, isso me ajudou a corrigir meus erros!
Vishal Chandran
5

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

  • Basta colocar todas as extensões que estão causando o problema no .swiftarquivo que está sendo usado.

No projeto de exemplo que você forneceu, coloque o conteúdo de UIViewExtension.swift e CALayerExtension.swift acima AppDelegate.swift

Esperançosamente, isso pode nos levar a escrever um código Swift funcional até que o problema seja resolvido.

gomollon
fonte
4

Quanto a mim, adicionando privateao estático var fixed clang crash:

private static var taskId = 0
Cfr
fonte
2

Tive uma falha de segmentação do compilador em uma instrução como esta:

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

Em vez disso, acabei de fazer uma instrução if-else e funciona.

pojo
fonte
1
Swift 3: esta resposta resolve a falha de segmentação 11 em muitos projetos.
Alessandro Ornano
Uau, inacreditável. O compilador Swift parece uma versão alfa com todos esses problemas. Obrigado por isso.
TGO de
2

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

Beninho85
fonte
1

No meu caso, dois pontos mal colocados durante a interpolação de string quebraram o meu (XCode 6.1.1).

Exemplo:

println("\(value1:value2)") 

quando eu pretendia fazer:

println("\(value1) : \(value2)")
jimejim
fonte
1

Este erro aconteceu comigo quando tentei substituir a variável fraca da classe pai.

Na classe base:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Classe derivada:

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

    }

O erro desapareceu quando removi =nilda classe derivada.

VojtaStavik
fonte
1

Eu peguei 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<>
suquant
fonte
Meu caso também foi um problema com "Any"
Adriano Spadoni
1

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

    var sectionGroup: sectionGroup? { ... }
Saukwood
fonte
O que não teria sido um problema se você tivesse seguido a convenção de nomenclatura da Apple e usado uma primeira letra maiúscula para o tipo. É provavelmente por isso que a Apple não tropeçou nisso. Além disso, sua resposta parece ser a mesma de @aminhotob
qwerty_so
1

Encontrou este erro devido a um tipo genérico estranho em uma função de operador, por exemplo

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

No meu caso, a remoção <T>resolveu o problema.

Sol
fonte
Mesmo problema aqui, em geral parece que definir genéricos que não são realmente usados ​​causará esse erro.
Kevin R
1

No meu caso, declarei um structdentro de a func. Movendo ostruct para o nível de classe resolveu o problema.

Agora que escrevo isso, lembro-me de ter tido problemas com os structsistemas internos funcantes. Era algo mais do que a falha de segmentação (que parece se tornar notória com o Swift 1.2 beta). OMG Apple, o que você está fazendo aí?

qwerty_so
fonte
Eu tinha 3 variáveis ​​em uma estrutura e funcionou bem, adicionando uma quarta começou a causar o problema de falha de segmentação. mudar a estrutura para classe resolveu para mim
Ehab Amer
1

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

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

E isso resolve meu problema

var myClass : MYClass {
    get {
        return.....
    }
}
aminhotob
fonte
1

No meu caso, isso aconteceu quando eu fiz uma inicialização 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 este 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<NSObject>, withEvent event: UIEvent) {
        NSLog("Touched id: \(id)")


             parent.executeSegueWithId(id) // This is where parent was used.
     }
}

Eu consegui contornar isso usando?

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

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

O compilador deveria ter detectado isso e dado alguma mensagem de erro em vez de lançar uma falha de segmentação durante a compilação!

Jitendra Kulkarni
fonte
1

Parece que o compilador Swift 2 pode não estar totalmente 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 cabeçalho de encerramento, especificamente em um método Parse,PFQuery.query.findObjectsInBackgroundWithBlock ,.

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

Craig Grummitt
fonte
1

Como @Fjohn disse, esse era um problema relacionado ao desembrulhar um opcional para mim (quebrado tanto no Xcode 7.0 beta 6 quanto no Xcode 7). No meu caso, eu não estava desembrulhando opcional do opcional (o que me deu a dica foi duplo ?? no descritor. Usar if let resolveu o problema

duplo opcional causando falha de segmentação

mike.tihonchik
fonte
1

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

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

Alex
fonte
1

no meu caso, tentei adicionar um parâmetro de função após um parâmetro variável.

Reverter a sequência de parâmetros e tornar o parâmetro variável o último parâmetro na lista de parâmetros corrigiu isso.

Gerd Castan
fonte
1

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 de uma variável dentro de uma instrução.

Por exemplo, imagine que você tem um dicionário 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ê deseja atualizar a lista de códigos correspondentes:

myDict[town] += newZipCode + ","

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

Para resolver isso, você deve armazenar o estado atual de myDict[town]em uma variável separada, permitindo que você trate o caso de key not in dicte, 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.

zevij
fonte
1

O Swift 3.0 (Xcode 8.1) apresenta esse problema quando um protocolo declara uma variável opcional e um implementador implementa essa variável como inicializada lentamente.

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

Petter
fonte
1

Xcode 8.2.

Adicionar @nonobjcimplementação de protocolo à extensão causando falhas de segmentação. Mova a @nonobjcimplementação do protocolo para a implementação da classe.

Eugene Prokoshev
fonte
1

No meu caso, o culpado estava acidentalmente sobrecarregando uma função que esperava um argumento de matriz com um com um argumento variável :

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

Quando a superclasse o definiu como uma matriz:

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

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

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

e isso resolveu:

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

Recebi este erro com a seguinte assinatura de método em um UITableViewController personalizado.

func filterContentForSearchText(searchText: String)

mudando para:

func filterContentForSearchText(searchText: String!)

corrigiu o problema.

elprl
fonte
0

Tive o mesmo problema em uma extensão. Minha extensão tinha 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 (dicionário: NSDictionary) e o erro de falha de segmentação desapareceu.

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    map(dictionary)
}
Julian J. Tejera
fonte
0

Para mim, o problema era não ter minhas arquiteturas definidas para o padrão. Eu tinha adicionado i386 ou algo assim, apenas defina-o de volta para o arco xcodeproject padrão e ele compilou bem.

Albert Renshaw
fonte
0

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

Benjamin
fonte