Fallo de segmentación del compilador rápido al compilar

100

Agregar una heightpropiedad calculada (conveniente) UIViewen mi UIViewExtension.swiftarchivo está causando que el compilador Swift tenga errores de segmentación ... ¿Qué podría estar fallando aquí?

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

Si se necesita más información para descifrar esto, simplemente comente. ¡Gracias!

Editar:

Aquí hay un .xcodeproj relacionado que devuelve el error del compilador de esta pregunta. Descarga aquí

Aleclarson
fuente
7
Los compiladores no deberían segmentar. si se trata de un problema nuevo, presente un informe de error.
Karoly Horvath
3
Parece un error del compilador. Debería informarlo a Apple para que puedan solucionarlo.
Chuck
11
El compilador ha estado segmentando de izquierda a derecha mientras yo migraba un proyecto de Objective-C a Swift. Ha sido descorazonador por decir lo menos.
aleclarson
1
@aleclarson Supongo que la versión de lanzamiento funcionará mejor, pero si encuentra errores, los reportaría ya que esa puede ser la única forma en que se solucionarán antes del lanzamiento.
Joachim Isaksson
6
Esperaba que Swift estuviera listo para usar desde el primer momento. ¡Esperar apesta! :)
aleclarson

Respuestas:

74

Tuve este error porque estaba haciendo esto:

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

}

en vez de

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

}

así que creo que opcional no se desenvuelve si la condición puede causar este error

Fjohn
fuente
3
Esa fue la causa para mí también. Pero se suponía que eso era correcto, ¿verdad? Es solo un error del compilador, ¿verdad
DeFrenZ
Mismo. Verificación de enumeración opcional. Espero que lo solucionen
mente
El código correcto sería: if (currentMeal.State == .Deleted) {} ​​como Swift sobrecarga útilmente == para dos opcionales que son iguales. La publicación de Fjohn es bastante peligrosa.
mattyohe
1
Se trata de un error de compilación, el código que paso es peligroso si la variable no se verifica antes. ¿Qué pasa con su código si currentMeal es nulo? es lo mismo no? ¿Podría explicarme por qué mi código es más peligroso que el suyo, por favor? swift aprovechar opcional sin usar "?" ?
Fjohn
Gracias, este también es mi caso. Swift me ha estado dando sorpresas desagradables a lo largo del camino, pero esta está muy por encima del límite.
CodeBrew
26

Cuando te encuentras con un error de segmento del compilador en Swift, no obtienes un número de línea útil ni un mensaje de error. Así es como puede rastrear el problema:

  1. Cree un nuevo archivo llamado SegFaultDebugger.swiften su proyecto.
  2. En este nuevo archivo, defina una extensión para la clase que le está dando problemas.
  3. Mueva un grupo de métodos del archivo principal a SegFaultDebugger.swift.
  4. Compilar.

En este punto, sucede una de tres cosas:

  • Aún obtiene el segfault en el archivo original : mueva los métodos de SegFaultDebugger.swiftnuevo al archivo original y mueva un conjunto diferente de métodos a SegFaultDebugger.swift. Repetir
  • Obtienes un error de segmentación enSegFaultDebugger.swift : ¡Genial! Ahora use la búsqueda binaria para fijar la falla de segmento a un método específico hasta que pueda averiguar qué construcción la está causando.
  • Obtiene errores significativos del compilador : ¡Genial! Corrija los errores. Una vez que todo se compile, vuelva a mover sus métodos al archivo original.
Cuenta
fuente
1
¡Gracias! Esto ayudó después de horas de rascarme la cabeza.
dejavu89
1
¡Esto fue muy útil! En mi caso, tenía mi NSFetchedResultsControllerDelegate en una extensión y fue suficiente para fusionarlo con el bloque de clase principal.
Mikael Grön
@ MikaelGrön, ¿puedes ampliar eso? ¿Qué tenías exactamente en la extensión?
RyanJM
Pero, ¿cómo sabes qué clase es la que te está dando los problemas?
el reverendo
@theReverend Si no está seguro, tendrá que probar cada clase en el archivo ofensivo. Pero swiftc realmente no ha tenido un problema de fallas segmentadas en algunos años, no estoy seguro de que mi respuesta sea relevante.
Proyecto de ley
12

