技能 memory-safety-patterns
🛡️

memory-safety-patterns

安全

实现内存安全模式

也可从以下获取: wshobson

使用 Rust、C++ 和 C 中经过验证的内存安全模式编写无崩溃的安全代码。通过 RAII、所有权模型和智能指针防止内存泄漏、悬垂引用和缓冲区溢出。

支持: Claude Codex Code(CC)
🥉 75 青铜
1

下载技能 ZIP

2

在 Claude 中上传

前往 设置 → 功能 → 技能 → 上传技能

3

开启并开始使用

测试它

正在使用“memory-safety-patterns”。 如何在 C++ 中打开文件时防止内存泄漏?

预期结果:

使用 RAII 与智能文件包装类或 std::fstream。文件会在对象销毁时自动关闭,即使发生异常也是如此。示例:std::fstream file("data.txt"); - 析构函数会自动处理清理。

正在使用“memory-safety-patterns”。 Rust 中 Box、Rc 和 Arc 有什么区别?

预期结果:

Box<T> 用于带堆分配的单所有权。Rc<T> 用于共享所有权(单线程)- 克隆时递增引用计数。Arc<T> 用于跨线程的原子共享所有权 - 线程安全的引用计数。

正在使用“memory-safety-patterns”。 如何安全地处理边界检查?

预期结果:

在 C++ 中,使用 std::vector::at() 会抛出 std::out_of_range,或使用 std::span 进行数组视图。在 Rust 中,使用 [] 索引在越界时会 panic,而 .get() 返回 Option 以安全处理。优先使用迭代器以避免手动边界检查。

安全审计

安全
v1 • 2/25/2026

All 56 static findings are false positives. The skill contains only documentation and code examples for memory safety patterns. Thread spawning (thread::spawn) was misidentified as process spawning. Markdown backticks for code formatting were misidentified as shell execution. Documentation URLs and debugging tool references are legitimate educational content.

2
已扫描文件
640
分析行数
0
发现项
1
审计总数
未发现安全问题
审计者: claude

质量评分

38
架构
100
可维护性
87
内容
50
社区
100
安全
100
规范符合性

你能构建什么

系统编程

编写不存在内存损坏漏洞的操作系统、驱动程序或嵌入式软件。

安全关键应用

构建内存安全至关重要的应用:密码学、网络服务、文件处理。

遗留代码现代化

在重构 C/C++ 代码库时应用内存安全模式,减少错误并提高可靠性。

试试这些提示

基础 RAII 实现
展示如何在 C++ 中为文件句柄类实现 RAII 模式。包含正确的复制/移动语义,并确保文件在对象超出作用域时自动关闭。
Rust 所有权示例
解释 Rust 所有权如何防止悬垂引用错误。展示一个包含引用的结构体示例,包括生命周期注解以及何时使用 Box、Rc 和 Arc。
C 资源管理
编写一个 C 函数来打开文件、分配内存并处理数据。使用 goto-cleanup 模式确保在出错时所有资源都被正确释放。
线程安全计数器
在 C++ 中使用原子操作和互斥锁实现线程安全计数器,在 Rust 中使用 Arc 和 Mutex 实现。展示每种语言如何防止数据竞争。

最佳实践

  • 优先使用 RAII 和智能指针而非手动内存管理,以确保自动清理
  • 使用 Rust 中的借用检查器而不是与它对抗 - 它能防止真正的错误
  • 在开发过程中运行 AddressSanitizer 和 Valgrind 以尽早捕获内存问题

避免

  • 在 C++ 中使用原始指针而非智能指针 - 导致泄漏和悬垂指针
  • 忽略关于悬垂引用的编译器警告 - 它们指示真正的错误
  • 在 Rust 中使用 unsafe 块而未说明原因并将它们与安全代码隔离

常见问题

什么是 RAII,为什么它很重要?
RAII(资源获取即初始化)将资源生命周期与对象生命周期绑定。当对象超出作用域时,其析构函数运行并释放资源。这可以防止泄漏并确保即使在发生异常时也能进行清理。
Rust 如何防止内存错误?
Rust 使用一个所有权系统,其中每个值恰好有一个所有者。当所有者超出作用域时,该值会被丢弃。借用检查器在编译时执行这些规则,防止悬垂引用、重复释放和数据竞争。
何时应该在 C++ 中使用智能指针?
对单所有权使用 unique_ptr(默认选择)。当代码的多个部分需要拥有同一对象时使用 shared_ptr。使用 weak_ptr 来打破 shared_ptr 图中的循环。除非与 C 代码交互,否则避免使用原始指针。
什么是 C 中的 goto-cleanup 模式?
一种模式,所有资源分配发生在开始,单个清理标签按相反顺序释放所有内容。这确保即使在函数的任何位置发生错误也能释放资源,避免泄漏。
如何在 Rust 和 C++ 之间选择内存安全方案?
Rust 通过所有权和借用提供更强的编译时保证。C++ 需要更多纪律但提供更多控制。对于内存安全至关重要的新项目选择 Rust。当需要与现有 C++ 代码库交互或需要最大性能时使用 C++。
哪些调试工具有助于捕获内存问题?
AddressSanitizer(ASan)捕获悬垂引用、泄漏和缓冲区溢出。Valgrind 检测 C/C++ 中的内存错误。Rust Miri 检测未定义行为。ThreadSanitizer 发现数据竞争。在开发和 CI 管道中使用这些工具。