【Rust安全编码黄金法则】:如何避免80%的常见漏洞?

第一章:Rust安全编码的核心理念

Rust 语言的设计哲学根植于“内存安全无需垃圾回收”的理念,其核心目标是在不牺牲性能的前提下杜绝空指针、缓冲区溢出、数据竞争等常见安全漏洞。这一目标的实现依赖于所有权(Ownership)、借用(Borrowing)和生命周期(Lifetimes)三大机制,它们在编译期由编译器严格检查,从根本上阻断了大量运行时错误。

所有权与内存管理

Rust 中每个值都有一个唯一的拥有者,当拥有者离开作用域时,该值将被自动释放。这种机制避免了手动内存管理的复杂性,同时防止了内存泄漏。
// 示例:所有权转移
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权转移给 s2
// println!("{}", s1); // 编译错误!s1 已失效

借用与可变性控制

通过引用,Rust 允许你“借用”值而不获取所有权。同时,编译器强制执行“同一时刻只能存在一个可变引用或多个不可变引用”的规则,防止数据竞争。
  • 不可变引用(&T)允许多个同时存在
  • 可变引用(&mut T)在同一作用域内必须唯一
  • 引用的生命周期不能超过原值

零成本抽象与安全边界

Rust 在提供高级抽象的同时保证运行时无额外开销。例如,Vec<T> 和 String 在越界访问时会进行边界检查并 panic,这在默认情况下保障了安全性。
安全特性实现机制防护问题
内存安全所有权系统悬垂指针、双重释放
并发安全Send/Sync 标记 trait数据竞争
类型安全强类型系统 + trait 约束类型混淆、非法转换
graph TD A[源代码] --> B[Rust 编译器] B --> C{所有权检查} C --> D[无未初始化使用] C --> E[无重复释放] B --> F[借用检查器] F --> G[无悬垂引用] F --> H[无数据竞争] B --> I[编译通过]

第二章:内存安全防护技巧

2.1 理解所有权与借用规则避免悬垂指针

Rust 的核心特性之一是所有权系统,它在编译期确保内存安全,无需垃圾回收机制。每个值都有唯一的所有者,当所有者离开作用域时,值将被自动释放。
所有权转移与借用
函数传参或赋值操作会触发所有权转移,防止多个变量同时写同一数据。通过引用(&)可实现“借用”,允许临时访问而不获取所有权。

fn main() {
    let s1 = String::from("hello");
    let len = calculate_length(&s1); // 借用 s1
    println!("Length of '{}' is {}", s1, len);
}

fn calculate_length(s: &String) -> usize { // s 是引用
    s.len()
} // s 离开作用域,不释放 s1
上述代码中,&s1 创建对字符串的不可变引用,函数使用 &String 类型接收,避免了所有权转移。这既提升了性能,又防止了悬垂指针——因为引用生命周期受编译器检查,无法指向已释放内存。
可变引用限制
Rust 允许一个作用域内存在唯一的可变引用(&mut),禁止数据竞争。这一规则结合生命周期标注,从根本上消除了并发场景下的内存错误。

2.2 利用生命周期标注保障引用有效性

在 Rust 中,多个引用可能同时指向同一数据,编译器需确保这些引用在其生命周期内始终有效。生命周期标注(Lifetime Annotation)并不影响程序运行时行为,而是帮助编译器验证引用是否安全。
生命周期的基本语法
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}
该函数声明了泛型生命周期参数 'a,表示输入引用和返回引用的生命周期至少要持续到 'a 所代表的范围。编译器据此判断返回值不会悬垂。
常见生命周期场景对比
场景是否需要生命周期标注说明
单一输入引用否编译器可自动推断
多个输入引用是需明确标注以避免歧义
返回引用通常需要确保返回引用不超出输入生命周期
正确使用生命周期标注,能有效防止悬垂引用,提升内存安全。

2.3 避免Vec和String的越界访问实践