Recibí este error al extender uno de mis protocolos y un argumento de tipo opcional y mal escrito.

protocol SomeProtocolName: class {
    var someProtocolVariable: String { get set }

    func someProtocolFunction(someProtocolVariable: String)
}

// MARK:
extension SomeProtocolName {
    func someProtocolFunction(someProtocolVariable: String?) {
        self.someProtocolVariable = someProtocolVariable
    }
}

La diferencia en los argumentos de la función Stringen el prototipo y String?en la extensión causó la falla de segmentación 11 .

victor.vasilica
fuente
3
Yo también tengo esto. Parece que Apple tiene algunos problemas con la escritura opcional. ¡Un problema importante es cuándo! se utiliza dentro de un tipo de variable. No es opcional por defecto, pero el compilador se confunde.
user1122069
@ user1122069 está de acuerdo, los protocolos tienen algunos problemas restantes. Espero que con las próximas versiones estos problemas se solucionen.
victor.vasilica
No estaba hablando de protocolos, solo en general. ¡Acabo de aprender qué! hace dentro de una variable, pero el IDE y el compilador a menudo no consiguen errores precisos para!.
user1122069
@ user1122069 mi mal, sry.
victor.vasilica
Esto me sucedió al agregar muchos elementos en una matriz
aguilarpgc
9

También tuve este error y lo arreglé así:

Verifique su proyecto y descubra qué archivos se usan dos veces y elimine uno, o elimínelos y vuelva a agregarlos todos.

Errores en mi Xcode:

: 0: error: nombre de archivo "AttributedString.swift" usado dos veces: '/Users/.../CNJOB/CNJOB/AttributedString.swift' y '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: nota: los nombres de archivo se utilizan para distinguir declaraciones privadas con el mismo nombre

: 0: error: nombre de archivo "APIClient.swift" usado dos veces: '/Users/.../CNJOB/CNJOB/APIClient.swift' y '/Users/.../CNJOB/CNJOB/APIClient.swift'

: 0: nota: los nombres de archivo se utilizan para distinguir declaraciones privadas con el mismo nombre

Command / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc falló con el código de salida 1

JNYJ
fuente
8

En Xcode 7, puede hacer clic en el error en Debug Navigator y se le mostrará una vista ampliada de los bloqueos. Al hacer clic en el botón de hamburguesa a la derecha, se expande el error, y si se desplaza hasta la parte inferior del mensaje de error expandido, verá de dónde proviene.

ingrese la descripción de la imagen aquí

Para mí, tuve dos de esos errores de falla de segmentación. En la imagen de arriba, la primera es cómo se ve cuando se contrae, la segunda es cuando expande el botón de hamburguesa. En la parte inferior del cuadro gris expandido, verá un mensaje que dice dónde se bloqueó el compilador.

Sin embargo, tenga en cuenta que el mensaje de error a veces puede no ser lo suficientemente informativo, por lo que si bien le dice dónde se bloqueó, no siempre dice por qué y cómo solucionarlo. Deshacerse de este error sigue siendo una cuestión de conjeturas.

Mateo Quiros
fuente
1
Pude rastrear los errores del navegador. Gracias, esto me ayudó a corregir mis errores.
Vishal Chandran
5

Descubrí una solución alternativa simple hasta que el problema se solucione en una futura compilación de Xcode / Swift:

  • Simplemente coloque todas las extensiones que causan el problema en el .swiftarchivo que se está utilizando.

En el proyecto de ejemplo que proporcionó, coloque el contenido de UIViewExtension.swift y CALayerExtension.swift arriba AppDelegate.swift

Con suerte, esto puede hacernos escribir código Swift funcional hasta que se solucione el problema.

gomollon
fuente
4

