【内存重叠危机】:memcpy崩溃元凶竟是它?正确替代方案曝光

关于memcpy函数安全性的一些讨论 阅读详情

第一章:内存重叠危机的真相

在现代软件系统中,内存管理是保障程序稳定运行的核心机制之一。当多个数据区域在物理或逻辑地址空间上发生重叠时,便可能触发“内存重叠危机”,导致不可预测的行为、数据损坏甚至系统崩溃。

内存重叠的发生场景

  • 使用低级内存操作函数(如 memcpy)时源与目标区域存在交集
  • 多线程环境下共享缓冲区未加同步控制
  • 手动内存管理中指针计算错误引发覆盖

危险的 memcpy 操作示例


#include <string.h>

void dangerous_overlap() {
    char buffer[10] = "abcdefghi";
    // 危险:src 和 dst 内存区域重叠
    memcpy(buffer + 2, buffer, 6); // 将前6字节复制到偏移2的位置
}

上述代码中,memcpy 未定义处理重叠内存的行为,可能导致部分数据被提前覆盖,最终结果不可控。

安全替代方案
应使用专门设计用于处理重叠内存的函数 memmove,其内部通过临时缓冲区确保数据完整性:

void safe_overlap() {
    char buffer[10] = "abcdefghi";
    // 安全:memmove 正确处理重叠区域
    memmove(buffer + 2, buffer, 6);
}

常见内存操作函数对比

函数名支持重叠内存性能表现适用场景
memcpy否高非重叠内存块复制
memmove是中等可能重叠的内存复制
graph TD A[原始数据 buffer] --> B{是否存在重叠?} B -->|是| C[使用 memmove] B -->|否| D[使用 memcpy] C --> E[安全完成复制] D --> E

第二章:memcpy 深度剖析

2.1 memcpy 函数原型与标准行为解析

函数原型与参数含义
void *memcpy(void *dest, const void *src, size_t n);
该函数定义在 <string.h> 头文件中,用于将内存区域从源地址 src 复制 n 个字节到目标地址 dest。参数 dest 和 src 均为无类型指针,表示任意类型的内存块。
标准行为特性
  • 按字节顺序复制,不检查重叠内存区域;
  • 返回指向目标内存 dest 的指针;
  • 若源或目标指针无效,行为未定义。
典型使用场景
适用于非重叠内存间的高效拷贝,如结构体复制、数组传输等。当存在内存重叠时,应使用 memmove 替代。

2.2 内存重叠场景下的未定义行为揭秘

在C/C++等底层语言中,当使用如 memcpy 等内存拷贝函数时,若源地址与目标地址存在重叠,将触发未定义行为(Undefined Behavior)。标准库函数未对重叠内存区域做特殊处理,导致程序行为不可预测。
典型问题示例

#include <string.h>
int arr[] = {1, 2, 3, 4, 5};
memcpy(arr + 1, arr, 3 * sizeof(int)); // 内存重叠
上述代码试图将数组前三个元素前移一位,但由于源 arr 与目标 arr+1 区域重叠,memcpy 可能覆盖尚未读取的数据,结果不可控。
安全替代方案
  • memmove:专为处理重叠内存设计,内部通过临时缓冲或方向判断确保数据完整性;
  • 手动实现从高地址向低地址拷贝,避免覆盖。
函数支持重叠性能
memcpy否高
memmove是略低

2.3 典型崩溃案例还原与调试分析

空指针解引用导致的程序崩溃
在C/C++开发中,空指针解引用是常见崩溃原因之一。以下代码模拟了典型场景:

#include <stdio.h>
int main() {
    char *ptr = NULL;
    printf("%c", *ptr);  // 崩溃点:解引用空指针
    return 0;
}
该代码在运行时会触发段错误(Segmentation Fault)。调试时通过GDB可定位到具体行号,并观察寄存器状态确认访问地址为0x0。
调试分析流程
  • 使用GDB加载核心转储文件:gdb ./app core
  • 执行bt命令查看调用栈
  • 结合info registers检查寄存器值
  • 利用print ptr验证指针状态
通过符号化堆栈信息,可快速锁定未初始化指针的函数调用路径,进而修复资源管理逻辑缺陷。

2.4 编译器优化对 memcpy 安全性的影响

