Erreur de segmentation du compilateur rapide lors de la construction

L’ajout d’une propriété de height calculée (pratique) à UIView dans mon fichier UIViewExtension.swift entraîne la UIView en UIViewExtension.swift du compilateur Swift … Que pourrait-il se passer de mal ici?

 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::SsortingngRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1859 11 swift 0x0000000105638033 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::SsortingngRef, 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 

Si plus d’informations sont nécessaires pour résoudre ce problème, faites un commentaire. Merci!

Modifier:

Voici un fichier .xcodeproj associé qui renvoie l’erreur de compilation de cette question. Télécharger ici

J’ai eu cette erreur parce que je faisais ceci:

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

au lieu de

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

donc je pense que facultatif pas déballé si la condition peut causer cette erreur

Lorsque vous rencontrez un défaut de compilateur dans Swift, vous n’obtenez pas de numéro de ligne ni de message d’erreur. Voici comment vous pouvez suivre le problème:

  1. Créez un nouveau fichier appelé SegFaultDebugger.swift dans votre projet.
  2. Dans ce nouveau fichier, définissez une extension à la classe qui vous pose des problèmes.
  3. Déplacez un groupe de méthodes du fichier principal vers SegFaultDebugger.swift .
  4. Comstackr.

À ce stade, l’une des trois choses suivantes se produit:

  • Vous obtenez toujours le segfault dans le fichier d’origine : Déplacez les méthodes de SegFaultDebugger.swift vers le fichier d’origine et déplacez un autre jeu de méthodes dans SegFaultDebugger.swift . Répéter
  • Vous obtenez une erreur de segmentation dans SegFaultDebugger.swift : Great! Utilisez maintenant la recherche binary pour épingler l’erreur de segmentation à une méthode spécifique jusqu’à ce que vous puissiez déterminer quelle construction en est la cause.
  • Vous obtenez des erreurs de compilation significatives : génial! Corrigez les erreurs. Une fois que tout est compilé, déplacez vos méthodes dans le fichier d’origine.

J’ai eu cette erreur en étendant l’un de mes protocoles et l’argument de type erroné et facultatif.

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

La différence dans les arguments de fonction Ssortingng in prototype and Ssortingng? en extension causé un défaut de segmentation 11 .

J’ai eu cette erreur aussi, et j’ai corrigé comme ceci:

Vérifiez votre projet et découvrez quels fichiers sont utilisés deux fois, supprimez-en un ou supprimez-les et rajoutez-les tous.

Erreurs dans mon Xcode:

: 0: erreur: nom de fichier “AtsortingbutedSsortingng.swift” utilisé deux fois: ‘/Users/…/CNJOB/CNJOB/AtsortingbutedSsortingng.swift’ et ‘/Users/…/CNJOB/CNJOB/AtsortingbutedSsortingng.swift’

: 0: note: les noms de fichiers sont utilisés pour distinguer les déclarations privées portant le même nom

: 0: erreur: nom de fichier “APIClient.swift” utilisé deux fois: ‘/Users/…/CNJOB/CNJOB/APIClient.swift’ et ‘/Users/…/CNJOB/CNJOB/APIClient.swift’

: 0: note: les noms de fichiers sont utilisés pour distinguer les déclarations privées portant le même nom

Commande / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc a échoué avec le code de sortie 1

Dans Xcode 7, vous pouvez cliquer sur l’erreur dans le navigateur de débogage et vous verrez apparaître une vue étendue des pannes. En cliquant sur le bouton de hamburger à droite, vous développez l’erreur, et si vous faites défiler tout en bas du message d’erreur étendu, vous verrez d’où cela vient.

entrer la description de l'image ici

Pour moi, j’ai eu deux de ces erreurs de segmentation. Dans l’image ci-dessus, le premier est ce à quoi il ressemble lorsqu’il est réduit, le second est lorsque vous développez le bouton hamburger. Tout en bas de la boîte grise développée, vous verrez un message indiquant où le compilateur est tombé en panne.

Notez toutefois que le message d’erreur peut parfois ne pas être suffisamment informatif, alors même s’il vous indique où il est tombé en panne, il ne dit pas toujours pourquoi et comment le réparer. Se débarrasser de cette erreur est toujours une affaire de conjectures.

