• 第十二章 基本数据类型


    数值概论

    下面一些建议能够使你在使用数的时候少犯错误。

    • 避免使用神秘数值
      • 修改会变得更可靠;
      • 修改会变得更容易;
      • 你的代码变得更可读。
    • 如果需要可以使用硬编码的0和1;
    • 预防除零错误;
    • 使类型转换变得明显;
    • 避免混合类型的比较;
    • 注意编译器的警告。

    整数

    在用整数的时候,要注意下面的注意事项。

    • 检查整数除法;
    • 检查整数溢出;
    • 检查中间结果溢出。

    浮点数

    使用浮点数应遵循的原则:

    • 避免数量级相差巨大的数之间的加减运算;
    • 避免等量判断;
    • 处理舍入问题:
      • 换用一种精度更高的变量类型;
      • 换用二进制编码的十进制变量;
      • 把浮点变量变成整数变量;
    • 检查语言和函数库对特定数据类型的支持。

    字符和字符串

    使用字符串的技巧:

    • 避免使用神秘字符和神秘字符串;
    • 避免off-by-one错误;
    • 了解你的语言和开发环境是如何支持Unicode的;
    • 在程序生命周期中尽早决定国际化/本地化策略;
    • 如果你知道只需要支持一种文字的语言,请考虑使用ISO 8859字符集;
    • 如果你需要支持多种语言,请使用Unicode;
    • 采用某种一致的字符串类型转换策略。

    C语言中的字符串

    直接处理C字符串避免常见错误的方法。

    • 注意字符串指针和字符串数组之间的差异:
      • 警惕任何包含字符串和等号的表达式;
      • 通过命名规则区分变量是字符串数组还是字符串指针。
    • 把C-style字符串的长度声明为CONSTANT + 1;
    • 用null初始化子串串以避免没有终端的字符串;
    • 用字符数组取代C中的指针;
    • 用strncpy()取代strcpy()以避免无终端的字符串。

    布尔变量

    • 用布尔变量对程序加以文档说明;
    • 用布尔变量来简化复杂的判断;
    • 如果需要的话,创建你自己的布尔类型。

    枚举类型

    • 用枚举类型来提高可读性;
    • 用枚举类型来提高可靠性;
    • 用枚举类型来简化修改;
    • 将枚举类型作为布尔变量的替代方案;
    • 检查非法数值;
    • 定义出枚举的第一项和最后一项,以便用于循环边界;
    • 把枚举类型的第一个元素留作非法值;
    • 明确定义项目代码编写标准中的第一个和最后一个元素的使用规则,并且在使用时保持一致;
    • 警惕给枚举元素明确赋值而带来的失误;

    具名常量

    具名常量很像变量,一旦赋值以后就不能再修改了。

    • 在数组声明中使用具名常量;
    • 避免使用文字量,即使是安全的;
    • 用具有适当作用域变量或者类来模拟具名常量;
    • 统一地使用具名常量。

    数组

    数组是最简单和最常用的结构化数据类型。

    • 确认所有的数组下标都没有超出数组边界;
    • 考虑用容器来取代数组,或者将数组作为顺序化结构来处理;
    • 检查数组的边界点;
    • 如果数组是多维的,确认下标的使用顺序是正确的;
    • 提防下标串话;
    • 在C中结合ARRY_LENGTH()宏来使用数组。

    核对表:基本数据类型

    数值概论

    • [ ] 代码中避免使用神秘数值吗?
    • [ ] 代码考虑了除零错误吗?
    • [ ] 类型转换很明显吗?
    • [ ] 如果在一条语句中存在两种不同类型的变量,那么这条语句会像你期望的那样吗?
    • [ ] 代码避免了混合类型的比较吗?
    • [ ] 程序编译时没有警告信息吗?

    整数

    • [ ] 使用整数除法的表达式能按预期的那样工作吗?
    • [ ] 整数表达式避免整数溢出问题吗?

    浮点数

    • [ ] 代码避免了对数量级相差巨大的数字做加减运算吗?
    • [ ] 代码系统地阻止了舍入错误的发生吗?
    • [ ] 代码避免对浮点数做等量的比较吗?

    字符和字符串

    • [ ] 代码避免使用神秘字符和神秘字符串吗?
    • [ ] 使用字符串时避免了off-by-one错误吗?
    • [ ] C代码把字符串指针和字符串数组区别对待了吗?
    • [ ] C代码遵循了把字符串声明为CONSTANT + 1长度的规则了吗?
    • [ ] C代码在适当的时候用字符数组来代替指针了吗?
    • [ ] C代码把字符串初始化为NULL来避免无终端的字符串了吗?
    • [ ] C代码用strncpy()代替strcpy()吗?strncat()和strncmp()呢?

    布尔变量

    • [ ] 程序用额外的布尔变量来说明条件判断了吗?
    • [ ] 程序用额外的布尔变量来简化条件判断了吗?

    枚举类型

    • [ ] 程序用枚举类型而非具名常量来提高可读性、可靠性和可修改性吗?
    • [ ] 当变量的用法不能仅用true和false表示的时候,程序用枚举类型来取代布尔变量吗?
    • [ ] 针对枚举类型的测试检测了非法数值了吗?
    • [ ] 把枚举类型的第一条目保留为“非法的”了吗?

    具名常量

    • [ ] 程序用具名常量而不是神秘数值来声明数据和表示循环界限吗?
    • [ ] 具名常量的使用一致吗?——没有在有些位置使用具名常量又在其他位置使用文字量?

    数组

    • [ ] 所有数组下标都没有超出数组边界吗?
    • [ ] 数组引用没有出现off-by-one错误吗?
    • [ ] 所有多维数组的下标使用都正确吗?
    • [ ] 在嵌套循环里,把正确的变量用于数组下标来避免循环下标串话了吗?

    创建类型

    • [ ] 程序对每一种可能变化的数据分别采用不同的类型吗?
    • [ ] 类型名是以该类型所表示的现实世界实体为导向,而不是以编程语言类型为导向的吗?
    • [ ] 类型名的描述性足够强,可以帮助解释数据声明吗?
    • [ ] 你避免重新定义预定义类型吗?
    • [ ] 与简单地重定义一个类型相比,你考虑过创建一个新类吗?

    要点

    • 使用特定的数据类型就意味着要记住适用于各个类型的很多独立原则;
    • 如果你的语言支持,创建自定义类型会使得你的程序更容易修改,并更具有描述性;
    • 当你用typedef或者其等价方式创建了一个简单类型的时候,考虑是否更应该创建一个新的类。
  • 相关阅读:
    逆向知识第八讲,if语句在汇编中表达的方式
    逆向知识第七讲,三目运算符在汇编中的表现形式,以及编译器优化方式
    逆向知识第六讲,取摸优化的几种方式
    逆向课程第五讲逆向中的优化方式,除法原理,以及除法优化下
    逆向课程第四讲逆向中的优化方式,除法原理,以及除法优化上
    逆向课程第三讲逆向中的优化方式,以及加减乘
    逆向课程第二讲,寻找main入口点
    脱壳第三讲,UPX压缩壳,以及补充壳知识
    脱壳第二讲,手动脱壳PECompact 2.x
    脱壳第一讲,手工脱壳ASPack2.12的壳.ESP定律
  • 原文地址:https://www.cnblogs.com/liam-ji/p/11520568.html
Copyright © 2020-2023  润新知