swiftlang/swift

[SR-3316] "Script mode" globals have internal visibility and can be accessed before initialization from other files

Open

#45,904 创建于 2016年12月2日

在 GitHub 查看
 (1 评论) (0 反应) (1 负责人)Swift (10,719 fork)batch import
access controlcompilergood first issuescript modeswift evolution proposal needed

仓库指标

Star
 (69,989 star)
PR 合并指标
 (平均合并 8天 17小时) (30 天内合并 510 个 PR)

描述

Previous ID SR-3316
Radar None
Original Reporter @jckarter
Type Bug
Votes 0
Component/s Compiler
Labels Bug, StarterProposal
Assignee None
Priority Medium

md5: e092a51eda538e02ab484391d0b1b1a5

Issue Description:

Variables declared in a script default to internal visibility, like other global declarations, but this is problematic, because semantically they behave more like local variables. Another file can access the global before its initializer has even run:

// main.swift
class C {}
var x: C
foo()
x = C()
// foo.swift
func foo() {
  print(x) // loads garbage from `x` from main.swift
}

In a future version of Swift, script globals should be changed to be private by default. We could possibly also allow a script global to be declared with explicit access control, which would make it visible to other files but would also have to make the variable behave more like a library global, with a dispatch_once-d initializer, e.g.:

// main.swift
var x = 42 // private, eagerly initialized
private var y = 17 // private, initialized on demand
internal var z = 38 // internal, initialized on demand

贡献者指南