在Rust中,对`Vec`和`String`进行索引操作时若下标超出范围,将导致运行时panic。为避免此类错误,应优先使用安全的访问方法。
使用get方法安全访问元素
`get`方法返回`Option`类型,可优雅处理越界情况:

let vec = vec![1, 2, 3];
match vec.get(5) {
    Some(value) => println!("值为: {}", value),
    None => println!("索引越界!"),
}
该代码不会panic,`get(5)`返回`None`,通过模式匹配可安全处理异常情形。
常见边界检查策略对比
方法安全性性能开销
[] 索引不安全(越界panic)低
.get()安全(返回Option)低
bounds检查+if安全中

2.4 安全使用裸指针与unsafe代码的边界控制

在Rust中,unsafe块允许绕过编译器的部分安全检查,用于操作裸指针、调用外部函数或实现底层逻辑。然而,这种能力必须被严格限制在最小必要范围内。
裸指针的基本操作

let mut x = 5;
let raw_ptr = &mut x as *mut i32;
unsafe {
    *raw_ptr += 1;
    println!("x is now: {}", *raw_ptr);
}
上述代码将可变引用转换为裸指针并在unsafe块中解引用。关键在于:指针来源合法、生命周期可控、无数据竞争。
边界控制原则
  • 所有unsafe代码应封装在安全抽象内部
  • 对外暴露的API必须保证即使误用也不会引发未定义行为
  • 添加清晰注释说明为何需要unsafe及所维持的不变量

2.5 借助编译器警告消除潜在内存错误

现代编译器不仅能检查语法错误,还能通过高级静态分析发现潜在的内存问题。启用严格的警告选项是预防内存泄漏、越界访问和未初始化变量的关键步骤。
常用编译器警告标志
  • -Wall:启用大多数常用警告
  • -Wextra:补充额外的警告信息
  • -Werror:将所有警告视为错误
  • -fsanitize=address:运行时检测内存错误
示例:检测数组越界

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    printf("%d\n", arr[10]); // 越界访问
    return 0;
}

使用 gcc -Wall -Wextra -fsanitize=address 编译后,程序在运行时会明确报告缓冲区溢出位置,帮助开发者快速定位问题。

编译器警告级别对比
标志检测范围适用场景
-Wall基本逻辑与语法问题日常开发
-fsanitize=address运行时内存错误调试阶段

第三章:并发安全编程实践

3.1 使用Send和Sync trait确保线程安全

Rust通过`Send`和`Sync`两个trait在编译期确保线程安全。`Send`表示类型可以安全地在线程间转移所有权,`Sync`表示类型可以通过共享引用在线程间共享。
核心机制解析
所有拥有所有权且不包含不可共享类型的结构体默认实现`Send`和`Sync`。例如:

struct Data(i32);
unsafe impl Send for Data {}
unsafe impl Sync for Data {}
该代码显式标记`Data`为可跨线程发送和共享。Rust编译器会强制检查这些约束,防止数据竞争。
常见类型对比
类型SendSync
Rc<T>否否
Arc<T>是是
`Rc`因使用非原子引用计数而不支持多线程,`Arc`则通过原子操作实现线程安全。

3.2 通过Arc>共享可变状态的安全模式

在多线程环境中安全地共享和修改数据是并发编程的核心挑战。Rust 提供了 `Arc>` 组合类型,实现跨线程的可变状态安全共享。
数据同步机制
`Arc`(Atomically Reference Counted)允许多个线程持有同一数据的所有权,而 `Mutex` 确保任意时刻只有一个线程能访问内部值。

use std::sync::{Arc, Mutex};
use std::thread;

let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];

for _ in 0..5 {
    let counter = Arc::clone(&counter);
    let handle = thread::spawn(move || {
        let mut num = counter.lock().unwrap();
        *num += 1;
    });
    handles.push(handle);
}

for handle in handles {
    handle.join().unwrap();
}
上述代码中,`Arc` 确保 `Mutex` 能被安全地跨线程共享,`Mutex::lock()` 获取独占访问权,防止数据竞争。
适用场景对比
类型组合用途
Arc<T>只读共享,不可变数据
Arc<Mutex<T>>可变共享,线程安全修改