En cuanto a mí, agregando privatea static var fixed clang crash:

private static var taskId = 0
Cfr
fuente
2

Tuve una falla de segmentación del compilador en una declaración como esta:

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

En su lugar, hice una declaración if-else y funciona.

pojo
fuente
1
Swift 3: esta respuesta resuelve la falla de segmentatio 11 en muchos proyectos.
Alessandro Ornano
Vaya, increíble. El compilador Swift se siente como una versión alfa con todos estos problemas. Gracias por esto.
TGO
2

También puede tener este problema si declara una condición con un Bool sin envolver como propiedad

Beninho85
fuente
1

En mi caso, los dos puntos perdidos durante la interpolación de cadenas rompieron el mío (XCode 6.1.1).

Ejemplo:

println("\(value1:value2)") 

cuando quise hacer:

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

Este error me sucedió cuando intenté anular la variable débil de la clase principal.

En clase base:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Clase derivada:

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

    }

El error desapareció cuando eliminé =nilde la clase derivada.

VojtaStavik
fuente
1

Atrapo alguna excepción hoy

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

y esto lo resolvió:

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

Debido a que "Any" tipo es cualquier tipo de evento "nil", "AnyObject", opcional, ... :) No puede ser opcional, ya es opcional.

typealias Any = protocol<>
suquant
fuente
Mi caso también fue un problema con "Any"
Adriano Spadoni
1

Este error también ocurre si declara accidentalmente una variable con un tipo que coincide con su nombre:

    var sectionGroup: sectionGroup? { ... }
Saukwood
fuente
Lo cual no habría sido un problema si hubiera seguido la convención de nomenclatura de Apple y hubiera utilizado una primera letra mayúscula para el tipo. Probablemente por eso Apple no se ha tropezado con él. Además, su respuesta parece ser la misma que la de @aminhotob
qwerty_so
1

Se encontró con este error debido a un tipo genérico extraño en una función de operador, por ejemplo

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

En mi caso, eliminar <T>resolvió el problema.

Dom
fuente
El mismo problema aquí, en general parece que la definición de genéricos que no se utilizan realmente provocará este error.
Kevin R
1

En mi caso había declarado un structinside a func. Moviendo elstruct al nivel de clase resolvió el problema.

Ahora que escribo esto, recuerdo haber tenido problemas con el structinterior funcs antes. Fue algo más que la falla de segmentación (que parece volverse notoria con la beta de Swift 1.2). Dios mío, Apple, ¿qué estás haciendo allí?

qwerty_so
fuente
Tenía 3 variables en una estructura y funcionó bien, agregando una cuarta comenzó a causar el problema de la falla de segmentación. cambiar estructura a clase me lo resolvió
Ehab Amer
1

En mi caso, este error porque uso el nombre de clase para la variable

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

Y esto soluciona mi problema

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

En mi caso, esto sucedió cuando hice una inicialización estática incorrecta en un protocolo. Encontré una forma de desplazarme, pero un compilador nunca debería producir una falla de segmentación durante la .

Hay tres archivos involucrados. Un protocolo NamedSegues.swift, un TableViewController personalizado que, entre otras cosas, implementa el protocolo que contiene una devolución de llamada, una TableViewCell personalizada que hace referencia a este protocolo para llamar a la devolución de llamada.

//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.
     }
}

Lo superé usando?

En el archivo de protocolo, archivo1: elimina la declaración de getDefault () En el archivo CustomController2: elimina la implementación de getDefault. En CustomCellView, file3:

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

¡El compilador debería haber captado esto y haber dado algún mensaje de error en lugar de lanzar un error de segmentación durante la compilación!

Jitendra Kulkarni
fuente
1

¡Parece que el compilador de Swift 2 no estaba listo para el horario de máxima audiencia! En caso de que esto ayude a alguien, estaba obteniendo una falla de segmentación: 11 debido a una falta de coincidencia con el tipo de variable en un encabezado de cierre, específicamente en un método Parse,PFQuery.query.findObjectsInBackgroundWithBlock .

