编程好习惯-类型检查

公司一款手持终端,是在老产品代码的基础上研发,经常发生死机问题,死机原因很大部分是代码不严谨导致,今天排查遇到一个整型溢出导致的死机问题:

在foo.c文件中定义有 char g_sds_length = 0;

在foo.h文件中声明为 extern char g_sds_length;

但是在bar.c中有定义有

    void api_sds_rec_handle()
    {
        int rec_sds_length;
        g_sds_length = rec_sds_length;
        
        ......
    }

这里存在两个问题导致死机:

  1. rec_sds_length未初始化;
  2. g_sds_length与rec_sds_length定义类型不一致;
  3. 取值范围在0-255的g_sds_length被Int型随机值初始化,导致死机。

如何避免类似的问题产生?

可以通过更严格的类型检查来预防此类问题,如:

typedef struct { char length} sds_length_t;
sds_length_t g_sds_length = {0};

不直接定义为char型是为了更严格的类型检查,而且是编译器在编译过程中自动检查:

void api_sds_rec_handle()
{
    int rec_sds_length;
    g_sds_length = rec_sds_length; //此处编译器将报错
    
    ......
}

总结:好的习惯可以预防问题,坏的习惯将产生问题。

时间: 2024-10-10 07:51:34

编程好习惯-类型检查的相关文章

使用装饰器进行函数类型检查

动态类型的特性使得Python函数在被调用时,其参数类型不易被知晓.或者,为了动态支持多类型,实际参数的类型由调用者提供.如下: def add(x, y): return x + y print(add(2, 3)) # 5 print(add('Hello', ' World')) # Hello World 上面的例子可以看出,函数参数并没有指定类型,使得该函数支持多种类型,这也正是Python语言的特殊之处. 但有时候,我们想限制函数的参数类型.这时很多人会想到类型提示(Type Hin

Java 编程思想 Chapter_14 类型信息

本章内容绕不开一个名词:RTTI(Run-time Type Identification) 运行时期的类型识别 知乎上有人推断作者是从C++中引入这个概念的,反正也无所谓,理解并能串联本章知识才是最重要的 本章的内容其实都是为类型信息服务的,主要内容有 一.Class对象 问题: 1.Class对象的创建过程是怎么样的 2.Class对象有哪几种创建方式,之间有什么差异 3.使用泛型 在了解类型信息之前,需要了解class对象 创建class对象,需要先查找这个这个类的.class文件, 查找

Java 笔记(四) RTTI - 运行时类型检查

运行时类型检查,即Run-time Type Identification.这是Java语言里一个很强大的机制,那么它到底给我们的程序带来了什么样的好处呢? 在了解运行时类型检查之前,我们要首先知道另一个密切相关的概念,即运行时类型信息(Run-time Information - 也可以缩写为RTTI) 运行时类型信息使得你可以在程序运行时发现和使用类型信息. 来自:<Thinking in Java>. OK,那么我们总结来说,RTTI就是能够让我们在程序的运行时去获取类型的信息.接下来我

vue项目配置使用flow类型检查

你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的参数,你传了一个String类型?JavaScript的弱类型是这一类bug的罪魁祸首,静态类型语言中不存在此类bug.Flow就是JavaScript的静态类型检查工具,该库的目标在于检查JavaScript中的类型错误,开发者通常不需要修改代码即可使用,故使用成本很低.同时,它也提供额外语法支持,使得开发者能更大程度地发挥Flow的作用. 一.flow的安装 flow可以直

python类与对象-如何使用描述符对实例属性做类型检查

如何使用描述符对实例属性做类型检查 问题举例 在某些项目中,我们实现一些类,并希望能像静态类型语言那样对它们的 实例属性做类型检查: p = Persosn() p.name = 'tom' #必须是str p.age = 18       #必须是int 要求: (1)可对实例属性指定类型 (2)赋予不正确类型时抛出异常 分析 class A(): pass a = A() #a.x = 'hello' #a.__dict__['x'] = 'hello' a.x = 'hello'等价于a.

编程思想14.类型信息

运行时类型信息使得你可以在运行时发现和使用类型信息,主要有两种方式: "传统的"RTTI,它假定我们在编译时已经知道了所有的类型: "反射"机制,它允许我们在运行时发现和使用类的信息. 14.1 为什么需要RTTI RTTI维护类型类型的信息,为多态机制的实现提供基础. 14.2 Class对象 类型信息在运行时是通过Class对象来表示的,完成的Class对象包含了与类有关的信息.Class对象就是用来创建所有"常规"对象的,Java使用Cla

javascript函数参数、返回值类型检查

实现带参数.返回值类型声明的js函数: 类型定义:window.Str = Type.Str = Type.define('STRING', Type.isStr);var Per = Type.define('PERSON', function(p){    return p && p.type === 'person' && p.name;}); 定义函数:var addStr = Str(function(a, b){  return a + b;}, Str, St

Java中静态类型检查是如何进行的

以下内容来自维基百科,关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间分析程序,确保没有类型错误.基本的思想是不要让类型错误在运行期间发生. 以下代码是一个例子,理解了他,你会更好的理解Java静态类型检查是如何工作的. 代码示例 假定我们有如下类,A和B,B继承A. class A { A me() { return this; } public void doA(

关于C++类型检查的一点小挫折

 问题: 定义了一个float型数组Lut[],我让一个整型指针指向数组名int * Address=lut ; VS2008报错: error C2440: '=' : cannot convert from 'float [256]' to 'int * ' 疑问:貌似在我C语言中,不止一次听过数组名代表数组的首地址:为啥在C++面前就不好使了(PS C++严格类型检查or类型匹配): 详细解答时间查查资料便晓得喽!不能不说C++的严谨性:近期查到Reason后,会记录在此!