3.3 避免死锁:锁的粒度与获取顺序优化

在并发编程中,死锁常因锁的粒度过粗或获取顺序不一致引发。合理细化锁的粒度可减少线程竞争,提升系统吞吐量。
锁粒度优化策略
  • 避免对整个数据结构加锁,转而锁定最小必要范围;
  • 使用读写锁(RWLock)区分读写操作,提高并发读性能。
统一锁获取顺序
当多个线程需获取多个锁时,必须按全局一致的顺序申请,防止循环等待。
var mu1, mu2 sync.Mutex

// 正确:始终先获取 mu1,再获取 mu2
func safeOrder() {
    mu1.Lock()
    defer mu1.Unlock()
    mu2.Lock()
    defer mu2.Unlock()
    // 安全操作共享资源
}
上述代码确保所有线程以相同顺序持有锁,从根本上消除死锁可能。参数说明:defer Unlock() 保证锁的释放顺序与获取相反,符合栈语义。

第四章:常见漏洞场景与防御策略

4.1 防御整数溢出与算术运算陷阱

在低级语言和系统编程中,整数溢出是常见的安全漏洞源头。当算术运算结果超出数据类型表示范围时,将导致回绕或截断,可能被攻击者利用执行任意代码。
常见溢出场景
例如,在C语言中对`int`类型执行加法时未做边界检查:

int add(int a, int b) {
    if (a > INT_MAX - b) {
        // 溢出检测
        abort();
    }
    return a + b;
}
该代码通过提前判断 `a > INT_MAX - b` 来预防加法溢出,确保运算安全。
现代语言的防护机制
Rust 默认在调试模式下启用溢出检查,并提供显式包装操作:

let x: u8 = 255;
let y = x.wrapping_add(1); // 显式回绕
let z = x.checked_add(1);   // 返回 Option,防止溢出
这种方式将溢出控制权交予开发者,提升程序健壮性。
  • 使用安全API进行算术运算(如 checked_add)
  • 静态分析工具辅助检测潜在溢出点
  • 编译器标志开启运行时检查(如-ftrapv)

4.2 正确处理Option与Result防止空值异常

在Rust中,Option和Result是避免空值异常的核心机制。它们通过类型系统强制开发者显式处理可能的缺失值或错误情况。
Option:安全地表示可选值

let maybe_value: Option = Some(42);
match maybe_value {
    Some(value) => println!("值为: {}", value),
    None => println!("值不存在"),
}
Option包含Some(T)和None两种状态,防止对空值解引用导致运行时崩溃。
Result:优雅处理操作结果

fn divide(a: f64, b: f64) -> Result {
    if b == 0.0 {
        Err("除数不能为零".to_string())
    } else {
        Ok(a / b)
    }
}
Result明确区分成功与错误路径,结合?操作符可简化错误传播逻辑。
  • 使用match或if let处理分支
  • 优先采用map、and_then等组合器链式调用
  • 避免使用unwrap(),除非在测试或确定值存在时

4.3 输入验证与边界检查抵御注入风险

在Web应用开发中,输入验证是防止SQL注入、XSS等攻击的第一道防线。必须对所有外部输入进行严格校验,确保其符合预期格式、类型和范围。
白名单验证策略
优先采用白名单机制,仅允许已知安全的输入通过。例如,对用户角色字段限制为预定义值:
// 角色白名单校验
func isValidRole(role string) bool {
    validRoles := map[string]bool{"admin": true, "user": true, "guest": true}
    return validRoles[role]
}
该函数通过哈希表实现O(1)时间复杂度的合法性判断,有效阻断非法角色注入。
边界检查与长度限制
对字符串长度、数值范围实施硬性约束,防止缓冲区溢出或逻辑绕过。使用正则表达式配合最大长度限制:
  • 用户名:长度≤20,仅允许字母数字下划线
  • 邮箱:符合RFC5322规范,长度≤254
  • 整数参数:检查是否在int32范围内

