我遇到了一个问题,试图在IBM's Swift Sandbox上运行代码导致某种内部超时。
Swift Ver. 3.0.1 (Release) Platform: Linux (x86_64) Error running code: WARNING: Your kernel does not support swap limit capabilities, memory limited without swap. /swiftfiles/doit.sh: line 51: 42 Illegal instruction timeout ${TIMEOUT} .build/debug/TempCode
有问题的代码是解码大型Base64编码字符串:
let base64EncodedInput = [really really long string]
let inputData = Data(base64Encoded: base64EncodedInput)!
let inputDecodedString = String(data: inputData, encoding: .utf8)!
let rowArray = inputDecodedString.components(separatedBy: "\n")
您可以看到完整的数据字符串并在线运行代码here。
我是否最大限度地分配了运行我的Swift流程的时间?什么是超时?
答案 0 :(得分:1)
为了回答标题中的问题,我们实现了10秒的硬超时,但是如果内存耗尽或堆栈溢出,代码可能会被杀死更快。但这并不是你在这里看到的问题。
经过一番调查后,我们确定在您的沙箱链接中创建了非常大的字符串的base 64编码服务使用\r\n
代替换行符\n
。由于Foundation中的错误,使用let rowArray = inputDecodedString.components(separatedBy: "\n")
时会导致错误。如果您改为使用let rowArray = inputDecodedString.components(separatedBy: "\r\n")
,则应该会看到问题消失。在此期间,我们将向基金会提出问题。
您看到timeout
的原因是因为我们返回了一条不太好的错误消息。行timeout ${TIMEOUT} .build/debug/TempCode
是我们执行沙盒用户代码的一部分,当该行失败时,我们将其作为错误消息的一部分返回。我们将在未来处理一个不太混乱的错误消息。
编辑:事实证明这是一个已知的错误。 https://bugs.swift.org/browse/SR-2483