2025 C++安全编码新规出炉(工业控制领域必备手册)

【C++】 C++安全编码重点规范整理 通用规则 C安全编程 基础要求 变量操作 断言操作 函数操作 循环 异常 类 字符串/数组操作 正确使用安全函数 整数 内存 不安全函数 文件输入输出 敏感信息处理 阅读详情

第一章:2025 全球 C++ 及系统软件技术大会:工业控制 C++ 安全编码规范

在2025全球C++及系统软件技术大会上,工业控制系统中的C++安全编码成为焦点议题。随着关键基础设施对实时性与可靠性的要求日益提升,C++作为底层系统开发的核心语言,其安全性直接影响到工业设备的稳定运行。

避免未初始化变量

未初始化的变量可能导致不可预测的行为,尤其在嵌入式控制器中后果严重。应始终显式初始化所有局部和全局变量。

int sensorValue = 0;                    // 显式初始化
std::vector<double> readings(10, 0.0);   // 指定大小并初始化为零
上述代码确保变量在使用前具有确定状态,防止因内存残留数据引发故障。

使用智能指针管理资源

手动内存管理易导致泄漏或悬垂指针。推荐使用std::unique_ptr和std::shared_ptr自动释放资源。

#include <memory>

std::unique_ptr<Controller> ctrl = std::make_unique<Controller>();
ctrl->initialize();  // 自动释放,无需调用delete
该机制通过RAII原则保障异常安全和资源确定性释放。

禁用不安全的标准函数

传统C风格函数如strcpy、sprintf易引发缓冲区溢出。应替换为边界安全版本。
  • strcpy → strncpy_s(若支持)或 std::string
  • sprintf → snprintf
  • gets → 禁止使用,改用 std::getline
风险函数安全替代方案说明
memcpymemmove / std::copy确保目标区域足够大
printffmt::format (fmt库)类型安全格式化输出
graph TD A[输入数据] --> B{验证长度?} B -- 是 --> C[执行安全拷贝] B -- 否 --> D[拒绝操作并记录日志]

第二章:工业控制系统中的C++风险建模与威胁分析

2.1 工控系统典型安全漏洞的C++成因剖析

工控系统中广泛使用的C++代码常因资源管理不当引发安全漏洞,其中缓冲区溢出与指针误用尤为突出。
不安全的内存操作实例

void readSensorData(char* buffer, int len) {
    for (int i = 0; i < len; i++) {
        buffer[i] = getSensorByte(); // 缺乏边界检查
    }
}
上述函数未验证输入长度,攻击者可通过超长数据触发栈溢出,进而劫持控制流。参数 len 应与预分配缓冲区大小校验,建议使用 std::array 或 std::vector 替代原始指针。
常见漏洞类型归纳
  • 缓冲区溢出:源于 strcpy、gets 等不安全函数
  • 悬空指针:对象释放后未置空,导致非法访问
  • 竞态条件:多线程未同步共享资源访问
编译期防护建议
启用现代C++特性如智能指针与范围检查容器,可显著降低漏洞暴露面。

2.2 基于STRIDE模型的C++代码层威胁识别实践

在C++开发中,结合STRIDE模型可系统化识别代码层安全威胁。以“伪造”(Spoofing)为例,常见于身份验证逻辑缺陷。
身份验证中的伪造风险

// 不安全的身份校验函数
bool authenticateUser(const char* inputToken, const char* validToken) {
    return strcmp(inputToken, validToken) == 0; // 易受时序攻击
}
上述代码使用strcmp进行敏感信息比较,执行时间随输入差异变化,可能被利用进行时序分析攻击。应替换为恒定时间比较函数。
防御性编码策略
  • 使用恒定时间字符串比较防止信息泄露
  • 对关键数据结构启用栈保护和控制流完整性(CFI)
  • 禁用不安全API如gets()、sprintf()
通过将STRIDE各威胁类型映射到具体编码实践,可显著提升C++程序的安全韧性。

2.3 内存安全缺陷在实时控制系统中的连锁效应

内存安全缺陷在实时控制系统中可能引发级联故障,导致关键任务执行异常。由于系统对响应时间高度敏感,任意内存越界或悬空指针都可能破坏调度器状态。
典型漏洞场景
  • 缓冲区溢出干扰传感器数据队列
  • 释放后使用(Use-After-Free)导致控制指令错乱
  • 竞态条件破坏共享内存一致性