Puede ver el problema con más detalle aquí: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Craig Grummitt
fuente
1

Como dijo @Fjohn , este fue un problema relacionado con desenvolver un opcional para mí (se rompió tanto en Xcode 7.0 beta 6 como en Xcode 7). En mi caso, no estaba desenvolviendo opcional de lo opcional (lo que me dio la pista fue doble en el descriptor. Usar if let resolvió el problema

doble opcional causando falla de segmentación

mike.tihonchik
fuente
1

Como otros escribieron anteriormente, para mí esto sucedió cuando estoy usando una extensión sobre un protocolo, pero la firma de los métodos en el protocolo no coincide con las implementaciones en una extensión.

En mi caso, había agregado un nuevo parámetro a la implementación (en la extensión) pero olvidé agregarlo también a la firma del método en el protocolo.

Alex
fuente
1

en mi caso, intenté agregar un parámetro de función después de un parámetro variadic.

Invertir la secuencia de parámetros y hacer que el parámetro variadic sea el último parámetro en la lista de parámetros lo solucionó.

Gerd Castan
fuente
1

Esto suele ocurrir cuando el compilador no tiene suficiente información (a pesar de lo que piense) para garantizar / determinar el estado de una declaración o una variable dentro de una declaración.

Por ejemplo, imagine que tiene un diccionario de tipo [Cadena: Cadena] que llena con nombres de ciudades como claves y una lista separada por comas de los códigos postales / códigos postales correspondientes.

Imagina que en algún lugar de tu código deseas actualizar la lista de códigos correspondientes:

myDict[town] += newZipCode + ","

En este caso, el compilador responderá con un error de segmentación como town podría no estar en el diccionario y, por lo tanto, no puede garantizar que la declaración anterior tenga un valor válido.

Para resolver esto, debe almacenar el estado actual de myDict[town]en una variable separada que le permita manejar el caso de key not in dicty luego actualizar el valor de la clave dada:

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

Desafortunadamente, no siempre es sencillo determinar la causa raíz, así que espero que este sencillo ejemplo ayude.

zevij
fuente
1

Swift 3.0 (Xcode 8.1) presenta este problema cuando un protocolo declara una variable opcional y un implementador implementa esa variable como una inicializada diferida.

El error se informa aquí: https://bugs.swift.org/browse/SR-1825

Petter
fuente
1

Xcode 8.2.

Agregar la @nonobjcimplementación del protocolo a la extensión provoca fallas de segmentación. Mueva la @nonobjcimplementación del protocolo a la implementación de la clase.

Eugene Prokoshev
fuente
1

En mi caso, el culpable sobrecargó accidentalmente una función que esperaba un argumento de matriz con uno con un argumento variadic :

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

Cuando la superclase lo tenía definido como una matriz:

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

Para mí, lo siguiente causó un error de segmentación, mientras que typees opcional:

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

y esto lo resolvió:

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

Recibí este error con la siguiente firma de método en un UITableViewController personalizado.

func filterContentForSearchText(searchText: String)

cambiando a:

func filterContentForSearchText(searchText: String!)

solucionó el problema.

elprl
fuente
0

Tuve el mismo problema en una extensión. Mi extensión tenía dos inicializadores de conveniencia:

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 deshacerme del error, agregué un mapa de método de instancia (diccionario: NSDictionary) y el error de falla de segmentación desapareció.

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    map(dictionary)
}
Julián J. Tejera
fuente
0

Para mí, el problema era que mis arquitecturas no se ajustaran al estándar. Había agregado i386 o algo así, simplemente lo configuré de nuevo al arco xcodeproject predeterminado y se compiló bien.

Albert Renshaw
fuente
0

Tuve el mismo problema en un proyecto rápido. El problema era una función que debería haber devuelto un objeto, pero no tenía retorno. Este tipo de error solía ser señalado durante la edición con Obj-C. Parece que no es el caso de Swift.

Benjamín
fuente