现代编译器在提升程序性能时,可能对 memcpy 调用进行内联展开或替换为更高效的内存操作指令。这种优化虽提升了运行效率,但也可能引入安全隐患。
优化引发的未定义行为
当源和目标内存区域重叠时,memcpy 的行为是未定义的(应使用 memmove)。然而,编译器在内联优化过程中可能假设内存无重叠,导致生成错误代码:

void unsafe_copy(char *buf, size_t size) {
    memcpy(buf + 1, buf, size); // 内存重叠
}
上述代码在 -O2 以上优化级别下,GCC 可能将其替换为向量指令,忽略重叠问题,造成数据损坏。
可见性与内存屏障
在多线程环境中,编译器可能将 memcpy 移动到同步代码块之外,破坏数据一致性。使用 volatile 或内存屏障可抑制此类优化。
  • 避免在重叠内存场景中使用 memcpy
  • 关键路径添加 __builtin_assume_aligned 等提示
  • 通过 asm volatile 防止不安全重排

2.5 静态分析工具检测内存重叠实践

在C/C++开发中,内存重叠是常见且危险的缺陷,尤其在使用memcpy等底层函数时易引发未定义行为。静态分析工具能提前识别此类问题。
典型内存重叠场景
当源地址与目标地址区间存在交集时即发生内存重叠,例如:

void buggy_copy(char *buf, size_t len) {
    memcpy(buf + 1, buf, len); // 潜在重叠
}
该调用中源buf与目标buf+1地址重叠,应改用memmove。
主流工具检测能力对比
工具支持语言内存重叠检测
Clang Static AnalyzerC/C++✅ 高精度路径分析
PVS-StudioC/C++✅ 模式匹配告警
CppcheckC/C++⚠️ 基础范围推断

第三章:memmove 的安全机制

2.1 memmove 函数设计原理与实现策略

功能与场景分析
memmove 是 C 标准库中用于内存拷贝的关键函数,与 memcpy 不同,它能安全处理源地址与目标地址重叠的情况。该函数广泛应用于底层系统编程、数据结构移动等场景。
实现机制解析
为应对内存重叠,memmove 采用方向自适应策略:当源地址位于目标地址之前时,从前向后拷贝;否则,从后向前拷贝,避免数据覆盖。
void* memmove(void* dest, const void* src, size_t n) {
    char* d = (char*)dest;
    const char* s = (const char*)src;
    if (d < s) {
        // 前向拷贝
        for (size_t i = 0; i < n; i++)
            d[i] = s[i];
    } else {
        // 后向拷贝
        for (size_t i = n; i-- > 0; )
            d[i] = s[i];
    }
    return dest;
}
上述代码通过比较指针位置决定拷贝方向,确保在重叠区域下仍能正确执行。参数 dest 为目标地址,src 为源地址,n 为拷贝字节数,返回值为原始 dest 指针。

2.2 从源码看 memmove 如何处理重叠内存

memmove 的核心设计原则
与 memcpy 不同,memmove 能安全处理源地址与目标地址存在重叠的情况。其关键在于根据内存块的相对位置决定拷贝方向。

void* memmove(void* dest, const void* src, size_t n) {
    char* d = (char*)dest;
    const char* s = (const char*)src;

    if (d < s) {
        // 从前向后拷贝,避免覆盖未读数据
        for (size_t i = 0; i < n; i++) {
            d[i] = s[i];
        }
    } else if (d > s) {
        // 从后向前拷贝,防止提前覆盖
        for (size_t i = n; i-- > 0;) {
            d[i] = s[i];
        }
    }
    return dest;
}
上述实现中,当目标地址 d 高于源地址 s 时,采用逆序拷贝,确保不会覆盖尚未读取的源数据。反之则正序拷贝。这种判断机制是解决内存重叠问题的核心逻辑。
  • 正向拷贝适用于源地址低于目标地址的场景
  • 反向拷贝用于源地址高于目标地址的重叠情况

2.3 memmove 性能代价与安全性权衡分析

在处理内存重叠场景时,memmove 提供了比 memcpy 更安全的保障。其核心优势在于通过内部判断源与目标区域是否重叠,自动选择从前向后或从后向前拷贝,避免数据覆盖。
安全机制实现原理