代码示例:不安全的内存访问

// 控制循环中未检查数组边界
void update_actuators(int* values, int count) {
    int buffer[10];
    for (int i = 0; i < count; i++) {
        buffer[i] = values[i]; // 当count>10时发生溢出
    }
    apply_controls(buffer);
}
上述函数在处理外部输入时未验证count参数,攻击者可构造大量数据覆盖返回地址,劫持执行流,进而影响整个控制回路的稳定性。

2.4 外部接口与通信模块的风险传递路径分析

在分布式系统中,外部接口是系统与外界交互的入口,其安全性直接影响内部核心模块的稳定性。攻击者常通过伪造请求、重放攻击或注入恶意载荷等方式,经由API网关渗透至后端服务。
常见风险传递路径
  • 未鉴权的REST API暴露敏感数据
  • 第三方回调接口缺乏输入校验
  • 消息队列未加密导致中间人窃听
典型代码示例
// 不安全的HTTP处理函数
func HandleWebhook(w http.ResponseWriter, r *http.Request) {
    payload, _ := io.ReadAll(r.Body)
    // 缺少签名验证和内容过滤
    process(payload) 
}
上述代码未对接口来源进行HMAC签名验证,也未对payload做反序列化防护,易被用于远程代码执行(RCE)攻击。
通信层加固建议
风险点缓解措施
明文传输启用mTLS双向认证
接口滥用实施限流与OAuth2.0授权

2.5 静态分析工具链在工控C++项目中的集成验证

在工控C++项目中,静态分析工具链的集成可显著提升代码安全性与合规性。通过将Clang-Tidy与Cppcheck嵌入CI/CD流程,实现每次提交自动扫描。
工具集成配置示例