J’ai découvert une solution simple jusqu’à ce que le problème soit résolu dans une future génération Xcode / Swift:

  • Placez simplement toutes les extensions à l’origine du problème dans le fichier .swift utilisé.

Dans l’exemple de projet que vous avez fourni, placez le contenu de UIViewExtension.swift et CALayerExtension.swift au-dessus de AppDelegate.swift

J’espère que cela peut nous amener à écrire du code Swift de travail jusqu’à ce que le problème soit résolu.

En ce qui me concerne, l’ajout de private à la variable statique fixe le plantage de clang:

 private static var taskId = 0 

J’ai eu une erreur de segmentation du compilateur dans une instruction comme celle-ci:

 someFunction(isFlagged ? "Ssortingng1" : "Ssortingng2") 

Je viens de faire une déclaration if-else à la place et ça marche.

Vous pouvez également avoir ce problème si vous déclarez une condition avec un Bool non emballé en tant que propriété

Dans mon cas, un colon mal placé lors de l’interpolation de chaînes a brisé le mien (XCode 6.1.1).

Exemple:

 println("\(value1:value2)") 

quand je voulais faire:

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

Cette erreur m’est arrivée lorsque j’ai essayé de remplacer la variable faible de la classe parente.

En classe de base:

 weak var ssortingpeViewDelegate : SsortingpeViewDelegate? = nil 

