重叠访问"结果",但修改需要独占访问; 考虑复制到xcode 10中的局部变量

Hem*_*ack 8 ios swift

open static func PBKDF2(_ password: String, salt: Data,
                                 prf: PRFAlg, rounds: UInt32) throws -> Data {

            var result = Data(count:prf.cc.digestLength)
            let passwData = password.data(using: String.Encoding.utf8)!
            let status = result.withUnsafeMutableBytes {
                (passwDataBytes: UnsafeMutablePointer<UInt8>) -> CCCryptorStatus in
                return CCKeyDerivationPBKDF!(PBKDFAlgorithm.pbkdf2.rawValue,
                                             (passwData as NSData).bytes, passwData.count,
                                             (salt as NSData).bytes, salt.count,
                                             prf.rawValue, rounds,
                                             passwDataBytes, result.count)
            }
            guard status == noErr else { throw CCError(status) }

            return result
        }
Run Code Online (Sandbox Code Playgroud)

result.withUnsafeMutableBytes在Xcode 10中给出错误,在Xcode 9中它是一个警告.

Mar*_*n R 18

这是SE-0176强制独占访问内存的结果,它在Swift 4中实现,在Swift 4.2中更严格.

解决方案是将计数分配给单独的变量:

let count = result.count
let status = result.withUnsafeMutableBytes {
    (passwDataBytes: UnsafeMutablePointer<UInt8>) -> CCCryptorStatus in
        return CCKeyDerivationPBKDF(..., count)
}
Run Code Online (Sandbox Code Playgroud)

或捕获捕获列表中的计数:

let status = result.withUnsafeMutableBytes { [ count = result.count ]
    (passwDataBytes: UnsafeMutablePointer<UInt8>) -> CCCryptorStatus in
        return CCKeyDerivationPBKDF(..., count)
}
Run Code Online (Sandbox Code Playgroud)

另请参阅Swift论坛中withUnsafeMutableBytes的重叠访问警告

hamishknight:

withUnsafeMutableBytes(_ :)是Data上的一种变异方法,因此它需要在调用期间对数据进行写访问.通过访问闭包中的data.count,您将开始一个与当前写访问冲突的新数据读取.

Joe_Groff:

您还可以在闭包捕获列表中捕获数据副本或其计数:...

获取捕获列表,并在形成闭包时,在独占访问开始之前通过值捕获结果,从而避免重叠访问.

并在相应的拉取请求中发表此评论:

这里适当的修复是复制闭包外部的缓冲区计数,并将其传递给inet_ntop().