# .gitlab-ci.yml 片段
static-analysis:
  image: clang-tidy:14
  script:
    - clang-tidy src/*.cpp --checks='readability-*,performance-*' --warnings-only
    - cppcheck --enable=warning,performance --std=c++17 src/
上述配置启用可读性与性能检查,--warnings-only确保不中断构建,便于渐进式改进。
检查规则优先级划分
  • 关键级:内存泄漏、空指针解引用
  • 警告级:未使用变量、冗余包含
  • 建议级:命名规范、函数复杂度
结合自定义规则集,可针对PLC通信模块等核心组件强化校验,保障实时性与稳定性。

第三章:核心语言特性的安全使用准则

3.1 智能指针与RAII机制在资源管控中的正确应用

RAII核心思想与资源安全
RAII(Resource Acquisition Is Initialization)利用对象生命周期管理资源,确保资源在对象构造时获取、析构时释放。该机制有效避免内存泄漏。
智能指针的典型应用
C++中通过std::unique_ptr和std::shared_ptr实现自动内存管理。例如:

#include <memory>
std::unique_ptr<int> ptr = std::make_unique<int>(42);
// 离开作用域时自动释放内存
上述代码使用std::make_unique创建独占式智能指针,确保堆内存安全释放,无需手动调用delete。
  • unique_ptr:独占所有权,轻量高效
  • shared_ptr:共享所有权,引用计数管理
  • weak_ptr:解决循环引用问题
结合RAII,智能指针将资源管理嵌入对象生命周期,极大提升系统稳定性。

3.2 虚函数与多态设计中的潜在攻击面规避

在C++多态机制中,虚函数通过虚函数表(vtable)实现动态绑定,但这也引入了潜在的安全风险,如vtable指针篡改或非法派生类调用。
虚函数调用的安全隐患
当对象内存被破坏时,攻击者可能修改vptr指向恶意构造的vtable,导致任意代码执行。因此,确保对象生命周期和内存完整性至关重要。
缓解措施与最佳实践
  • 启用编译器安全特性(如GCC的-fstack-protector)
  • 避免在虚函数中传递原始指针作为参数
  • 使用final关键字限制类继承,防止未预期的重写

class Base {
public:
    virtual void process() final; // 阻止派生类重写
};
该代码通过final限定符封闭虚函数,消除因重写引入的不可控行为,增强接口安全性。

3.3 模板元编程的安全边界与编译期检查实践

在模板元编程中,确保类型安全与逻辑正确性至关重要。通过编译期断言(`static_assert`)可有效划定安全边界,防止非法实例化。
编译期类型约束
使用 `std::enable_if` 限制模板参数的合法类型范围:
template<typename T>
typename std::enable_if_t<std::is_arithmetic_v<T>, T>
safe_multiply(T a, T b) {
    return a * b;
}
该函数仅接受算术类型(如 int、float),非数值类型将触发编译错误,从而提前暴露调用不当问题。
静态断言增强可读性
结合语义化消息提升错误提示质量:
template<typename T>
void process() {
    static_assert(sizeof(T) == 4, 
        "Type T must be exactly 4 bytes to ensure ABI compatibility");
}
此检查确保类型大小符合接口约定,避免运行时数据错位风险。
  • 模板递归深度应受控,避免编译资源耗尽
  • 优先使用 `constexpr` 替代复杂宏逻辑
  • 利用 SFINAE 或 Concepts(C++20)实现清晰的契约设计

第四章:关键编码实践与防御性编程模式

4.1 安全内存访问模式:span、array_view与越界防护

在现代C++和系统级编程中,安全地访问内存是防止漏洞的关键。`span` 和 `std::experimental::array_view` 提供了对连续内存的安全、非拥有式访问,具备边界检查能力。
核心特性对比
  • span 是 C++20 起推荐的标准工具,支持静态和动态范围界定
  • array_view 多见于跨平台库(如 GSL),语义相似但标准化程度较低
  • 两者均不复制数据,仅封装指针与长度
代码示例:安全切片访问

#include <span>
void process(std::span<int> data) {
    for (size_t i = 0; i < data.size(); ++i) {
        // 编译期或运行期可启用边界检查
        std::cout << data[i] << " ";
    }
}
上述函数接受任意大小的整型数组视图,避免了传统指针传递中的信息丢失问题。`span` 的 `size()` 方法提供元数据,结合迭代器或索引访问时可插入越界检测逻辑,显著降低缓冲区溢出风险。

4.2 异常安全与确定性析构在高可用系统中的实现

在高可用系统中,资源泄漏或异常状态下的对象析构不完整可能导致服务不可恢复。通过 RAII(Resource Acquisition Is Initialization)机制,可确保对象生命周期与资源绑定。
异常安全的三层次保证
  • 基本保证:操作失败后系统仍处于有效状态
  • 强保证:操作回滚至调用前状态
  • 不抛异常保证:操作必定成功
确定性析构示例

class ConnectionGuard {
    std::unique_ptr conn;
public:
    ConnectionGuard(Connection* c) : conn(c) {}
    ~ConnectionGuard() { 
        if (conn) conn->close(); // 析构时必然释放
    }
};
上述代码利用智能指针在栈展开时自动调用析构函数,确保网络连接无论是否发生异常都能被关闭,提升系统稳定性。

4.3 并发控制中避免死锁与竞态条件的C++最佳实践

资源获取的顺序一致性
在多线程环境中,多个互斥锁的嵌套使用容易引发死锁。确保所有线程以相同的顺序获取锁是预防死锁的关键策略。
  • 始终按固定顺序加锁,例如内存地址或命名规则排序
  • 使用 std::lock 一次性获取多个锁,避免分步加锁风险
避免竞态条件的RAII实践
利用 RAII(资源获取即初始化)机制管理锁的生命周期,可有效防止异常导致的锁未释放问题。
std::mutex mtx1, mtx2;
void safe_transfer() {
    std::lock(mtx1, mtx2); // 原子化获取多个锁
    std::lock_guard<std::mutex> lock1(mtx1, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(mtx2, std::adopt_lock);
    // 执行共享资源操作
}
上述代码通过 std::lock 避免死锁,std::adopt_lock 表示锁已由 std::lock 获取,防止重复加锁。

4.4 安全随机数生成与加密接口的合规调用方法

在密码学应用中,安全随机数是保障密钥、盐值和初始化向量不可预测性的核心。使用弱随机源可能导致密钥被推测,引发严重安全漏洞。
安全随机数生成实践
应优先使用操作系统提供的强随机数生成器,如 Linux 的 /dev/urandom 或对应平台的加密安全 API。
// Go 语言中使用 crypto/rand 生成安全随机字节
package main

import (
    "crypto/rand"
    "fmt"
)

func main() {
    bytes := make([]byte, 16)
    if _, err := rand.Read(bytes); err != nil {
        panic(err)
    }
    fmt.Printf("Secure random: %x\n", bytes)
}
上述代码利用 crypto/rand 包调用系统熵池生成 16 字节安全随机数据,适用于密钥派生或 nonce 生成。
加密接口调用合规要点
  • 禁用已淘汰算法(如 MD5、SHA-1、RC4)
  • 使用 AES-GCM、ChaCha20-Poly1305 等认证加密模式
  • 确保每次加密使用唯一 IV/nonce
  • 遵循 FIPS 140-2 或等效合规标准

第五章:总结与展望

技术演进中的架构选择
现代分布式系统正逐步从单体架构向服务网格迁移。以 Istio 为例,其通过 Sidecar 模式实现流量控制与安全策略的统一管理。实际部署中,某金融企业采用 Istio 后,API 调用延迟下降 18%,同时实现了细粒度的熔断与重试机制。
  • 服务发现与负载均衡自动化
  • 安全通信(mTLS)无需修改业务代码
  • 可观测性集成:Metrics、Tracing、Logs 统一输出
代码层面的性能优化实践
在高并发场景下,Go 语言的协程调度优势显著。以下为某电商平台订单处理服务的关键代码段:

// 处理批量订单,使用协程池控制并发数
func ProcessOrders(orders []Order) {
    worker := make(chan Order, 10)
    var wg sync.WaitGroup

    // 启动固定数量 worker
    for i := 0; i < 5; i++ {
        go func() {
            for order := range worker {
                ProcessSingle(order) // 实际处理逻辑
            }
        }()
    }

    // 分发任务
    for _, order := range orders {
        wg.Add(1)
        worker <- order
    }
    close(worker)
    wg.Wait()
}
未来技术趋势预测
技术方向当前成熟度预期落地周期
Serverless Kubernetes中级1-2 年
AI 驱动的运维(AIOps)初级2-3 年
边缘计算编排框架高级6-12 个月
[客户端] → [API 网关] → [认证服务] ↘ [缓存层] → [数据库] ↘ [事件队列] → [异步处理器]
Mythos模型:首个具备自主攻防推理能力的通用代码智能体 代码安全分析正从静态扫描与人工审计迈向AI驱动的自主推理新范式。基于符号执行、动态污点追踪与可执行推理图(ERG)架构,新一代模型能深度理解C/Java等多语言源码与二进制逻辑,实现漏洞发现→验证→利用→修复的全链路闭环。其核心突破在于将‘代码即数据’升维为‘代码即计算图’,支持按需调用GDB、QEMU、angr等工具完成真实攻防实验。该能力已延伸至金融系统审计、固件安全评估、合规报告生成等工程场景,显著压缩漏洞平均发现周期。本文聚焦Claude Mythos所代表的‘自主代码智能体’技术本质与落地实践路径 阅读详情

相关推荐

【类型安全】C++ 编码规范 之类型安全篇

在现代软件开发中,编码规范扮演着至关重要的角色。这些规范不仅帮助维护代码的一致性和可读性,还直接影响到软件的安全性和可维护性。在本系列博客中,我们将深入探讨C++的类型安全编码规范,这是一个既关键又常被忽视的主题。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 539

C++编码规范

1 通用原则 7 原则1.1:对外部输入进行校验 7 原则1.2:禁止在日志中保存口令、密钥 8 原则1.3:及时清除存储在可复用资源中的敏感信息 8 原则1.4:正确使用经过验证的安全的标准加密算法 8 原则1.5:遵循最小权限原则 9 原则1.6:删除或修改没有效果的代码 9 原则1.7:删除或修改没有使用到的变量或值 9 2 字符串操作安全 10 规则2.1:确保有足够的空间存储字符串的字符数据和’\0’结束符 10 规则2.2:字符串操作过程中确保字符串有’\0’结束符 11 规则2.3:把数据复制

qq_41306849的博客 2300

最全C/C++安全编码规范之一:变量

本文介绍了C/C++开发中的变量安全规范,主要包括强制和推荐两类规则。强制规则包括:指针、资源描述符和BOOL变量必须初始化;资源释放后立即赋新值;C++类成员变量须在构造函数初始化。推荐规则涉及:多线程访问全局变量需保证线程安全;不变值应使用const定义;避免局部变量占用过大栈空间;谨慎对指针使用sizeof操作。通过具体案例对比正确和错误做法,帮助开发者规避潜在安全风险,如未初始化引用、资源泄漏、线程竞争等问题,提升代码质量和安全性。

1457

C/C++安全编程规范

此外,非法的指针操作也可能导致程序逻辑上的错误,例如将数据写入了错误的内存位置,从而破坏了其他变量的值。当程序遇到一个空指针时,它会访问该指针所指向的数据,但由于是空指针没有可供访问的实际数据存在,因此这将导致程序崩溃。安全编程是一种软件开发方法,目的是通过采取具体措施来减少程序中存在的安全漏洞和黑客攻击的可能性,确保软件在运行过程中不会遭受攻击或泄露敏感信息。对任何用户输入的数据,都必须进行输入验证,对于用户输入的所有数据,都应该进行校验和过滤,来确保输入的数据不包含恶意代码或不合法的字符。

weixin_56018002的博客 2226

MISRA C++ 、Google C++ 、AUTOSAR Adaptive Platform编码 C++ 规范总结

在深入探讨具体的C++编程规范之前,了解它们在现代软件开发中的重要性是至关重要的。这不仅是一种技术需求,更体现了程序员在解决问题时的思维方式和行为模式。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2608

c /c++安全编码规范v3.1.odt

c /c++安全编码规范v3.1.odt

C++最通用的编码规范

尽量避免使用宏定义,因为宏定义会导致代码难以调试和维护。如果确实需要使用宏定义,应确保其命名具有唯一性,并避免与变量、函数等命名冲突。

u013576331的博客 1714

C/C++编码规范

比较通用的C 或者C++语言编码规范

2025年C++开发者必须掌握的6项零信任编码规范(安全左移实战篇)

掌握C++系统安全开发核心方法,解决传统防护滞后难题。本文基于2025全球C++及系统软件技术大会:C++系统零信任安全设计实践,提炼六大编码规范,覆盖内存管理、权限控制与攻击面收敛,实现安全左移,提升系统韧性,值得收藏。

SimSolve的博客 649

具身智能的建模和方法(具身智能入门一)

本文以机械臂将小红方块移动到目标位置为例对具身智能的建模和方法进行介绍,如下图所示,该例子来自https://ai-workshops.github.io/building-and-working-in-environments-for-embodied-ai-cvpr-2022/。

weixin_39699362的博客 1462

STM32F103ZET6驱动57闭环步进电机(连线+代码)

一、设备: 1. STM32F103开发板 (普中F103的板子) 2. 57闭环电机带驱动 3. 24V/3A的直流电源,用于给电机驱动供电 简单说明:使用Keil5编程,主要使用了PWM波,外部中断和时间中断,按键控制电机使能和脱机并且控制PWM的周期,调节周期即调节电机的转速。 二、STM32开发板与电机驱动的连线: 1.PUL-、ENA-、DIR-与STM32的连接方法: 可以参考CSND的这个链接中的说明,使用共阴极接法:STM32F407-用TB6600驱动器驱动57步进电机(代码

baidu_39071234的博客 7430

C/C++语言的安全编码规范

安全编码的内容非常广泛,涉及变量、断言、函数、循环、异常机制、类、安全退出、字符串/数组操作、整数、内存、不安全函数、文件输入/输出、敏感信息处理等各方面,这里简略叙述最重要的内存、函数、字符串处理等几个模块,以期能达到举一反三作用,引导大家树立安全编码思想。通过函数参数传递数组或一块内存进行写操作时,函数参数必须同时传递数组元素个数或所传递的内存块大小,否则函数在使用数组下标或访问内存偏移时,无法判断下标或便宜的合法范围,产生越界访问的漏洞。3、通过防御性的编码策略来弥补潜在的编码人员的疏忽。

hhhlizhao的博客 1158

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

C++编码规范【参考】

在声明和定义函数的时候,函数的返回值类型应该和函数名在同一行;如果行宽度允许,函数参数也应该放在一行;否则,函数参数应该换行,并进行合理对齐。参数列表的左圆括号总是和函数名在同一行,不要单独一行;右圆括号总是跟随最后一个参数。ReturnType FunctionName(ArgType paramName1, ArgType paramName2) // Good:全在同一行...

weixin_39775340的博客 653

零基础吃透!Python爬虫实战:超详细爬取小红书图文,解析封面+标题+文案全流程

本文为零基础开发者提供小红书图文爬取全流程指南,针对动态加载、严格反爬等核心痛点,从环境配置到数据解析详细讲解。主要内容包括: 核心特性分析:动态加载机制需抓包获取真实接口,严格反爬依赖Cookie验证和请求头伪装 环境准备:Python 3.8-3.10环境,使用requests/beautifulsoup4等库,通过浏览器开发者工具获取有效Cookie 实战步骤: 定位关键API接口(note/list) 配置请求头(含Cookie/User-Agent/Referer) 实现分页爬取和异常处理 解析封

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 730

Python爬虫抓取淘宝商品详情页信息:从入门到高级技术应用

通过本篇博客,我们了解了如何使用Python爬虫抓取淘宝商品详情页的信息,如何使用requests和Selenium抓取静态和动态内容,如何应对淘宝的反爬虫机制,如何将抓取的数据保存到CSV文件等。随着爬虫技术的不断发展,开发者可以根据需要选择合适的工具和技术,如使用分布式爬虫框架提高抓取效率,或者利用OCR技术处理验证码等问题。在进行淘宝爬虫时,需要注意遵循相关法律法规和平台的爬虫政策,避免对平台造成过度的负担或侵犯其合法权益。

2201_76125261的博客 460

【2025全球C++安全编码巅峰指南】:工业控制领域C++安全规范全解析

掌握工业控制领域C++安全编码核心方法,解决系统级软件高可靠需求。基于2025全球C++及系统软件技术大会:工业控制C++安全编码规范,详解适用场景、风险防控与最佳实践,提升代码安全性与稳定性,值得收藏。

QuickSolve的博客 850

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2070

【C&C++编码规范】

目的:加强编程人员在编程过程中的安全以上,建立编程人员的攻击者思维,养成安全编码的习惯,写出安全、可靠的代码。安全编码基本思想1.程序在处理外部数据时必须经过严格的合法性校验,编程人员在处理外部数据过程中必须时刻保持这种思维意识,不能做出任何外部数据符合预期的假设,外部数据必须经过严格判断后才能使用。编码人员必须在这种严酷的攻击环境下通过遵守这一原则保证程序的执行过程符合预期结果。

请关注我,不定时分享个人在大厂嵌入式开发工作经验 551

Python爬虫:爬取拼多多平台商品信息、销量、价格等数据

在本篇博客中,我们将深入探讨如何使用Python爬虫技术爬取拼多多平台的商品信息,包括商品的标题、销量、价格等详细数据。拼多多的商品页面通常是分页展示的,因此我们需要遍历多个页面,获取所有商品的信息。每个商品在拼多多平台上都有一个唯一的商品ID,我们可以通过该ID访问商品页面。通过以上的技术方案和代码示例,你已经掌握了如何使用Python爬虫获取拼多多平台上的商品信息、销量、价格等数据。等技术,解决拼多多平台的反爬虫机制,成功抓取我们所需的商品数据。,我们能够应对拼多多的反爬虫机制,稳定地获取到商品数据。

2201_76125261的博客 3655

【二.图像处理核心技术】【5.形态学操作:腐蚀/膨胀/开闭运算】

想象一下,你拍了一张布满雪花点的老照片,或者扫描了字迹断裂的文档,这时候形态学操作就是你的像素整形师!它们能让模糊的边界变清晰,把断裂的笔画连起来,甚至从X光片里揪出癌细胞。今天我们要聊的,是计算机视觉界的"广场舞双雄"——腐蚀和膨胀。这俩操作就像给像素点们请了个健身教练,要么集体减肥(腐蚀),要么组团增肌(膨胀)。下次当你用美颜相机时,不妨会心一笑——这看似魔法的背后,正是形态学在默默耕耘。腐蚀的规则很简单:如果一个像素点周围的邻居不全白,它就"狗带"(变黑)。:先用砂纸打磨(腐蚀),再喷漆填补(膨胀)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 425

【C++安全编码终极指南】:2025全球系统软件大会权威发布十大最佳实践

掌握C++安全编码核心方法,有效防范内存泄漏与缓冲区溢出。基于2025全球C++及系统软件技术大会:C++安全编码的最佳实践,涵盖系统开发、嵌入式等关键场景,提炼十大权威实践方案,提升代码健壮性与安全性,值得收藏。

LogicNest的博客 481

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 实时MRI渲染性能飙升300%:2025大会公布的C++底层优化黑科技详解
下一篇: 【系统级性能革命】:2025 C++技术大会不可错过的7款核心分析工具
InstrWander
博客等级 码龄1年 117粉丝 1992原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值