标签:函数 数据丢失 内存 比较 efi 引用 做了 检测 ora
一些字符串函数,如strcpy等,使用时没有对输入数据长度等进行合法性检测,容易造成缓冲区溢出,被黑客利用;
因为else总是与最近的if配对,如果不能熟练使用,else有时难以表达原意,产生错误;
数组越界不会报错,比较难发现;
指针对于初学者来说容易出错,可能会访问非法内存,造成数据丢失,产生比较严重的后果
预处理
具体做的事儿如下:
(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换
(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些
(3)处理#include,将#include指向的文件插入到该行处
(4)删除所有注释
(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行
(6)保留#pragma编译器指令,因为编译器需要使用
编译
编译的过程实质上是将高级语言翻译成机器语言的过程,即对做了这些事:
(1)词法分析
(2)语法分析
(3)语义分析
(4)优化后生成相应的汇编代码
汇编
汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。
汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
链接
编译过程只是将源文件翻译成二进制文件而已,这个二进制文件还不能直接执行,还需要一个动作:将翻译成的二进制文件与需要用到的库绑定在一块。
链接的主要内容是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接。
链接的主要过程包括:地址和空间分配(Address and Storage Allocation),符号决议(Symbol Resolution),重定位(Relocation)等。
链接分为静态链接和动态链接。
静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。
而动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。
标签:函数 数据丢失 内存 比较 efi 引用 做了 检测 ora
原文地址:https://www.cnblogs.com/atsap/p/12235530.html