void* memmove(void* dest, const void* src, size_t n) {
    char* d = (char*)dest;
    const char* s = (const char*)src;
    if (d < s) {
        // 从前向后拷贝
        while (n--) *d++ = *s++;
    } else {
        // 从后向前拷贝
        d += n; s += n;
        while (n--) *(--d) = *(--s);
    }
    return dest;
}
上述伪代码展示了 memmove 的双路径策略:当目标地址低于源地址时,从前向后拷贝;否则从后向前,防止写入污染未读取的数据。
性能代价分析
  • 额外的地址比较判断增加分支开销
  • 无法完全利用现代CPU的流水线优化
  • 在无重叠场景下,性能通常低于 memcpy

第四章:安全内存操作实战指南

4.1 替代方案对比:memmove vs 手动复制

在处理内存块移动时,memmove 和手动逐字节复制是两种常见策略。前者是标准库提供的安全函数,后者则通过循环实现。
性能与安全性对比
  • memmove 能正确处理源与目标区域重叠的情况;
  • 手动复制若未考虑方向(从前向后或从后向前),可能导致数据覆盖错误。
memmove(dest, src, n); // 安全处理重叠内存
该调用内部自动判断复制方向,确保数据完整性。参数 n 指定字节数,src 和 dest 可为任意对齐地址。
典型手动实现缺陷
方案优点缺点
for 循环从前复制逻辑简单重叠时数据污染
memmove安全、高效依赖库实现

4.2 高风险代码模式识别与重构示例

常见高风险模式识别
在维护遗留系统时,常遇到空指针引用、资源未释放和竞态条件等高风险代码。这些模式易引发运行时崩溃或数据不一致。
典型重构案例
以 Go 语言中的并发写入为例,原始代码存在竞态问题:
var counter int
for i := 0; i < 100; i++ {
    go func() {
        counter++ // 危险:未同步的写操作
    }()
}
该代码多个 goroutine 并发修改共享变量 counter,缺乏同步机制,导致结果不可预测。 使用互斥锁进行安全重构:
var counter int
var mu sync.Mutex
for i := 0; i < 100; i++ {
    go func() {
        mu.Lock()
        counter++
        mu.Unlock()
    }()
}
mu.Lock() 和 mu.Unlock() 确保每次只有一个 goroutine 能修改 counter,消除竞态条件。
重构效果对比
指标重构前重构后
线程安全否是
可维护性低高

4.3 构建内存安全的C语言编程规范

在C语言开发中,内存安全问题长期困扰开发者。为降低风险,需建立严格的编码规范。
初始化与释放一致性
所有动态分配的内存必须配对释放,避免泄漏。指针使用前应初始化为NULL。
推荐的安全函数替代方案
优先使用边界安全的函数族:
  • strncpy 替代 strcpy
  • fgets 替代 gets
  • snprintf 替代 sprintf

char buffer[64];
snprintf(buffer, sizeof(buffer), "%s:%d", name, age); // 限制写入长度
该代码确保字符串写入不会超出缓冲区边界,sizeof(buffer) 提供编译期大小检查,防止溢出。
静态分析工具集成
将Clang Static Analyzer或Cppcheck纳入CI流程,自动检测空指针解引用、内存泄漏等缺陷。

4.4 单元测试中模拟内存重叠的验证方法

在系统底层开发中,内存重叠是常见且危险的操作场景,尤其在处理`memmove`类函数时。为确保逻辑正确性,单元测试需精准模拟此类情况。
使用Mock框架构造重叠内存场景
通过Go语言的测试框架可手动构造重叠内存块,并验证数据迁移的完整性:

func TestMemoryOverlap(t *testing.T) {
    src := make([]byte, 10)
    for i := range src {
        src[i] = byte(i)
    }
    // 模拟重叠:目标区域与源区域部分重叠
    dst := src[3:]
    memmove(dst, src, 7) // 假设memmove支持重叠复制
    expected := []byte{0, 1, 2, 0, 1, 2, 3, 4, 5, 6}
    if !bytes.Equal(src, expected) {
        t.Errorf("内存重叠复制失败: got %v, want %v", src, expected)
    }
}
上述代码中,`src[3:]`与原始`src`存在地址重叠,测试用例验证了数据是否从前向后或从后向前正确复制,避免覆盖未读取数据。
关键验证点
  • 复制方向的正确性(前向/后向)
  • 边界地址的访问安全性
  • 最终数据完整性