Classe dérivée:

 override weak var ssortingpeViewDelegate : SsortingpeViewDelegate? = nil { didSet { self.ssortingpeView.delegate = ssortingpeViewDelegate } 

L’erreur a disparu lorsque j’ai retiré =nil de la classe dérivée.

J’attrape quelques exceptions aujourd’hui

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

et cela l’a résolu:

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

Parce que “N’importe quel type” est un événement de type “nil”, “AnyObject”, optionnel, … 🙂 Il ne peut pas être optionnel, il est déjà optionnel.

 typealias Any = protocol<> 

Cette erreur se produit également si vous déclarez accidentellement une variable avec un type correspondant à son nom:

  var sectionGroup: sectionGroup? { ... } 

Ran dans cette erreur en raison d’un type générique étranger sur une fonction opérateur, par exemple

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

Dans mon cas, la suppression de résolu le problème.

Dans mon cas, j’avais déclaré une struct dans un func . Déplacer le struct au niveau de la classe a résolu le problème.

Maintenant que j’écris ceci, je me souviens avoir déjà eu des problèmes avec struct intérieur. C’était autre chose que la faute de segmentation (qui semble devenir notoire avec la version bêta de Swift 1.2). OMG Apple, que fais-tu là-bas?

Dans mon cas, cette erreur car j’utilise le nom de la classe pour la variable

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

Et cela corrige mon problème

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

Dans mon cas, cela s’est produit lorsque j’ai effectué une initialisation statique incorrecte dans un protocole. J’ai trouvé un moyen de contourner le problème, mais un compilateur ne devrait jamais produire une erreur de segmentation lors de la construction.

Il y a trois fichiers impliqués. Un protocole NamedSegues.swift, un TableViewController personnalisé qui implémente, entre autres, le protocole qui contient un rappel, un object TableViewCell personnalisé qui contient une référence à ce protocole pour appeler le rappel.

 //file1 import Foundation protocol NamedSegues { func executeSegueWithId(id: Ssortingng) -> 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: Ssortingng) ->() { 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: Ssortingng = "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. } } 

Je l’ai contourné en utilisant?

Dans le fichier de protocole, fichier1: supprime la déclaration de getDefault () Dans le fichier CustomController2: supprimez l’implémentation de getDefault. Dans le CustomCellView, fichier3:

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

Le compilateur aurait dû détecter cela et donner un message d’erreur au lieu de lancer une erreur de segmentation lors de la construction!

Il semblerait que le compilateur Swift 2 n’ait pas été tout à fait prêt pour les heures de grande écoute! Au cas où cela aiderait quelqu’un, je recevais une erreur de segmentation: 11 en raison d’une non-concordance avec le type de variable dans un en-tête de fermeture, en particulier dans une méthode Parse, PFQuery.query.findObjectsInBackgroundWithBlock .

Vous pouvez voir le problème plus en détail ici: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Comme @Fjohn l’a dit, c’était un problème lié au déballage d’une option pour moi (cassé à la fois dans Xcode 7.0 beta 6 et Xcode 7). Dans mon cas, je n’étais pas en train de déballer optionnel de l’option (ce qui m’a fait penser était le double dans le descripteur.

double optionnel causant une erreur de segmentation

Comme d’autres l’ont écrit ci-dessus, pour moi, cela s’est produit lorsque j’utilise une extension sur un protocole, mais la signature des méthodes du protocole ne correspond pas aux implémentations d’une extension.

Dans mon cas, j’avais ajouté un nouveau paramètre à l’implémentation (dans l’extension) mais j’ai oublié de l’append à la signature de la méthode dans le protocole.

dans mon cas, j’ai essayé d’append un paramètre de fonction après un paramètre variadic.

L’inversion de la séquence de parameters et la définition du paramètre variadic le dernier paramètre de la liste de parameters l’ont corrigé.

Cela se produit généralement lorsque le compilateur ne dispose pas d’assez d’informations (malgré ce que vous pensez) pour garantir / déterminer l’état d’une instruction ou d’une variable dans une instruction.

Par exemple, imaginons que vous ayez un dictionnaire de type [Ssortingng: Ssortingng] que vous remplissez avec des noms de ville en tant que clés et une liste séparée par des virgules de codes postaux / codes postaux correspondants.

Imaginez que quelque part dans votre code, vous souhaitiez mettre à jour la liste des codes correspondants:

 myDict[town] += newZipCode + "," 

Dans ce cas, le compilateur répondra avec une erreur de segmentation car la town peut ne pas figurer dans le dictionnaire et ne peut donc pas garantir que la déclaration ci-dessus aura une valeur valide.

Pour résoudre ce problème, vous devez stocker l’état actuel de myDict[town] dans une variable distincte, ce qui vous permet de gérer la casse de la key not in dict , puis de mettre à jour la valeur de la clé donnée:

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

Malheureusement, il n’est pas toujours facile de déterminer la cause profonde, alors j’espère que cet exemple simple vous aidera.

Swift 3.0 (Xcode 8.1) présente ce problème lorsqu’un protocole déclare une variable facultative et qu’un implémenteur implémente cette variable en tant qu’initialisée paresseuse.

Le bug est signalé ici: https://bugs.swift.org/browse/SR-1825

Xcode 8.2.

Ajout de l’ @nonobjc protocole @nonobjc dans l’extension provoquant des erreurs de segmentation. Déplacer l’ @nonobjc protocole @nonobjc dans l’implémentation de la classe.

Dans mon cas, le coupable était accidentellement en train de surcharger une fonction qui attendait un argument de tableau avec un avec un argument variadic :

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

Lorsque la super-classe l’avait défini en tant que tableau:

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

Pour moi, ce qui suit a causé une erreur de segmentation, tandis que le type est facultatif:

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

et cela l’a résolu:

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

J’ai eu cette erreur avec la signature de méthode suivante dans un UITableViewController personnalisé.

 func filterContentForSearchText(searchText: Ssortingng) 

changer pour:

 func filterContentForSearchText(searchText: Ssortingng!) 

résolu le problème.

J’ai eu le même problème dans une extension. Mon extension avait deux initialiseurs de commodité:

 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? Ssortingng) ?? "" // More properties... } 

Pour supprimer l’erreur, j’ai ajouté une carte de méthode d’instance (dictionnaire: NSDictionary) et l’erreur de segmentation a disparu.

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

Pour moi, le problème était que mes architectures n’étaient pas conformes à la norme. J’avais ajouté i386 ou quelque chose du genre, il suffit de le replacer dans l’archive de xcodeproject par défaut et il a bien été compilé.

J’ai eu le même problème dans un projet rapide. Le problème était une fonction qui aurait dû retourner un object, mais n’y avait pas de retour. Ce type d’erreur était signalé lors de l’édition avec Obj-C. Il semble que ce ne soit pas le cas dans Swift.