安全拷贝函数safe_memcpy实现分析
创作时间:
作者:
@小白创作中心
安全拷贝函数safe_memcpy实现分析
引用
CSDN
1.
https://blog.csdn.net/wangzhicheng1983/article/details/117366294
memcpy是C语言中常用的内存拷贝函数,但其存在缓冲区溢出和重叠拷贝等安全风险。本文将分析memcpy的缺陷,并介绍一个更安全的内存拷贝函数safe_memcpy的实现原理和使用方法。
一、memcpy缺陷分析
- memcpy原型:
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);
// 函数返回dest指针
- 缺陷分析:
(1)memcpy容易发生缓冲区溢出,如果dest长度小于待拷贝的字节数n,那么程序将发生缓冲区溢出;
(2)如果dest是高地址,src是低地址,拷贝可能发生错误,即源地址和目的地址重合部分在拷贝时被修改。
综上所述:memcpy参数较为简单,没有对程序安全性做进一步限制,将导致某些致命错误。
二、safe_memcpy实现分析
- 原型:
bool safe_memcpy(void *dst, const void *src, size_t len, const void *start, const void *end);
// dst指向目的地址
// src指向源地址
// len是待拷贝的字节数
// start指向目的地址开始地址
// end指向目的地址结束地址 即最后一个元素的后一个地址
- 实现分析:
safe_memcpy.hpp
#pragma once
#include <stdint.h>
#include <string.h>
static inline bool between(const uint8_t *start, const uint8_t *end, const uint8_t *p) {
return (p < end) && (p >= start); // 注意是p < end不是p <= end
}
static inline bool safe_check(void *dst, size_t len, const void *start, const void *end) {
if (len < 1) {
return false;
}
if (!dst || !start || !end) {
return false;
}
void *last_pos = ((uint8_t *)dst) + len - 1;
if (last_pos < dst) { // last_pos不能小于dst
return false;
}
return between((uint8_t *)start, (uint8_t *)end, (uint8_t *)dst) && // dst在start与end之间
between((uint8_t *)start, (uint8_t *)end, (uint8_t *)last_pos); // last_pos即待拷贝区间最后元素地址也必须在start与end之间
}
static inline bool safe_memcpy(void *dst, const void *src, size_t len, const void *start, const void *end) {
if (!safe_check(dst, len, start, end)) {
return false;
}
if (!src) {
return false;
}
memcpy(dst, src, len);
return true;
}
(1)解决缓冲区溢出问题:调用safe_memcpy需要指定目的地址的开始和结束地址,safe_memcpy会检查目标空间是否能够容纳待拷贝字节数;
(2)解决低地址向高地址拷贝错误:如果源地址和目的地址部分区间重叠,通过指定start和end,safe_memcpy使用between((uint8_t *)start, (uint8_t *)end, (uint8_t *)last_pos)可以进行安全性判断。
- 测试:
test.cpp
#include <iostream>
#include "safe_memcpy.hpp"
int main() {
char src[64] = "123";
char dst[64] = "";
safe_memcpy(dst, src, strlen(src), dst, dst + 64);
std::cout << dst << std::endl;
return 0;
}
热门推荐
个税起征点提至1万,谁最受益?
个税起征点上调,你的钱包变鼓了吗?
最新研究:晚上运动助脂肪肝患者改善代谢
美国FDA批准Resmetirom,非酒精性脂肪肝炎治疗迎来突破
水飞蓟素护肝片配合饮食调整,专家推荐脂肪肝防治方案
大众宝来蓝牙连接全攻略:从入门到精通
世行采用AI强化合规调查,阻碍行为成制裁新重点
糖尿病患者饮酒需谨慎:初期升糖,后期易致低血糖
糖尿病患者饮酒需谨慎,这4种情况要当心
轻松掌握QQ聊天记录深度清理技巧,让聊天更流畅,告别卡顿烦恼
心宽了,病就退了:积极心态对健康的影响
从《何者》到崔迪:求职迷茫中的另类启示
《何者》:一部揭示求职心理困境的青春之作
安全用电知识科普
冬季暖心美食:板栗烧鸡的制作秘诀与文化寓意
探寻日本校服的起源和文化意义
五类校服专属清洗指南:让青春的记忆保持洁净如新
秋季穿搭秘籍:15度气温下的时尚保暖法则
15度穿什么最潮?轻薄羽绒服和风衣这样搭最好看
早春乱穿衣?这份指南让你时尚又保暖!
58AH、100AH、150AH的电动三轮车,几度电能充满?续航多少公里?
2025年买电动车,行内人都选这3种配置车型,价格实惠,实用性强
苏帮菜代表 松鼠桂鱼
桂鱼的营养价值及功效与作用及禁忌分别是什么?
第25个全国爱耳日:高音量听音乐对听力伤害大,专家建议遵循“60-60-60”原则
期末总结写作技巧大揭秘!
坚韧少女遇深情妖神:《白月梵星》白烁梵樾情感解析
生杏仁的美味探索:多样吃法与健康益处
杏仁与多种食物的完美搭配指南
核桃养生糕(核桃糯米糕)制作详解