4.4 安全调用外部C库的防护措施

在Go语言中通过CGO调用外部C库时,必须建立严格的安全边界以防止内存泄漏、缓冲区溢出和数据竞争。
启用编译期与运行期检查
使用CGO时应开启安全编译选项,例如:
CGO_CFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector"
go build -buildmode=pie -ldflags="-s -w" main.go
上述参数启用堆栈保护和符号剥离,降低攻击面。
内存管理规范
Go与C之间传递指针需谨慎。C分配的内存必须由C释放:
/*
#include <stdlib.h>
*/
import "C"
ptr := C.malloc(1024)
defer C.free(ptr)
避免跨语言GC语义冲突,确保资源及时回收。
  • 始终验证C函数返回值是否为NULL
  • 禁止在C回调中直接调用Go代码
  • 使用-race标志检测跨语言数据竞争

第五章:构建高安全性Rust工程体系

依赖安全管理与漏洞扫描
在Rust项目中,cargo-audit 是检测依赖漏洞的关键工具。通过定期执行以下命令,可识别已知的CVE和安全风险:

# 安装并运行审计工具
cargo install cargo-audit
cargo audit
建议将 cargo audit 集成到CI流水线中,确保每次提交都进行安全检查。
代码静态分析实践
使用 cargo-clippy 可发现潜在的安全隐患和不规范写法。例如,避免使用可能引发整数溢出的操作:

// 不安全写法
let x: u32 = 4294967295;
let y = x + 1; // 溢出

// 推荐:使用 checked_add 显式处理
if let Some(z) = x.checked_add(1) {
    println!("Result: {}", z);
} else {
    panic!("Arithmetic overflow detected!");
}
内存安全加固策略
Rust虽默认保障内存安全,但在使用 unsafe 块时需格外谨慎。应遵循以下原则:
  • 最小化 unsafe 代码范围,封装在安全抽象内
  • 对所有裸指针访问进行边界检查
  • 避免跨线程共享未保护的可变状态
安全配置与编译优化
通过调整 Cargo.toml 中的配置,增强发布版本的安全性:
配置项推荐值说明
ltotrue启用链接时优化,提升攻击抵抗能力
codegen-units1减少并行代码生成,增强优化深度
panicabort避免栈展开带来的潜在漏洞
Screenshot_2026-11-04-16-26-45-46.jpg 立即下载

相关推荐

互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识

互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识

Rust vs Go:常用语法对比(五)

计算十进制整型的二进制表示中 1的个数。检查两个字符串前缀是否一致。检查两个整型相加是否溢出。将json对象写入文件。统计子字符串出现次数。检查整型相乘是否溢出。停止程序,立即退出。

techdashen的博客 1265

巴基斯坦进口贸易数据集5097类HS6商品六年

本数据集收录巴基斯坦2019至2024年六年间的年度进口贸易数据,覆盖5097个HS6编码商品类别,年度进口总额达500亿至800亿美元规模,完整捕捉疫情前基线、新冠疫情冲击、进口限制政策与能源价格波动等关键经济节点。高进口额品类包括石油馏分、原油、液化天然气、棕榈油与光伏太阳能设备。字段包含HS6商品名称、HS6编码及2019至2024各年度进口额(美元计价)。适用于能源与大宗商品进口依赖分析、增长率与波动性(CAGR)研究、宏观经济冲击建模,以及按HS两位章节(第27章矿物燃料、84/85章机械设备)展开的宏观行业聚合分析,也是国际贸易研究与时间序列分析课程的实用素材。数据许可:Apache 2.0。

为什么Rust也会出漏洞?4种典型场景及防护方案全解析

掌握Rust漏洞防护技巧,深入解析4种典型漏洞场景及应对方案。涵盖unsafe代码、并发处理等高风险场景,揭示Rust内存安全背后的隐患与防御机制。系统性提升代码安全性,值得收藏。

