首页
社区
课程
招聘
[原创]vc++6.0的scanf中浮点变量输入问题
发表于: 2019-9-7 17:11 2984

[原创]vc++6.0的scanf中浮点变量输入问题

2019-9-7 17:11
2984

vc++6.0的scanf中浮点变量输入问题

这个问题可以算VC++6.0中的一个小BUG

虽然这个问题在VS版本上得到了解决。但是我还是想说一下。

    我在百度上看了一下这个个问题几乎都是一个共同点-浮点数没有初始化-


   为什么浮点数变量没有初始化没有报错


   有些情况我们需要必须要用到初始化变量的时候IDE会给我们报错-为什么这个情况下他不给我们报错呢?


   那么我们在VC6.0下初始化浮点的原因是什么没有几个人说。


    程序的入口函数不是main函数


    操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置, 不同的连接器选择的入口函数也不尽相同。在VC++下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用main 函数。


    

mainCRTStartup 它干了什么呢?

1,获得系统的主副版本号

2,初始化多线程或者单线程的堆坏境

3,初始化多线程的整体环境

4,初始化默认IO:stdin,stdout,stderror

5,获取命令行,获取环境变量

6,初始化命令行和环境变量

7,初始化浮点协处理器,全局变量

浮点协处理器:主处理器负责整数运算,协处理器

负责小数运算,以减轻处理器的压力(第一版浮点协处

理器出来的时候,cpu就成了双核的了)

8,获得进程启动讯息

9,传递已经格式化好的参数,并调用main函数

10,接收main函数的返回值所谓exit的参数->exit(0)中间这个0


基本是干了上面一些内容不知道说的全不全有没有错误


我们用VC++中输入下面这么一串代码。

#include <stdio.h>

void main()

 {

     float f1;

     scanf("%f",&f1);

 }

代码编译通过但是运行运行起来会发生如图的错误


但是我们输入如下代码-这个时候我们没有初始化浮点变量f2 但是也能编译通过和运行这就印正了我们开头所说的根本原因不在于初始化浮点变量

那么问题在哪里呢?


#include <stdio.h>

void main()

 {

     float f1=0.1;

     float f2;

     scanf("%f",&f2);

 }


VC++6.0在编译时为了节省资源的占用,如果检测到你的整个代码里面没有需要用到处理浮点数据时,在main函数之前初始化浮点处理器当编译检测不需要浮点处理的时候浮点处理器为返回值为NULL然后就不会运行浮点处理器。


当我们给他初始化值的时候编译器检测需要用到浮点处理器了所以在 mainCRTStartup 函数中我们能够看到浮点处理器返回值不为NULL


简单点就是说 VC++6.0在第一串代码环境下编译器不会运行浮点处理器但是运行的时候有必须要浮点处理器。那么程序当然会崩啊



因为发这个贴子的时候电脑出了点问题没办法给大家截图看看这个 mainCRTStartup 函数中到底发生了什么以后会给大家截图的!




希望这个帖子对大家有做逆向安全方面的朋友有所帮助


第一次发帖本来想发到逆向安全板块发的但是奈何等级不够发不了 




然后感谢逆向安全区版主科锐钱老大


转载需声明


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 4839
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
这是机器语言
2019-9-8 13:08
0
雪    币: 35
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
兄弟,加油。
2020-5-27 22:42
0
游客
登录 | 注册 方可回帖
返回
//