Ошибка сегментации компилятора Swift при построении - программирование
Подтвердить что ты не робот

Ошибка сегментации компилятора Swift при построении

Добавление (удобное) вычисляемое свойство height в UIView в моем файле UIViewExtension.swift приводит к сбою компилятора Swift... Что здесь может быть неправильным?

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

Если для взлома требуется дополнительная информация, просто напишите комментарий. Спасибо!

Edit:

Вот связанный .xcodeproj, который возвращает эту ошибку компилятора вопроса. Загрузить здесь

4b9b3361

Ответ 1

У меня была эта ошибка, потому что я делал это:

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

}

вместо

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

}

поэтому я думаю, что необязательно не распаковано, если условие может вызвать эту ошибку

Ответ 2

Когда вы запускаете segfault компилятора в Swift, вы не получаете удобный номер строки и сообщение об ошибке. Здесь вы можете отследить проблему:

  • Создайте новый файл с именем SegFaultDebugger.swift в вашем проекте.
  • В этом новом файле определите расширение класса, создающего проблемы.
  • Переместить группу методов из основного файла в SegFaultDebugger.swift.
  • Compile.

В этот момент происходит одна из трех вещей:

  • Вы все равно получите segfault в исходном файле. Переместите методы из SegFaultDebugger.swift обратно в исходный файл и переместите другой набор методов в SegFaultDebugger.swift. Повторите
  • Вы получаете segfault в SegFaultDebugger.swift: Отлично! Теперь используйте бинарный поиск, чтобы привязать segfault до определенного метода, пока не сможете выяснить, какая конструкция вызывает его.
  • Вы получаете значимые ошибки компилятора: Отлично! Исправьте ошибки. Как только все скомпилируется, переместите свои методы обратно в исходный файл.

Ответ 3

Я получил эту ошибку, расширяя один из моих протоколов и ошибочный и необязательный аргумент типа.

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

    func someProtocolFunction(someProtocolVariable: String)
}

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

Разница в аргументах функции String в прототипе и String? в расширении вызвала ошибку сегментации 11.

Ответ 4

У меня тоже была эта ошибка, и я исправил ее так:

Проверьте свой проект и выясните, какие файлы используются дважды, и удалите его, или удалите и снова добавьте их.

Ошибки в моем Xcode:

: 0: error: имя файла "AttributedString.swift" используется дважды: '/Users/.../CNJOB/CNJOB/AttributedString.swift' и /Пользователей/.../CNJOB/CNJOB/AttributedString.swift

: 0: note: имена файлов используются, чтобы различать личные объявления с тем же именем

: 0: ошибка: имя файла "APIClient.swift" используется дважды: '/Users/.../CNJOB/CNJOB/APIClient.swift' и /Пользователей/.../CNJOB/CNJOB/APIClient.swift

: 0: note: имена файлов используются, чтобы различать личные объявления с тем же именем

Команда/Приложения/Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc не удалось с кодом выхода 1

Ответ 5

В Xcode 7 вы можете щелкнуть по ошибке в Debug Navigator, и вам будет показан расширенный вид сбоев. Нажатие на кнопку гамбургера справа расширяет эту ошибку, и если вы прокрутите весь путь до нижней части расширенного сообщения об ошибке, вы увидите, откуда оно взялось.

enter image description here

Для меня у меня были две ошибки ошибок сегментации. На картинке выше, первая - это то, как она выглядит, когда рухнула, вторая - когда вы расширяете кнопку гамбургера. В самом низу расширенного серого окна вы увидите сообщение о том, где произошел сбой компилятора.

Обратите внимание, однако, что сообщение об ошибке может время от времени быть недостаточно информативным, поэтому, пока он сообщает вам, где он разбился, он не всегда говорит, почему и как его исправить. Избавиться от этой ошибки все еще очень вопрос догадок.

Ответ 6

Ive обнаружил простую обходную проблему, пока проблема не будет исправлена ​​в будущей сборке Xcode/Swift:

  • Просто разместите все расширения, в результате чего проблема в файле .swift будет использоваться.

В приведенном проекте примера поместите содержимое UIViewExtension.swift и CALayerExtension.swift выше AppDelegate.swift

Надеюсь, это может заставить нас написать рабочий код Swift до тех пор, пока проблемы не будут устранены.

Ответ 7

Как и для меня, добавление private в статический var fixed clang crash:

private static var taskId = 0

Ответ 8

У меня была ошибка сегментации компилятора в инструкции вроде этого:

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

Я только что сделал инструкцию if-else, и она работает.

Ответ 9

У вас также может возникнуть эта проблема, если вы объявите условие с развернутым Bool как свойство

Ответ 10

В моем случае эта ошибка, потому что я использую имя класса для переменной

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

И это исправляет мою проблему

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

Ответ 11

В моем случае неупорядоченный двоеточие во время строчной интерполяции разбил мой (XCode 6.1.1).

Пример:

println("\(value1:value2)") 

когда я хотел сделать:

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

Ответ 12

Эта ошибка произошла со мной, когда я попытался переопределить слабую переменную из родительского класса.

В базовом классе:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

Производный класс:

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

    }

Ошибка исчезла, когда я удалил =nil из производного класса.

Ответ 13

Сегодня я поймаю какое-то исключение.

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

и это решило это:

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

Поскольку тип "Любой" - это событие любого типа "nil", "AnyObject", необязательный,...:) Он не может быть дополнительным, он уже является необязательным.

