网站上推广游戏怎么做,做鞋的贸易公司网站怎么做好,西安网页设计培训,软件大全下载app免费[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 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) ;
[总结] 上面的内容是非常重要且很细节的东西, 这是安全编程必不可少的知识点. 希望对大家有帮助.
[下面附上截图, 让大家理解得更加透彻]