# 1. Valgrind memcheck 检测 UAF 与越界的影子内存设计? A memcheck 运行速度与原生一样快 B memcheck 不需要影子内存 C memcheck 只检测内存泄漏,不检测越界 D memcheck 用影子内存记录每个字节的已定义/已分配状态,插桩校验以检测 UAF 和越界 ✓ 正确答案
# 2. buffer overflow(栈溢出、堆溢出)的差异? A 堆溢出只发生在栈上 B 两者都只覆盖返回地址 C 栈溢出覆盖返回地址,堆溢出覆盖堆块元数据或相邻对象 ✓ 正确答案 D 栈溢出与堆溢出利用方式完全相同
# 3. double free 的危害与 glibc 检测机制? A glibc 能完全阻止所有 double free B double free 无任何危害 C double free 破坏 free list,可被利用;glibc 用 tcache key 等机制检测但可被绕过 ✓ 正确答案 D double free 只影响单线程
# 4. memory leak(内存泄漏)的定义与典型场景? A 泄漏指分配后失去引用或忘记释放,内存持续增长 ✓ 正确答案 B 泄漏只发生在 GC 语言 C 泄漏不会影响程序运行 D 泄漏指内存访问越界
# 5. 为何 C/C++ 不自动内存管理而 Rust 通过所有权避免? A Rust 使用 GC 自动回收内存 B Rust 通过编译期的所有权/借用检查保证内存安全,且零运行时开销 ✓ 正确答案 C C/C++ 不会产生内存错误 D Rust 所有权检查在运行时进行
# 6. ASan 如何通过 quarantine(隔离区)检测 use-after-free,为什么释放后的内存不立即归还给分配器? A 释放后内存进入隔离区并保持已释放标记,期间访问会被拦截,延迟归还以扩大检测窗口 ✓ 正确答案 B 释放后立即归还给分配器复用 C quarantine 用于检测内存泄漏 D ASan 不检测 UAF
# 7. Rust Box::leak 故意泄漏的实现? A Box::leak 用于复制数据 B Box::leak 会让内存自动回收 C Box::leak 把 Box 的所有权转换为 'static 引用,放弃自动释放,是有意泄漏 ✓ 正确答案 D Box::leak 返回的是栈上引用
# 8. use-after-free(UAF)漏洞与 CVE-2022-0184 等示例? A UAF 只影响用户态 B UAF 指对象释放后仍被访问;CVE-2022-0184 是内核 legacy_parse_param 的堆越界写漏洞,此类内存安全漏洞可导致提权/逃逸 ✓ 正确答案 C UAF 不会造成安全问题 D CVE-2022-0184 是 CPU 微码漏洞,与内核内存安全无关
# 9. ASan(AddressSanitizer)检测 out-of-bounds 原理? A ASan 只检测栈越界 B ASan 用定时器检测越界 C 红区可以随便访问 D 对象周围填充红区并在影子内存中标记为 poisoned,插桩校验可拦截越界访问 ✓ 正确答案
# 10. dangling pointer(悬空指针)的成因与 UB 表现? A 悬空指针总是安全 B 悬空指针指向已释放/失效内存,访问它是 UB,可能崩溃或读到垃圾数据 ✓ 正确答案 C 释放后指针自动置空 D 悬空指针只存在于栈上
# 11. 内存泄漏的检测,valgrind、ASan 与 heap profile 如何选择? A Valgrind/LSan 精确定位泄漏点,heap profile 通过采样统计分配热点,两者互补 ✓ 正确答案 B heap profile 能精确报告每个泄漏点 C Valgrind 比原生运行更快 D 只有一种检测方法
# 12. AddressSanitizer 的原理,影子内存与红区检测如何工作? A ASan 不检测越界 B ASan 用硬件虚拟机检测 C 用影子内存编码可访问性,插桩校验,红区标记越界候选 ✓ 正确答案 D ASan 只检测栈溢出
# 13. LeakSanitizer 的原理,基于栈回溯如何定位泄漏点,与 Valgrind 的 leak-check 在性能与精度上的差异如何? A LSan 基于栈回溯定位泄漏点且快,Valgrind 全插桩跟踪但慢 ✓ 正确答案 B LSan 比 Valgrind 慢 C 两者都无需重新编译 D LSan 无法定位泄漏分配点
# 14. Rust 中 Rc/Arc 的循环引用为何造成内存泄漏,Weak 引用如何打破环?与 C++ shared_ptr 循环引用问题对比? A 只有 C++ 有循环引用问题 B 循环引用不会泄漏 C Rust 编译器自动修复循环引用,无需 Weak D 循环引用导致引用计数永不归零而泄漏,用 Weak/weak_ptr 打破环 ✓ 正确答案
# 15. mprotect() + electric fence 在堆溢出检测中的应用? A Electric Fence 无法检测越界 B Electric Fence 内存开销极小 C mprotect 用于分配内存 D 为每个对象分配整页并用 mprotect 保护相邻页,越界访问触发 SIGSEGV ✓ 正确答案
# 16. 悬空指针与 use-after-free,生命周期管理的工程手段有哪些? A 释放后置空、用智能指针、明确所有权与生命周期,并配合检测工具 ✓ 正确答案 B 只要小心就永远不会出错 C 智能指针不能解决悬空指针 D 检测工具能根治所有问题
# 17. 引用计数与智能指针,资源生命周期如何管理? A shared_ptr/Arc 用引用计数共享所有权,weak_ptr/Weak 不增加计数,可打破循环 ✓ 正确答案 B unique_ptr 可以共享所有权 C 弱引用会增加引用计数 D 智能指针无法自动释放
# 18. 内存安全的语言机制,所有权与借用检查如何工作? A 所有权唯一、借用分可变/不可变、生命周期保证,全部在编译期检查且零运行时开销 ✓ 正确答案 B Rust 用 GC 保证内存安全 C 借用检查在运行时进行 D Rust 允许任意多个可变借用