【问题标题】:Modify `String`s via unsafe_ functions - Any caveat?通过 unsafe_ 函数修改字符串 - 有什么警告吗?
【发布时间】:2022-10-04 22:07:20
【问题描述】:
julia> x = "abcdefg"
"abcdefg"

julia> GC.@preserve x unsafe_store!(pointer(x), 'A', 1)
Ptr{UInt8} @0x0000000118532160

julia> x
"Abcdefg"

我知道直接编辑应该是不可变类型的 String 有点疯狂。

但是我想问一下为什么它很危险,在这种情况下会导致致命的错误。

【问题讨论】:

    标签: julia


    【解决方案1】:

    在每个假设字符串不变性的地方。例如。

    julia> x = "abcdefg"
    "abcdefg"
    
    julia> s = Set([x])
    Set{String} with 1 element:
      "abcdefg"
    
    julia> GC.@preserve x unsafe_store!(pointer(x), 'A', 1)
    Ptr{UInt8} @0x000000000a3043a8
    
    julia> push!(s, x)
    Set{String} with 2 elements:
      "Abcdefg"
      "Abcdefg"
    

    这只是一个快速的问题。但是打破这种不变量通常可能会产生不可预测的后果,因为代码可能(并且将)假设它被满足。

    【讨论】:

      【解决方案2】:

      实际上,这可能会起作用,但从理论上讲,许多事情都允许出错

      1. 未发生更新,因为编译器决定将更新后发生的计算移至更新前
      2. 其他一些字符串被修改,因为编译器在两个字符串之间共享内存。
      3. 你被一个可怕的恐怖诅咒。

        其中,1 最有可能出错。

      【讨论】:

        猜你喜欢
        • 2011-07-17
        • 1970-01-01
        • 2013-09-27
        • 2013-12-27
        • 2018-04-01
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 2019-11-12
        相关资源
        最近更新 更多