 Comprehensive Rust(繁体中文)unsafe: fn main() { let mut s = String::from("careful!"); let r1 = &mut s as *mut String; let r2 = r1 as *const String; // Safe because r1 and r2 were obtained from references and so are // guaranteed pointers. unsafe { println!("r1 is: {}", *r1); *r1 = String::from("uhoh"); println!("r2 is: {}", *r2); } // NOT SAFE. DO NOT DO THIS. /* let r3: &String = unsafe { &*r1 }; drop(s); println!("r3 is: {}" the memory. In most cases the pointer must also be properly aligned. 「NOT SAFE」部分提供了常見的 UB 錯誤示例:*r1 具有'static 生命週期,因此 r3 具有&'static String 這個型別,從而會超過 s。從指標建立參照需要「格外謹慎」__。 30.3 可變的靜態變數 您可以放心讀取不可變的靜態變數:0 码力 | 358 页 | 1.41 MB | 10 月前3 Comprehensive Rust(繁体中文)unsafe: fn main() { let mut s = String::from("careful!"); let r1 = &mut s as *mut String; let r2 = r1 as *const String; // Safe because r1 and r2 were obtained from references and so are // guaranteed pointers. unsafe { println!("r1 is: {}", *r1); *r1 = String::from("uhoh"); println!("r2 is: {}", *r2); } // NOT SAFE. DO NOT DO THIS. /* let r3: &String = unsafe { &*r1 }; drop(s); println!("r3 is: {}" the memory. In most cases the pointer must also be properly aligned. 「NOT SAFE」部分提供了常見的 UB 錯誤示例:*r1 具有'static 生命週期,因此 r3 具有&'static String 這個型別,從而會超過 s。從指標建立參照需要「格外謹慎」__。 30.3 可變的靜態變數 您可以放心讀取不可變的靜態變數:0 码力 | 358 页 | 1.41 MB | 10 月前3
 julia 1.10.10s4 r1 = Ref(s1)CHAPTER 101. DOCUMENTATION OF JULIA’S INTERNALS 1607 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 1692 页 | 6.34 MB | 3 月前3 julia 1.10.10s4 r1 = Ref(s1)CHAPTER 101. DOCUMENTATION OF JULIA’S INTERNALS 1607 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 1692 页 | 6.34 MB | 3 月前3
 Julia 1.10.9s4 r1 = Ref(s1)CHAPTER 101. DOCUMENTATION OF JULIA’S INTERNALS 1607 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 1692 页 | 6.34 MB | 3 月前3 Julia 1.10.9s4 r1 = Ref(s1)CHAPTER 101. DOCUMENTATION OF JULIA’S INTERNALS 1607 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 1692 页 | 6.34 MB | 3 月前3
 julia 1.13.0 DEVcode_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2058 页 | 7.45 MB | 3 月前3 julia 1.13.0 DEVcode_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2058 页 | 7.45 MB | 3 月前3
 Julia 1.12.0 RC1code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2057 页 | 7.44 MB | 3 月前3 Julia 1.12.0 RC1code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2057 页 | 7.44 MB | 3 月前3
 Julia 1.12.0 Beta4code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2057 页 | 7.44 MB | 3 月前3 Julia 1.12.0 Beta4code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2057 页 | 7.44 MB | 3 月前3
 Julia 1.12.0 Beta3code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2057 页 | 7.44 MB | 3 月前3 Julia 1.12.0 Beta3code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2057 页 | 7.44 MB | 3 月前3
 julia 1.12.0 beta1code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2047 页 | 7.41 MB | 3 月前3 julia 1.12.0 beta1code_escapes((Base.RefValue{String},String,String,)) do r1, s2, s3 r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # `r1` may escape end s2 = get′(r2) # `r2` doesn't doesn't escape s3 = get′(r3) # `r3` doesn't escape return s2, s3, s4 end #2(X r1::Base.RefValue{String}, ✓ s2::String, ✓ s3::String) in Main at REPL[7]:2 ✓′ 1 ── %1 = %new(Base.RefValue{String}, _3)::Base code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2047 页 | 7.41 MB | 3 月前3
 Julia 1.11.4String,String)) do s1, s2, s3, s4 r1 = Ref(s1) r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2` code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2007 页 | 6.73 MB | 3 月前3 Julia 1.11.4String,String)) do s1, s2, s3, s4 r1 = Ref(s1) r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2` code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2007 页 | 6.73 MB | 3 月前3
 Julia 1.11.5 DocumentationString,String)) do s1, s2, s3, s4 r1 = Ref(s1) r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2` code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2007 页 | 6.73 MB | 3 月前3 Julia 1.11.5 DocumentationString,String)) do s1, s2, s3, s4 r1 = Ref(s1) r2 = Ref(s2) r3 = SafeRef(s3) try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2` code_escapes((String,String)) do s1, s2 r1 = Ref(s1) r2 = Ref(s2) local ret try s1 = get′(r1) ret = sizeof(s1) catch err global GV = err # will definitely escape `r1` end s2 = get′(r2) # still `r2`0 码力 | 2007 页 | 6.73 MB | 3 月前3
共 13 条
- 1
- 2