第五章:正确选择与未来防御策略

技术选型的决策框架
在构建安全系统时,技术栈的选择直接影响长期维护成本与防御能力。应优先评估开源项目的社区活跃度、漏洞响应周期及依赖复杂度。例如,使用 npm audit 或 pip-audit 可自动化检测依赖风险。
  • 评估组件是否支持最小权限模型
  • 检查是否有定期的安全更新记录
  • 确认是否提供可验证的数字签名或SBOM(软件物料清单)
零信任架构的落地实践
传统边界防御已无法应对内部横向移动威胁。某金融企业通过部署基于 SPIFFE 的身份认证体系,实现服务间 mTLS 自动化签发,显著降低凭证泄露风险。
// 示例:SPIFFE Workload API 获取身份断言
resp, err := http.Get("http://localhost:8181/spiffe/bundle")
if err != nil {
    log.Fatal(err)
}
spiffeBundle := parseBundle(resp.Body)
validateServiceIdentity(spiffeBundle)
自动化响应机制设计
结合 SIEM 与 SOAR 平台,可定义如下事件响应流程:
触发条件响应动作执行系统
异常登录地理位置临时锁定账户 + 发送 MFA 挑战IdP + SOAR
关键文件批量加密隔离主机 + 启动内存取证EDR + 编排引擎
[检测层] → [分析引擎] → [决策网关] → [执行端点] ↑ ↓ [威胁情报源] [日志归档与审计]
华中科技大学 计算机组成原理 educoder Logisim平台 计算机数据表示实验 本文主要是对 计算机数据表示实验的笔记和相关Logisim平台的图,供大家学习交流使用。 需要源文件或者源代码,可以留言评论! 目录实验目的第1关:汉字国标码转区位码实验第2关:汉字机内码获取实验第3关:偶校验编码设计第4关:偶校验解码电路设计第5关:16位海明编码电路设计第6关:16位海明解码电路设计第7关:海明编码流水传输实验第8关:16位CRC并行编解码电路设计第9关:CRC编码流水传输实验实验结果: 实验目的 本实训将帮助同学们巩固对计算机中数据表示方法的理解,要求能设计汉字国标码与区位码之间的转换 阅读详情

相关推荐

数字加网(一)— —概念及分色合成

由于大多数图像复制设备是二值设备,因此在图像复制过程中,必须先把连续调的灰度图像或彩色图像处理成二值的半色调图像,用单位面积的网点覆盖率来表现图像的颜色深浅变化。这个过程被称之为加网(Screening) 数字加网就是根据人眼视觉的空间混色特性,用人眼无法分辨的细小黑白点的单位覆盖面积来模拟灰度图像或彩色图像的层次变化,使得到

Sin_Geek成长の迹 8591

memcpy并发场景下、srclen < dstlen出现的问题

memcpy并发场景下、srclen < dstlen出现的问题

John_ToStr的博客 1400

美团外卖 mtgsig 1.2 逆向工程与补环境实战指南

本文深入解析了美团外卖核心风控参数mtgsig 1.2的生成机制与逆向实战。通过拆解其复杂的JSON结构,揭示了设备指纹、环境信息加密等关键字段。重点阐述了在Node.js中模拟浏览器环境(补环境)的核心方法,包括DOM/BOM对象、本地存储及Canvas/WebGL等高级指纹的模拟技巧,为安全研究和合规自动化测试提供了一套完整的技术指南。

uber9的博客 409

memcopy 导致的代码崩溃问题,memcpy的三大踩坑记

//CARD_SERIAL_NUM=16 char SerialNumber[CARD_SERIAL_NUM]; //屏蔽这个会crash,打开则不会,为什么必须初始化呢 //memset(SerialNumber,0,CARD_SERIAL_NUM); //pI20Algo.cartridge.serial_number 是一个char[16]的数组,strlen(pI20Algo.cartridge.serial_number)=12 memcpy(SerialNumber,pI20Algo.

weixin_42731088的博客 1万+

用Blender给ArduPilot无人船编队设计灯光秀:从建模到飞行的保姆级教程

