泄漏悬空越界

共 18 题
#

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 允许任意多个可变借用