typealias Any = protocol<>

Ответ 14

Эта ошибка также возникает, если вы случайно объявляете переменную с типом, соответствующим его имени:

    var sectionGroup: sectionGroup? { ... }

Ответ 15

Ran в эту ошибку из-за постороннего родового типа на операторную функцию, например

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

В моем случае удаление <T> разрешило проблему.

Ответ 16

В моем случае я объявил struct внутри a func. Перемещение уровня struct в класс решило проблему.

Теперь, когда я пишу это, я помню, что раньше у меня были проблемы с struct внутри func. Это было нечто иное, чем ошибка сегментации (которая, похоже, стала известной с бета-версией Swift 1.2). OMG Apple, что вы там делаете?

Ответ 17

В моем случае это произошло, когда я сделал неправильную статическую инициализацию в протоколе. Я нашел способ обойти, но компилятор никогда не должен создавать ошибку сегментации при построении.

Имеется три файла. Протокол NamedSegues.swift, настраиваемый TableViewController, который, среди прочего, реализует протокол, который содержит обратный вызов, пользовательский TableViewCell, который ссылается на этот протокол для вызова обратного вызова.

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

Я обошел его, используя?

В файле протокола file1: удалить объявление getDefault() В файле CustomController file2: удалите реализацию getDefault. В CustomCellView файл3:

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

Компилятор должен был поймать это и дать некоторое сообщение об ошибке вместо того, чтобы бросать ошибку сегментации во время сборки!

Ответ 18

Кажется, что компилятор Swift 2, возможно, не был готов к прайм-тайму! В случае, если это помогает кому-либо, я получаю ошибку сегментации: 11 из-за несоответствия с типом переменной в заголовке закрытия, особенно в методе Parse, PFQuery.query.findObjectsInBackgroundWithBlock.

Вы можете увидеть проблему более подробно здесь: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280

Ответ 19

Как сказал @Fjohn, это была проблема, связанная с распаковкой необязательного для меня (сломалась как в Xcode 7.0 beta 6, так и в Xcode 7). В моем случае я не разворачивал необязательный необязательный (то, что отталкивало меня, было двойным в дескрипторе. Использование , если разрешить решить проблему

double optional, вызывающий ошибку сегментации

Ответ 20

Как писали выше, для меня это произошло, когда я использую расширение по протоколу, но сигнатура методов в протоколе не соответствует реализациям в расширении.

В моем случае я добавил новый параметр к реализации (в расширении), но забыл также добавить его к сигнатуре метода в протоколе.

Ответ 21

в моем случае, я попытался добавить параметр функции после вариационного параметра.

Повторяя последовательность параметров и делая переменный параметр, последний параметр в списке параметров зафиксировал его.

Ответ 22

Это обычно происходит, когда компилятор не имеет достаточной информации (несмотря на то, что вы думаете), чтобы гарантировать/определить состояние оператора или переменной внутри оператора.

Например, представьте, что у вас есть словарь типа [String: String], который вы заполняете названиями городов в качестве ключей и разделенным запятыми списком соответствующих почтовых индексов/почтовых кодов.

Представьте, что где-то в коде вы хотите обновить список соответствующих кодов:

myDict[town] += newZipCode + ","

В этом случае компилятор будет реагировать с ошибкой сегментации, поскольку town может не быть в словаре, и поэтому он не может гарантировать, что вышеуказанный оператор будет иметь действительное значение.

Чтобы решить эту проблему, вы должны сохранить текущее состояние myDict[town] в отдельной переменной, позволяющую обрабатывать случай key not in dict, а затем обновлять значение для данного ключа:

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

К сожалению, не всегда легко определить основную причину, поэтому я надеюсь, что этот простой пример поможет.

Ответ 23

Swift 3.0 (Xcode 8.1) демонстрирует эту проблему, когда протокол объявляет необязательную переменную, а реализация реализует эту переменную как ленивую инициализированную.

Сообщается об ошибке: https://bugs.swift.org/browse/SR-1825

Ответ 24

Xcode 8.2.

Добавление реализации протокола @nonobjc в расширение, вызывающее ошибки сегментации. Переместить реализацию протокола @nonobjc в реализацию класса.

Ответ 25

В моем случае виновник случайно перегрузил функцию, ожидающую аргумент массива с аргументом с переменным аргументом:

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

Когда суперкласс определил его как массив:

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

Ответ 26

Для меня следующее вызвало segfault, а type является необязательным:

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

и это решило это:

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

Ответ 27

Я получил эту ошибку со следующей сигнатурой метода в пользовательском UITableViewController.

func filterContentForSearchText(searchText: String)

изменяется на:

func filterContentForSearchText(searchText: String!)

исправлена ​​проблема.

Ответ 28

У меня была такая же проблема в расширении. У моего расширения были два инициализатора удобства:

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

Чтобы избавиться от ошибки, я добавил карту методов экземпляра (словарь: NSDictionary), и ошибка ошибки сегментации исчезла.

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

Ответ 29

Для меня проблема заключалась в том, что мои архитектуры не соответствуют стандарту. Я добавил i386 или что-то еще, просто вернул его в стандартную арку xcodeproject и скомпилировал ее.

Ответ 30

У меня была такая же проблема в быстром проекте. Проблема была функцией, которая должна была вернуть объект, но в нем не было возврата. Подобная ошибка использовалась для сообщения с помощью Obj-C. Кажется, что t не относится к Swift.