Algorift的博客 654

好的,技术转移行业资深专家为您撰写如下。.docx

好的,技术转移行业资深专家为您撰写如下。

产业园区如何高效匹配产业需求与科技成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

探索 Rust:标量类型、整数溢出与浮点数操作详解

Rust 的标量类型是一种用于表示单一的、不可拆分的值,它包括整数(整数类型)、浮点数(浮点类型)、字符(字符类型)和布尔值(布尔类型)。这些类型具有固定的大小,通常用于表示基本的原子数据,支持各种数学运算、条件判断和逻辑操作,是 Rust 中的基本数据构建块。标量类型的值是不可变的,可以在栈上分配,具有严格的类型推断,是 Rust 中数据的基本构成单元。了解和使用这些标量类型是 Rust 编程的基础,它们在处理数值、文本、逻辑和控制流等各种情况下发挥着重要作用。

qq_18681465的专栏 881

国央企创新负责人如何系统化管理科技成果与创新资源?.docx

国央企创新负责人如何系统化管理科技成果与创新资源?

Rust开发之基本数据类型操作(整数、浮点数、布尔值、字符)

Rust 是一门静态类型语言,在编译时就必须明确每个变量的数据类型。尽管 Rust 具有类型推断能力(即可以根据赋值自动判断类型),但了解其内置的基本数据类型对于编写安全高效的代码至关重要。标量类型(Scalar Types):表示单个值,包括整数、浮点数、布尔值和字符。复合类型(Compound Types):如元组和数组,将在后续案例中详细讲解。本案例聚焦于标量类型中的四种基本类型整数类型(Integer)浮点数类型(Floating-point numbers)

weixin_69932715的博客 444

【动态多智能体系统的通信感知编队控制】一种新颖的通信感知编队控制策略,用于动态多智能体系统研究(Matlab代码、Python代码实现)

内容概要:文档名为《Plecs全桥LLC谐振变换器仿真模型.txt》,但其内容并未深入介绍Plecs环境下全桥LLC谐振变换器的具体建模与仿真过程,而是呈现为一份涵盖多领域科研主题的资源列表。文档内容广泛涉及多智能体系统控制、无人机路径规划、电力电子变换器、状态估计、信号处理、优化算法等研究方向,并多次提及Matlab/Simulink、Python等工具的代码实现。整体来看,该文档更像是一份科研项目目录或技术资源索引,重点推介了包括LLC谐振变换器在内的多种控制系统与电力电子仿真模型,但对标题所述核心内容缺乏详尽的技术描述与实现细节。; 适合人群:电力电子、自动化、控制工程、信号处理及多智能体系统等相关领域的研究生、科研人员与工程技术人员。; 使用场景及目标:①为科研工作者提供跨学科的技术方向参考与研究选题灵感;②获取电力系统、无人机控制、信号处理等领域成熟的Matlab/Simulink或Python仿真代码资源,用于算法验证与模型复现。; 阅读建议:建议将此文档作为科研资源导航目录使用,读者可根据自身研究方向筛选感兴趣的主题,并通过文中提供的公众号或网盘链接获取完整的代码、仿真模型与配套资料进行深入学习与实践。

产业园区运营负责人如何提升企业技术需求与科研资源的精准匹配效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Rust 基础入门 ——数值类型

浮点数往往是你想要数字的近似表达浮点数类型是基于二进制实现的,但是我们想要计算的数字往往是基于十进制,例如0.1在二进制上并不存在精确的表达形式,但是在十进制上就存在。这种不匹配性导致一定的歧义性,更多的,虽然浮点数能代表真实的数值,但是由于底层格式问题,它往往受限于定长的浮点数精度,如果你想要表达完全精准的真实数字,只有使用无限精度的浮点数才行浮点数在某些特性上是反直觉的例如大家都会觉得浮点数可以进行比较,对吧?是的,它们确实可以使用>=等进行比较,但是在某些场景下,这种直觉上的比较特性反而会害了你。

