整理下能把Swift编译器和Xcode弄崩溃的代码
最近在学Swift,然后使用的过程中发现这个编译器还是不够成熟,经常有一些代码能把Xcode的Playground甚至是Swift编译器给弄崩溃。我这边环境是Xcode 6 beta 2
代码1
func read(inout i : Int32 ) -> LogicValue
{
return true;
}
var i : Int32
while read(&i) {print(i)}
在Swift的Repl里执行这个直接Segmentation Fault: 11了。
代码2
func test() -> Int
{
var b = 11
struct TTT
{
var i = b
}
var i = TTT()
return i.i;
}
代码分析
按照Swift的Grammar规定,函数内部是由多个statement组成的,而statement里可以包括类型定义,这里在类型TTT里引用了test里的一个局部变量,而编译器会将i初始化用的b当作全局变量来查找,编译器检查符号引用的pass发现是没问题的,因为这是在上一层scope里定义的,但是代码生成的时候就出问题了,因为代码生成的时候类型只能引用上层的全局变量,而不能引用局部变量,编译器报错:
Global is external, but doesn't have external or weak linkage!
i8* ()* @_TFF11lldb_expr_04testFT_SiaL_1bSi
invalid linkage type for function declaration
i8* ()* @_TFF11lldb_expr_04testFT_SiaL_1bSi
LLVM ERROR: Broken module found, compilation aborted!
Assertion failed: (err == 0), function ~Mutex, file /SourceCache/lldb_KLONDIKE/lldb_KLONDIKE-320.3.100/source/Host/common/Mutex.cpp, line 246.
Abort trap: 6
代码3
struct T{};var T = 3;
这个错误可出在定义一个同一作用域内与自定义类型同名的变量上,对于typealias定义的别名则不出错。
编译器出错信息:
lldb(50259,0x1103d3000) malloc: *** error for object 0x7ff9bcd14f32: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
代码4
Int.self.dynamicType
对于别的类型,使用.self.dynamicType都会出同样的错误
编译器出错信息:
Segmentation fault: 11
Last modified on 2014-07-23