硬汉嵌入式论坛

 找回密码
 立即注册
查看: 732|回复: 7
收起左侧

[Embedded Studio] SEGGER Embedded Studio 7.12a(64-bit)发现的问题

[复制链接]

3

主题

38

回帖

47

积分

新手上路

积分
47
发表于 2023-5-8 16:56:25 | 显示全部楼层 |阅读模式
我是用该编译器做nordic的开发.用的C语言,下面是其中一段代码
typedef struct
{
    uint16_t uuid;
} m_uuid_t;
void test001(m_uuid_t *data)
{
    if(data == NULL)
    {
        printf("111");
    }
    else
    {
        printf("222");
    }
}
int main()
{
    test001(NULL);
    return 0;
}
以上代码会输出"111".正常也是这样.
但是,改成下面这个代码.
typedef struct
{
    uint16_t uuid;
} m_uuid_t;
void test001(m_uuid_t *data)
{
    uint16_t aaa = data->uuid;
    if(data == NULL)
    {
        printf("111");
    }
    else
    {
        printf("222");
    }
}
int main()
{
    test001(NULL);
    return 0;
}
结果在该编译器编译后输出222.

但是我同事用的5.42版本的编译器.也还是输出111
??? 请问这是什么原因.



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-5-8 17:43:17 | 显示全部楼层
这测试意义不大。
1、这个就是直接data指针变量形参是0
2、这个是地址0所指向存储单元的数据
回复

使用道具 举报

3

主题

38

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2023-5-8 17:57:02 | 显示全部楼层
eric2013 发表于 2023-5-8 17:43
这测试意义不大。
1、这个就是直接data指针变量形参是0
2、这个是地址0所指向存储单元的数据

是项目出现的问题... 我同事用5.42编译器没问题.我朋友用6.30也没问题. 然后我用的最新的7.12就出现这个问题了. 虽然换编译器能解决. 就是想知道这是不是7.12编译器的BUG..   现在就是第一段代码,不去访问地址0的值,它还是为NULL的. 第二段代码是访问了地址0的值. 结果它不是为NULL了.
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-5-9 10:18:06 | 显示全部楼层
wklhwkl 发表于 2023-5-8 17:57
是项目出现的问题... 我同事用5.42编译器没问题.我朋友用6.30也没问题. 然后我用的最新的7.12就出现这个 ...

一般遇到指针为NULL的处理就是返回或者抛异常,直接访问空指针会出问题,像Linux上就是报段错误
你这个估计也是出问题了,要看一下实际地址分布,修改代码解决而不是换编译器
回复

使用道具 举报

210

主题

1043

回帖

1683

积分

至尊会员

More we do, more we can do.

积分
1683
发表于 2023-5-9 11:40:59 | 显示全部楼层
编译后的汇编对比发一下
回复

使用道具 举报

3

主题

38

回帖

47

积分

新手上路

积分
47
 楼主| 发表于 2023-5-9 17:54:15 | 显示全部楼层
emwin 发表于 2023-5-9 11:40
编译后的汇编对比发一下

编译后的汇编文件没找到.只有.o和.d的那些文件
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-5-11 08:42:35 | 显示全部楼层
uint16_t aaa = data->uuid;
应该是这句不严谨的问题,如果data为空指针,那么读取数据应该要失败
编译器应该是根据这句能成立,判定data不为空,所以优化掉为空那段,其它的编译器没做优化而已
严谨的写法,这句就该放在不为空的条件内
目前这样写法其实就隐含bug潜质
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-5-11 10:44:36 | 显示全部楼层
uint16_t aaa = data->uuid; 此处按C标准来说当data为空指针时是未定义行为,编译器可自行定义如何处理,不同版本可能有不同处理
编译器信任你,认为你没有错的话,那么就是说你知道data不为空,所以后面为空判断可省略
建议:
1,不要随便怀疑编译器有bug,有问题多怀疑一下自己,这个用的也是clang前端,用量太大了,从个人角度看极难遇到bug
2,逻辑尽量严谨一点,这种写法以后很可能还要遇到“调试版没开优化程序好好的,发行版开启优化后就不正常了”的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 09:39 , Processed in 0.185248 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表