ALex_zry的博客 1494

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文档系统整理了电力电子与电力系统领域的多项Simulink仿真资源,重点围绕“两相交错并联Boost电路仿真模型”展开,涵盖其在高功率密度、低输入电流纹波等性能优化方面的建模与控制实现。资源集合不仅包括Boost类变换器,还广泛涉及LLC谐振变换器(半桥、全桥、多相交错)、PFC功率因数校正电路(图腾柱、维也纳拓扑)、双向DC-DC变换器(Buck-Boost、CLLC)、PWM整流器及DAB双有源桥等多种典型电力电子拓扑结构的闭环控制系统设计。每个模型均强调动态响应分析、均流控制、软开关技术与稳定性验证,适用于新能源发电、电动汽车V2G系统、储能能量管理及充电桩等前沿应用场景,体现了较强的工程实践价值与科研参考意义。; 适合人群:面向电气工程、自动化、电力电子与电力传动等相关专业的高校本科生、研究生,以及从事电源设计、新能源系统开发、车载充电机、工业变流器研发的工程技术人员,尤其适合具备电路理论基础和Simulink/Matlab仿真经验的学习者进一步深化系统建模与控制策略研究。; 使用场景及目标:① 深入理解交错并联Boost电路的工作原理及其在抑制输入电流纹波、提升效率方面的作用机制;② 掌握利用Simulink构建复杂电力电子系统的建模方法,开展控制器设计(如PI、双闭环、VOC、SVPWM)与动态性能仿真;③ 为毕业设计、科研课题或实际工程项目提供可复用的技术参考,支撑高性能DC-DC变换器与AC-DC整流系统的开发需求。; 阅读建议:建议结合文档中列出的LLC、PFC、双向DC-DC等配套仿真案例进行横向对比学习,深入把握不同拓扑间的共性与差异;同时推荐配合提供的Mathcad计算书、设计报告与参考文献,完成从参数设计、模型搭建到仿真验证的全流程实践,全面提升理论分析与工程应用相结合的能力。

嵌入式C++安全编码实践与内存管理优化

嵌入式系统中的C++开发面临内存安全、实时性要求和资源限制等独特挑战。内存管理是嵌入式开发的核心问题,涉及智能指针的合理使用、容器类的安全边界控制等关键技术。通过静态分析工具如Clang-tidy和运行时内存校验,可以有效预防内存泄漏和缓冲区溢出等常见漏洞。在多线程环境下,原子操作和内存屏障技术能确保数据一致性,而看门狗机制则提升了系统稳定性。这些安全编码实践不仅符合IEC 61508等行业标准,还能显著提升嵌入式系统在医疗设备、工业控制等关键领域的可靠性。

weixin_33834075的博客 386

DPARSF高级版 vs 基础版怎么选?没有T1数据也能做fMRI分析吗?

本文深度对比了DPARSF高级版与基础版在fMRI分析中的核心差异与适用场景,特别针对无T1数据的情况提供了实战解决方案。高级版依赖T1像实现高精度配准,适合需要精确解剖定位的研究;基础版则无需T1数据,适用于功能连接等相对空间要求不高的分析。文章还提供了版本选择决策树和常见问题解决方案,帮助研究者根据实际需求做出最优选择。

weixin_42526087的博客 132

微信支付开发之平台给用户转账到零钱的功能

请求消息中应包含商家批次单号、转账名称、appid、转账总金额、转账总笔数、转账openid、收款用户姓名等信息。批次已受理成功,若发起批量转账的30分钟后,转账批次单仍处于该状态,可能原因是商户账户余额不足等。【转账场景ID】 该批次转账使用的转账场景,如不填写则使用商家的默认场景,如无默认场景可为空,可前往“商家转账到零钱-前往功能”中申请。【转账总笔数】 一个转账批次单最多发起一千笔转账。【商家批次单号】 商户系统内部的商家批次单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一。

程序员weixin_sodomany的博客 3451

【Rust日报】 2019-04-12 - Rust 1.34 稳定版发布

