打印

keilV4没有任何递归检查,没错,任何!朋友们帮忙确认下:-(

[复制链接]
6210|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sedatefire|  楼主 | 2013-9-6 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这两天发现一个严重的问题
keilV4的armlink链接器没有任何的递归检查,我原先以为是递归的链接层级太深,
做了若干实验,发现真的,没有任何任何的递归检查。
原先keil2  c51还有检查的
我还研究了下hlp里面的说明,也没有找到任何控制递归检查方面的控制命令,这是为什么?

我检查了两种keil版本,keil 4.10 和 4.72a



沙发
sedatefire|  楼主 | 2013-9-6 09:00 | 只看该作者
自己顶起

使用特权

评论回复
板凳
uet_cache| | 2013-9-6 09:02 | 只看该作者
楼主帖个现成的程序看看呢,。

使用特权

评论回复
地板
sedatefire|  楼主 | 2013-9-6 09:04 | 只看该作者
int main(void)
{
   main();
}

使用特权

评论回复
5
sedatefire|  楼主 | 2013-9-6 09:04 | 只看该作者
uet_cache 发表于 2013-9-6 09:02
楼主帖个现成的程序看看呢,。

int main(void)
{
   main();
}

使用特权

评论回复
6
sedatefire|  楼主 | 2013-9-6 09:06 | 只看该作者
不用怀疑main有特例, 下面这个也是一样的
void test(void)
{
     test();
}

int main(void)
{
    test();
}

使用特权

评论回复
7
uet_cache| | 2013-9-6 09:06 | 只看该作者
主程序能这样写?

使用特权

评论回复
8
uet_cache| | 2013-9-6 09:06 | 只看该作者
这样也没什么意义吧,楼主还是帖个实在点的。

使用特权

评论回复
9
sedatefire|  楼主 | 2013-9-6 09:07 | 只看该作者
uet_cache 发表于 2013-9-6 09:06
主程序能这样写?


int main(void)
标准c的写法哦,
main是返回int的,回头去看下。
是否return 0, keil是不管的。
其他函数有管。

使用特权

评论回复
10
sedatefire|  楼主 | 2013-9-6 09:07 | 只看该作者
uet_cache 发表于 2013-9-6 09:06
这样也没什么意义吧,楼主还是帖个实在点的。


不用怀疑main有特例, 下面这个也是一样的
void test(void)
{
     test();
}

int main(void)
{
    test();
}

使用特权

评论回复
11
sedatefire|  楼主 | 2013-9-6 09:09 | 只看该作者
uet_cache 发表于 2013-9-6 09:06
这样也没什么意义吧,楼主还是帖个实在点的。

哎呀,麻烦你代码复制到你的环境中编译看看吧,随便你怎么改,我都试得腻了。越搞越震惊。
armcc armlink的
不要调戏我了

使用特权

评论回复
12
uet_cache| | 2013-9-6 09:13 | 只看该作者
你上面的调用方法就没有终止的时候,怎么会不出错。

使用特权

评论回复
13
sedatefire|  楼主 | 2013-9-6 09:18 | 只看该作者
uet_cache 发表于 2013-9-6 09:13
你上面的调用方法就没有终止的时候,怎么会不出错。

我知道递归需要终止条件,
可我的意思是,我的意思是,keil要报警啊,要warning啊老大
我最近维护一个系统,几百个.c文件,成千上万个函数。
里面居然有45个while(1),272个跨模块的extern全局变量
其调用关系之复杂简直令人发指,

使用特权

评论回复
14
sedatefire|  楼主 | 2013-9-6 09:19 | 只看该作者
我写的测试程序如此简单,都不报警。
复杂的系统,更指望不了它。

使用特权

评论回复
15
uet_cache| | 2013-9-6 09:47 | 只看该作者
语法上没错,一般不WARNING的

使用特权

评论回复
16
sedatefire|  楼主 | 2013-9-6 10:23 | 只看该作者
我回去仔细思考了下,发现能够理解keil的做法
早先c51由于静态栈(除返回地址压栈外,其他全静态)的原因,无法支持递归,无法支持函数指针,所以提供递归警告的“服务”
但到了M0、M3的时代,栈是全压的,函数指针没有任何限制
此刻它已经无力检测出递归了,所以....
但我仍然希望,它能够提供递归的显示检测控制命令行,比如说 --explicit-recursive



静态栈:除函数返回地址压栈外,其他全静态分配地址

使用特权

评论回复
17
sedatefire|  楼主 | 2013-9-6 10:23 | 只看该作者
此贴欲结,速来领分

使用特权

评论回复
18
kseeker| | 2013-9-6 10:49 | 只看该作者
正常的编译器都不会对递归进行警告的,C51是个特例。如果这都要警告,太多的程序会面临一大堆警告。

使用特权

评论回复
19
liang7143| | 2013-9-6 10:50 | 只看该作者
打酱油 路过

使用特权

评论回复
20
sedatefire|  楼主 | 2013-9-6 11:13 | 只看该作者
kseeker 发表于 2013-9-6 10:49
正常的编译器都不会对递归进行警告的,C51是个特例。如果这都要警告,太多的程序会面临一大堆警告。 ...

哦? 我可以理解成递归在嵌入式里面很常见吗? 这点我不赞同的。
函数指针在嵌入式里面倒是很常见。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我为我自己代言... 链接:一线研发之声系列汇集 链接:Sedatefire的笔记 我发心,待人

4393

主题

5935

帖子

33

粉丝