本文详细介绍了如何利用Blender和ArduPilot为无人船编队设计灯光秀的全流程技术方案。从3D动画设计、坐标转换、数据导出到ArduPilot飞控配置和灯光控制,提供了一套完整的保姆级教程,帮助开发者实现水面灯光编队表演。

weixin_29213525的博客 386

【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)

本文介绍 Windows 环境下无需安装 Visual Studio,搭建 Qt6 与 MSVC2022 开发环境的方法,以节省磁盘空间。核心步骤包括:用中科大镜像提速 Qt6 在线安装,需勾选 Qt Creator 17.0.1、MSVC 2022 x64 等组件;配置环境变量,添加 mingw_64、msvc2022_64 及 Qt Creator 的二进制目录;安装 MSVC 2022 编译器与 Windows 10 SDK 并记录版本;配置 Qt Creator 构建套件,可选设置 vcvarsal

油炸自行车的博客 2922

memcpy内存重叠的解决

内存区域重叠是指内存区域 和内存区域 有重叠。只是简单的内存拷贝,没有考虑内存有重叠的情况,如果内存有重叠,其行为是不确定的。考虑内存重叠的情况,即使内存有重叠也能正常拷贝。一般来说,如果自己能确定拷贝内存没有重叠,用 比用 更高效,如果有重叠,则只能用 ref:memmove 和 memcpy的区别以及处理内存重叠问题_码城的博客-优快云博客_memcpy内存重叠write-bug memcpy内存重叠的解决 - wangicter的博客 - 博客园memcpy内存重叠的解决 - CodeAntenna

wwwlyj123321的博客 2261

香橙派5b 移植 imx415

修改设备树,以为例,关闭ov13855,添加imx4151;0;1;0;1;0;1;0;1;0;1;0;1;0;以此类推,修改三个dtsi。

ChenYX的博客 4530

5.5 堆溢出利用(下)——代码植入

堆溢出

qq_55202378的博客 1356

在blender中安装vtk插件

Blender 是一个开源的、功能强大的3D计算机图形软件,广泛用于创建动画片、视觉效果、艺术作品、3D打印模型、互动3D应用程序和视频游戏。Blender 是由 Blender 基金会开发和维护的,具有丰富的功能和灵活的扩展性。在github上下载zip插件。

如果想成为中心,那么就到中心去吧。 293

第9集:AI 驱动的智能日志分析!用 RAG 实现秒级日志检索与异常检测

文章摘要:AI驱动的智能日志分析系统 本文介绍了一个基于RAG(检索增强生成)技术的智能日志分析解决方案,旨在解决传统日志系统中的三大痛点:机械的关键词搜索、缺乏语义理解、告警与日志割裂。系统通过以下步骤实现: 环境准备:安装必要的Python依赖库,包括日志处理、Elasticsearch/Loki连接和时序异常检测工具。 核心设计:构建日志处理流水线,分为日志采集、向量化存储和AI检索分析三个阶段,创建专门的日志分析Agent。 技术实现:使用ChromaDB存储日志向量,通过HuggingFace E

qq_2937655951的博客 79

C++ STL常用算法总结

算法:问题的求解步骤,以有限的步骤,解决数学或逻辑中的问题。 STL中的算法主要分为两大类:与数据结构相关算法(容器中的成员函数)和通用算法(与数据结构不相干)。STL中通用算法总共有70多个,主要包含:排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等。 今天我介绍我经常会用到的算法。 accumulate 元素统计 template <class InputItera...

一条二哈 590

Ubuntu零基础教学-如何把Ubuntu20.04界面从英文修改为中文?| 超级详细,建议收藏

带你如何把Ubuntu20.04界面从英文修改为中文?| 超级详细,建议收藏

**My Coding Family** 5338

内存重叠以及memcpy和memmove函数详解

内存拷贝(memcpy函数)时或者在自己实现内存拷贝函数strcpy时,如果存在目标地址在原地址的范围内就造成了内存重叠。

m0_73537205的博客 983

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

c/c++内存重叠

memcpy 与 strcpy 都没有内存重叠的问题,实际可以根据需要使用 memmove。本文介绍了 C++ 中的内存重叠问题,指出了指针的使用是内存重叠的主要原因,并提供了避免内存重叠的方法,如尽量避免使用指针,确保指针指向的内存区域与其他区域没有交叉部分,使用安全的内存操作函数等。此外,还介绍了memmove函数如何避免内存重叠的影响。