Rust 1.34 稳定版发布#stable_rust$ rustup update stable该稳定版本包括如下变动:引入了cargoregistries,此功能允...

Rust语言学习交流 564

Q&A | ZStack替代VMware实问实答

ZStack替代VMware实问实答

zstack_org的博客 1801

深入RUST标准库内核(六)—Iterator

分析RUST原生类型的标准库,包括NonZero,大小端变换,整形与字节的转换等等标准库代码。

weixin_45429253的博客 1618

Windows server 2012R2安装Oracle11g

打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Database Configuration Assistant。打开 开始——所有程序——Oracle-OraDb11g_home1——配置和移植工具——Net Configuration Assistant。首先打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。打开Oracle的安装位置找到下面的位置找到tnsnames.ora文件右键编辑。选择仅安装数据库软件。

qq_74770105的博客 3596

WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法

WSL运行make提示/lib//modules/xxx文件或目录不存在。 WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个版本。

weixin_45668903的博客 1万+

Rust学习笔记-2-基础篇:变量、常量、基本数据类型

前言 本文主要对Rust基础概念中的知识点进行梳理,属于学习笔记类型。主要参考了官方的《Rust程序设计语言》和《Rust深入浅出》。 变量 变量默认不可变,不能对不可变变量进行二次赋值。要使变量可变,可以在变量名前mut; 变量在使用前,必须初始化。编译器会做一个执行路径的静态分析,确保变量在使用前一定被初始化。 变量可以在同一代码块被遮蔽(Shadowing,C/C++/C#也允许遮蔽,但只能在嵌套的子块内),其实质为重新创建一个新变量。 变量的标识符必须由数 字、字母、下划线组成,且不能以

uddiqpl的专栏 1576

从PSDK到ROS节点:实战GPS数据发布与CMake配置

本文详细介绍了如何从大疆PSDK获取GPS数据并封装为ROS节点的实战过程,包括PSDK编译、GPS数据订阅、ROS节点实现及CMake配置优化。通过具体代码示例和调试技巧,帮助开发者快速实现无人机传感器数据与ROS系统的集成,提升开发效率。

weixin_30843605的博客 458

Rust:数据类型

文章目录函数的参数包含语句和表达式的函数体函数的返回值一个返回值多个返回值 Rust时一门基于表达式的语言 函数的参数 fn main() { test(11, 11.1); } fn test(x:i32, y:f32){ println!(&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;hello world!, x = {}, y = {}&amp;amp;amp;amp;amp;amp;am

OceanStar的博客 1472

如何降低 Claude Code 封号风险:实用指南

本文针对 Claude Code 用户频繁遭遇账号封禁的问题,提供了一套经过实战验证的解决方案。通过分析封号的根本原因——共享VPN导致的IP异常标记,文章详细介绍了如何通过"独立服务器+中转服务+环境配置"三步走策略,显著降低封号风险。

goodparty的专栏 2133

手把手教你学PCIE--系统内存管理:GART(Graphics Address Remapping Table)的典型用途详解

GART(图形地址重映射表)是GPU的核心组件,主要用于地址映射转换。其典型用途分为物理模式和虚拟模式两类:在物理模式下,GART将GPU虚拟地址映射到分散的物理内存,支持DMA连续访问非连续内存块,适用于GPU渲染纹理采样和AI推理数据搬运等场景;在虚拟模式下,GART配合IOMMU实现多级映射,将GPU虚拟地址转换为虚拟机物理地址再映射到宿主机物理地址,确保多租户隔离,应用于云服务器GPU共享和容器化AI训练等虚拟化环境。两种模式分别优化了高性能计算场景和虚拟化场景的需求。

MHD0815的博客 367
上一篇: 揭秘Rust中的AES加密实现:从原理到高性能落地的完整路径
下一篇: Kubernetes中Rust应用部署难题全解析,99%的工程师都忽略了这一点
VarPerch
博客等级 码龄1年 146粉丝 1961原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值