[原创]Delphi的SizeOf(), Length(), 动态数组, 静态数组的关系.

news2024/11/19 6:30:52

[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
QQ: 643439947
个人网站: 80x86汇编小站 https://www.x86asm.org
编程生涯: 2001年~至今[共22年]
职业生涯: 20年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
从Delphi XE时代开始, 编译器就默认使用宽字节模式编译了. Char默认转换为WChar, 然后一切API函数默认使用W模式. 这是非常好的开端. 但是也造成在代码迁移的过程中, 会出现非常隐蔽的BUG.

[下面是非常重要的细节, 一定要认真理解, 如果看不懂, 那就证明你的程序, 后期会有很大的安全隐患]

代码1: 静态数组

char_TargetPathBuf     : array[0..4] of Char; // 声明具有5个Char的静态数组
var int_Size : Integer := SizeOf(Char) ;      // 返回2, 因为默认是WChar, 具有2个字节Bytes
var int_Size_Array_Len : Integer := Length(char_TargetPathBuf) ; // 返回5, 表示该数组有5个元素
var int_Size_Array     : Integer := SizeOf(char_TargetPathBuf) ; // 返回10, 表示该数组占用10个字节.

注意如下表达式: 

SizeOf(char_TargetPathBuf) = Length(char_TargetPathBuf) * SizeOf(Char) // 两者是等效的. 但是推荐使用右边的写法.

初始化静态数组:

ZeroMemory(@char_TargetPathBuf, Length(char_TargetPathBuf)*SizeOf(Char)) ;
ZeroMemory(@char_TargetPathBuf[0], Length(char_TargetPathBuf)*SizeOf(Char)) ;
FillChar(char_TargetPathBuf, SizeOf(char_TargetPathBuf), 0) ;
FillChar(char_TargetPathBuf, Length(char_TargetPathBuf)*SizeOf(Char), 0) ;

这里要注意: char_TargetPathBuf表示具有5个Char字符的静态数组而不是数组指针, 因此在使用ZeroMemory的时候, 通过@char_TargetPathBuf取得该静态数组的指针. 也可以通过@char_TargetPathBuf[0]获取.

代码2 动态数组

dya_TargetPathBuf : array of Char ; // 声明一个动态数组, 名为dya_TargetPathBuf
SetLength(dya_TargetPathBuf, 5) ;  // 为动态数组初始化为5个Char字符容量大小, 内容默认是0
var int_Size_Array_Len : Integer := Length(dya_TargetPathBuf) ; // 返回5, 表示该数组有5个元素
var int_Size_Array     : Integer := SizeOf(dya_TargetPathBuf) ; // 返回4, 这里为什么会返回4, 而不是10呢?

重点注意: SizeOf(dya_TargetPathBuf) = 4, 无论你分配多大的容量, 都是等于4.
因为dya_TargetPathBuf是动态数组类型, 它默认是一个指针类型, 它是一个指向存放数组指针的指针. 也就是通常说的二级指针. 下面用代码表示:

var dya_Address : PCardinal := @dya_TargetPathBuf ; // 通过"@"操作符, 取得动态数组指针.
var dya_Array_Pointer : Cardinal := dya_Address^;   // 通过"^"操作符, 取得指向数组指针. 这个就是真正指向数组数据的指针了.

明白上面的两行代码之后, 就可以理解下面的"动态数组初始化"的写法.

ZeroMemory(PChar((@dya_TargetPathBuf)^), Length(dya_TargetPathBuf)*SizeOf(Char)) ;
ZeroMemory(Pointer(dya_TargetPathBuf), Length(dya_TargetPathBuf)*SizeOf(Char)) ;
FillChar(dya_TargetPathBuf[0], Length(dya_TargetPathBuf)*SizeOf(Char), 0) ;

[总结]
上面的内容是非常重要且很细节的东西, 这是安全编程必不可少的知识点. 希望对大家有帮助.

[下面附上截图, 让大家理解得更加透彻]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中学老师求职简历(精选9篇)

以下简历内容以中学老师招聘需求为背景,我们整理并修改了9篇全面、专业且具有参考价值的简历案例,大家可以灵活借鉴,希望能帮助大家在众多候选人中脱颖而出。 中学老师简历下载(可在下制作下载):百度幻主简…

表的创建和管理

表的创建和管理 一条数据的存储过程标识符的命名规则MySQL中的数据类型管理和创建数据库创建数据库使用数据库修改数据库 创建表创建方式1创建方式2查看数据表结构 修改表追加一个列修改一个列重命名一个列删除一个列 重命名表删除表清空表 一条数据的存储过程 存储数据是处理数…

pycharm closing卡住 解决办法

别处看到的,亲测有效 1.升级 pycharm 到 2023.3 2.pycharm 主页 Help -> Find Action -> 输入 Registry -> 禁用ide.await.scope.completion PyCharm 2023.1.2版本关闭后一直显示正在关闭项目 - 知乎

CentOS系统环境搭建(二十一)——安装git并且配置ssh拉取github代码

centos系统环境搭建专栏🔗点击跳转 文章目录 安装git并且配置ssh拉取github代码1.git初始配置2.设置ssh3.设置GitHub4.拉取代码 安装git并且配置ssh拉取github代码 1.git初始配置 安装 yum install git验证 git --version配置用户名(记得用你自己的…

C++中异常的栈展开概念

C中的异常栈展开是指,当某个函数中有异常产生(这里不考虑是主动抛出的还是被动产生的),在异常被捕获之前的函数调用链上,函数不会正常执行返回,即异常产生之后的程序逻辑不会被执行。 (注意&…

HarmonyOS开发准备(一) TypeScript基本语法

HarmonyOS开发准备(一) TypeScript基本语法 TypsScript官网:https://www.typescriptlang.org/play 可在官网 Playround 在线运行 Typescript 一、变量声明 // 创建 number(数值) 类型变量 let test_number: number 111 console.log(test_number:, tes…

教你把ChatGPT训练抖音爆款文案(附提示词)

刚好有圈子同学问到:如何把ChatGPT训练成1个抖音爆款写手,相信很多小伙伴日常也存在类似需求,用好一个GPT,让月薪5K的小助理快速变成3万月薪的运营。本期就给大家安排一期ChatGPT教程。接下来手把手演示ChatGPT调教和提示词方式一…

福州大学《嵌入式系统综合设计》实验十三:RTSP拉流与RTMP推流

一、实验目的 掌握基于算能平台的JPEG压缩编码方法以及开发环境,包括开发主机环境搭建,硬件嵌入式开发板的连接,云平台的配置,编码程序的编译、运行等。 二、实验内容 搭建实验开发环境,并编写静止图像jpeg格式编解…

如何在Python中对Dynamsoft Barcode Reader性能进行基准测试

Dynamsoft Barcode Reader SDK一款多功能的条码读取控件,只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK,…

ThinkPHP 2.x任意代码执行漏洞

任务一: 复现环境中的代码漏洞 任务二: 尝试利用代码执行漏洞读取服务器web目录下的文件列表。 任务一: 1.搭建环境: 2.在php环境下直接输入{${phpinfo}}测试代码片段 2.写入一句话木马,用antsword连接&#xff0…

Java数据结构之《循环队列》题目

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完…

夯实c基础

夯实c基础 区别: 图一的交换,(交换的是地址而不是两数)无法实现两数的交换。 题干以下程序的输出结果为( c  )。 void fun(int a, int b, int c){ ca*b; } void main( ){ int…

【Unity】Blender场景导入

素材 下载场景:https://www.aplaybox.com/details/model/keDSIks72Qh3 blender文件导出为.fbx文件,路径选择复制(做的过程太乱了不知道有没有影响),物理类型选择网格,勾选应用变换 blender下的物体长度是u…

openbabel 安装 生成指纹方法

今日踩坑小结: openbabel 安装: 可以装,但是得在 Linux 环境下,win 环境装会报错(安装不会报错,但是生成指纹的时候会) 指纹: 在下面这个链接里,官方给出了命令行调用 o…

袖珍可穿戴手持气象仪是什么?

随着科技的不断发展,我们身边的世界正在变得越来越智能化。近日,一款名为WX-SQ12可穿戴手持气象仪的科技新品引起了人们的广泛关注。这款气象仪不仅具有创新性的可穿戴设计,还具备强大的气象数据监测功能,让用户可以随时掌握天气变…

nvm安装管理nodejs版本

1:如果之前先安装了nodejs先卸载nodejs 2:下载nvm,点击下载路径https://github.com/coreybutler/nvm-windows/releases,选择相应环境下载,如下window环境下载 下载成功后,选择NVM安装在哪个文件目录下&…

【图论】重庆大学图论与应用课程期末复习资料2-各章考点(计算部分)(私人复习资料)

图论各章考点 二、树1、避圈法(克鲁斯克尔算法)2、破圈法3、Prim算法 四、路径算法1、Dijkstra算法2、Floyd算法 五、匹配1、匈牙利算法(最大权理想匹配(最小权权值取反)) 六、行遍性问题1、Fleury算法&…

从 Oracle 到 TiDB,全链路数据迁移平台核心能力和杭州银行迁移实践

作者:邵健 杭州银行数据库专家 王辉 PingCAP 杭州银行在 TMS beta 阶段就进行了深度的测试体验,在过程中提供了大量的宝贵建议,帮助 TMS 进行了快速的优化和迭代。近期杭州银行借助 TMS 进行了多次 Oracle 生产数据库的迁移实践,…

双远心镜头:让视觉检测更精准、高效!

工业镜头是视觉系统中的重要组件,工业镜头的选型影响着整个系统的成像效果。在做视觉检测时,会遇到无法检测空间物体、无法控制视场变化、无法控制图像扭曲、对比度低、畸变大、反光等问题,这时普通的工业镜头并不能有效地解决问题&#xff0…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用系统目录文件处理工具

文章目录 1️⃣ TypeScript操作电脑目录和文件1.1 获取磁盘信息1.2 获取目录下所有文件夹和文件1.3 新建文件夹1.4 新建文本1.5 重命名1.6 删除文件夹1.7 删除文件1.8 打开系统文件或系统文件夹1.9 根据字节转换文件大小带单位 优质资源分享 作者:xcLeigh 文章地址&…