litterboys的博客 1011

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C/C++总结笔记——关键字4: memcpy及其内存重叠、memmove

C/C++总结笔记

LW_12345的博客 1104

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

笔记-测试崩溃之memcpy_s

昨天晚上提测,今天早上测试发来贺电,程序崩溃!!!!!! 而问题出在memcpy_s errno_t memcpy_s( void *dest, size_t numberOfElements, const void *src, size_t count );下面是栈还原后: 真正的原因: 数据的源有问题。 访问不可访问的内存。 ...

angehui8702的博客 949

使用memcpy踩出来的坑,值得注意

背景描述: 最近在一个qt项目中,数据传输部分多次使用了memcpy,程序编译没有一个警告或报错,但是一运行起来就不稳定了,有时甚至不能运行起来,有时跑起来能传输几条数据,有时又能接收到几十条数据,但最终程序都会异常crashed!!甚是恼火!排除问题找了半天,野指针,数组越界,内存泄露都认真检查了几遍,实在没有找到问题出在哪,最后只能采用最笨的办法,把代码分模块注释掉,逐步锁定问题范围,最后才发...

qq_40754866的博客 2万+

内存函数memcpy、memmove原理及模拟实现

内存函数memcpy、memmove的原理及具体模拟实现

m0_54991409的博客 3036

memcpy 与 memmove

memcpy函数是一个用于内存复制的函数,声明在 string.h 中(C++是 cstring)。作用是:以source指向的地址为起点,将连续的n个字节数据,复制到以destin指向的地址为起点的内存中。函数有三个参数,第一个是目标地址,第二个是源地址,第三个是数据长度。

2301_76445610的博客 1649

std::copy与memcpy比较

std::copy和memcpy都可以用于内存块之间的复制操作,但有几个重要的异同点,这里记录一下

hanhan的博客 7130

看着貌似吓人的底层问题,其实错在原本的自身

看着貌似gcc的O3优化问题,其实源自程序自身结构体定义和使用问题,导致的栈内存被非法写入,进而造成崩溃问题

一把菜刀行江湖 618

对内存重叠的深入认识

内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。 在函数strcpy和函数memcpy都没有对内存重叠做处理的,使用这两个函数的时候只有程序员自己保证源地址和目标地址不重叠,或者使用memmove函数进行内存拷贝。 memmove函数对内存重叠做了处理。 现在来看函数strcpy 原型:extern char *strcpy(char *dest,ch

feitianxuxue的专栏 1万+

由memcpy越界引起的崩溃

一个linux的cm出了问题,在开发环境下,是正常的。在现场是崩溃的。比较环境的区别,输入的数据不一样。还好运气不错,拿到现场的数据,在开发环境中也能重现其中一个数据引起的崩溃问题。崩溃现象,单步到函数fnA, 任务都做了,看任务结果也都有效,但是从函数返回时,还没到调用处,就崩溃了。这bug现象,我第一感觉就是发生了数据写的越界,导致栈上的返回地址被覆盖成了意料之外的地址。因为其中一条数据可以重现bug, 就去单步,开始没看出来。

博客标题不能为空 9211

memcpy引起错误的解决

memcpy引起了程序奔溃,定位到问题后百思不得其解,网上搜了一下,发现src为空会引起奔溃,然后程序中打印了一下,果然为空,经过多方查找,原来是当初入库时有文件没有正确解压缩,导致读取不到像素信息,所以引起了奔溃问题,花了一个小时解决,特此记录一下 ...

fanhenghui的专栏 5588

你真的会用memcpy吗?一个重叠内存bug让系统崩溃三天

掌握C语言memcpy与memmove区别,避免内存重叠导致的程序崩溃。详解两者适用场景、复制方向及安全性差异,揭示系统级bug根源。正确选择函数保障数据安全,提升代码稳定性,值得收藏。

GatherLume的博客 830
上一篇: 揭秘C语言大型项目构建难题:如何用Makefile实现高效多文件编译
下一篇: C语言哈希表实现全流程详解,链地址法让你彻底理解散列机制
BytePulse
博客等级 码龄1年 163粉丝 2177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值