forked from alangpierce/go-forceexport
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmemory_fallback.go
More file actions
51 lines (42 loc) · 1.14 KB
/
memory_fallback.go
File metadata and controls
51 lines (42 loc) · 1.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//go:build !windows && !linux && !darwin && !unix
package forceexport
import (
"unsafe"
)
// IsAddrReadable fallback实现,用于不支持的平台
// 使用保守的地址范围检查,避免直接内存访问
func IsAddrReadable(addr uintptr, size int) bool {
if addr == 0 || size <= 0 {
return false
}
// 基本范围检查
if addr < 0x1000 || addr == 0xffffffffffffffff {
return false
}
// 检查溢出
if addr+uintptr(size) < addr {
return false
}
// 非常保守的地址检查,只允许明显安全的地址范围
return fallbackAddressCheck(addr, size)
}
// 回退方案的地址检查
func fallbackAddressCheck(addr uintptr, size int) bool {
if unsafe.Sizeof(uintptr(0)) == 8 { // 64位系统
// 只允许非常安全的地址范围
// 典型程序的代码段和数据段
if addr >= 0x400000 && addr <= 0x10000000 {
return true
}
// 典型的堆地址范围
if addr >= 0x20000000 && addr <= 0x80000000 {
return true
}
} else { // 32位系统
// 32位系统的安全范围
if addr >= 0x10000 && addr <= 0x40000000 {
return true
}
}
return false
}