美文网首页
注意返回类型

注意返回类型

作者: RGW | 来源:发表于2017-04-27 17:24 被阅读6次

首先看一下这两个函数

//从队列中读取数据存入pbuff, 返回pulRecvdLen长度
uint8_t recvReadEx(Queue *q, uint8_t *pbuff, uint32_t ulRecvLen, uint32_t *pulRecvdLen);
//发送AT命令, 读取并对比返回值
uint32_t gprs_read_AT(void);
uint8_t recvReadEx(Queue *q, uint8_t *pbuff, uint32_t ulRecvLen, uint32_t *pulRecvdLen)
{
    uint8_t ch;
    uint32_t i;

    ch = 0;
    i = 0;

    while(readRecvQue(q, &ch, 1) == 1)
    {
        pbuff[i] = ch;
        i++;
        if(ulRecvLen != 0)
        {
            if(i == ulRecvLen)
            {
                break;
            }
        }
    }
    if(i > 0)
    {
        *pulRecvdLen = i;
        return 1;
    }
    else
    {
        return 0;
    }
}
uint32_t gprs_read_AT(void)
{
    uint8_t buff[20];
    uint8_t *p = NULL;
    uint8_t rl;//read len;
    uint8_t res;

    res = recvReadEx(pGprsRecvQue, buff, 0, &rl);
    p = strstr(buff, "OK");
    if(p != NULL)
    {
        return DR_AT_OK;
    }
    else
    {
        return DR_AT_ERR;
    }
}

我先描述一下bug现象
gprs_read_AT通过recvReadEx读取队列中的值存入buff[20],但每次执行recvReadEx,在recvReadEx中,buff的内容时正确的,但是在函数返回到gprs_read_AT后buff的内容就会变。

recvReadEx执行时,buff在内存中的数据

Paste_Image.png

返回到gprs_read_AT时,buff在内存中的数据

Paste_Image.png

肯定是内存中的数据被覆盖了,但是时什么导致的呢。
单步执行,发现在recvReadEx中执行完*pulRecvdLen = i;后数据被覆盖,将问题锁定在这条语句,传入的 rl 地址为0xC0B04993,buff的首地址为0xC0B04994,经过仔细阅读,发现recvReadEx中临时变量 i 为32位整形,而传收入的rl为8位整形,因此pulRecvdLen会覆盖rl后3个字节的数据。
将rl修改为32位整形,问题解决。
总结:
其实编译器已经告警类型不符,但是由于之前的几个告警没有修复,没有注意到这个告警,导致调试浪费时间。

相关文章

  • 注意返回类型

    首先看一下这两个函数 我先描述一下bug现象gprs_read_AT通过recvReadEx读取队列中的值存入bu...

  • 类下的迭代器__iter__()

    def iter(self):return self 返回值类型不限,注意在引用该类的迭代类型,返回值类型与引用的...

  • Block语法,Block类型变量,使用typedef声明Blo

    1. Block语法 ^ 返回值类型 (参数类型 参数名){ };举个例子: 注意点: 一定要严格按照^ 返回值类...

  • Python内置数据类型

    类型判定 type(a) : 返回a的数据类型,注意是数据类型不是字符串内置函数 isinstance(obj, ...

  • 运算符重载

    运算符重载 注意 重载强制类型转换运算符时,不要指定返回值类型,因为返回值类型是确定的,就是那个运算符代表的类型。

  • 6_函数

    函数参数与返回值 无参数函数 多参数函数 无返回值函数 省略返回箭头(->)和返回类型。 注意严格上来说,虽然没有...

  • backbone小点

    要注意是集合的方法还是模型的方法还是jQuery的方法注意传参需要的类型,返回类型,使用方法 on和listenT...

  • 方法

    定义一个方法格式: 修饰符 返回值类型 方法名称(参数类型 参数名称) {方法体return 返回值;} 注意事项...

  • 微信小程序-图片上传遇到的问题

    这里要注意以下,wx.upload()里,success返回的参数类型里:data 是String,字符串类型,需...

  • python---定义一个session类

    首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型 ...

网友评论

      本文标题:注意返回类型

      本文链接:https://www.haomeiwen.com/subject/udknzttx.html