自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

转载 C++ 中异常机制的实现机制详解

0x1 C函数的调用和返回0x2 C++函数调用0x3 栈回退(stack unwind)0x4 异常捕获0x5 抛出异常0x6 总结0x1 C函数的调用和返回要理解 C++ 异常机制实现之前,首先要了解一个函数的调用和返回机制,这里面就要涉及到 ESP 和 EBP 寄存器。这两个寄存器是用来维护一个函数栈帧的关键寄存器,我们先看一下函数调用和返回的流程。下面是按函数调用约定 __stdcall 调用函数 test(int p1,int p2) 的汇编代码,假设执行函数前堆栈指针 ESP 为 NN.

2021-11-06 21:02:57 1376 1

原创 GIT 远程仓库管理

前言GIT 作为一种分布式代码版本管理工具,在团队开发工作中掌握远程仓库的使用是十分重要的。首先,对于远程仓库的理解是熟练使用的前提,要知道,远程仓库与本地仓库不是从属关系,而是平等的关联关系。远程仓库也是一个普通的仓库,本质上和本地仓库无异。关联本地仓库和远程仓库克隆远程仓库到本地假设你新加入一家公司,要参与到其中的某个项目中去,这时候在公司的代码仓库中已经有了这个项目,而你首先应该做的就是拉取该项目的镜像到本地进行开发。通过 git clone 命令,则可以简单的克隆一个远程项目到本地,不过要注

2021-10-23 02:40:52 677

原创 GIT 中如何打标签(git tag)

前言0x1 GIT 标签常用指令0x2 轻量标签0x3 附注标签0x4 远程仓库中的标签前言在我们开发的过程中,可能经过多次 commit 提交才会确定一个版本,那么除了用 commit comments 来标识一次提交记录,还有没有什么更好的办法呢?GIT 为我们提供了标签这个功能,使用标签可以对某一次提交记录做上一个小标记,就像我们看书的时候,看到很有意思想要做个记号,可以用小的标签纸贴在那一页的边上,这让我们以后可以更方便的索引。0x1 GIT 标签常用指令GIT 中的标签分为两种,一种.

2021-10-15 10:25:08 57051

原创 GIT 如何恢复在没合并之前就删除的分支(detached HEAD)

今天在一个分支上进行开发,费尽千辛万苦终于把功能实现了!!想着放下键盘去喝口水,但是等我水喝完回来,看到产品经理在操作我的电脑,这老哥居然一顿失误操作给我把刚刚开发完功能的分支删了!!我靠,我还没合并分支呢,给我把分支删了????极其不讲武德,好在我把 GIT 玩得六,把分支给恢复回来了,不然这不是又要加班的节奏吗!!接下来就讨论一下怎么恢复没合并且被删除的分支。假设我当前 GIT 仓库的状态如下:只有一个 master 分支,接下来我们创建并切换 dev 分支,并且在这个分支上进行开发然后提交:

2021-10-14 16:51:33 1030 3

原创 GIT 底层原理

0x1 git 仓库的初始化与配置信息0x2 git 仓库0x1 git 仓库的初始化与配置信息通过 git init 可以创建一个 git 仓库,这应该也是所有学习 git 的程序员接触的第一条 git 命令了。通过在一个文件夹内运行此命令,则会在当前文件夹下生成一个 .git 的文件夹,将当前文件夹初始化为一个 git 仓库,同时该文件夹也是一个 git 仓库的唯一标识,而之后所有对仓库的操作结果都会存储在该文件夹中。如果你要备份或复制一个库,基本上将这一目录拷贝至其他地方就可以了。git .

2021-10-14 14:30:33 401 1

原创 使用 GIT 时忽略不需要管理的文件或文件夹(.gitignore 文件的作用)

在使用 GIT 管理代码的时候,项目中总是会有一些文件我们不需要加入到 GIT 仓库中进行保管, 我们也不希望在工作目录列表中看到它们,比如说一些一些编译的中间文件,常用的源外编译的 build 文件夹等等。为了过滤这些文件,我们可以创建一个名为 .gitignore 的文件,在其中列出需要过滤文件的模式,其遵循 glob 文件匹配模式。文件 .gitignore 的格式如下:所有空行或者以注释符号 # 开头的行都会被 Git 忽略。可以使用标准的 glob 文件模式匹配。匹配模式最后跟反斜杠(

2021-10-12 17:15:05 791

原创 如何用 GIT 暂存未提交的改动 (stashing 功能)

今天在调试项目 BUG 的时候,在当前的分支上开发到一半,想切换到一个以前的分支看看以前的另外一个版本有没有跟这个 BUG 相关的处理(其实俺就是想抄一下作业,虽然并没有抄到,哭)。但是这时候我已经对当前的分支作了一些修改,但是这个 BUG 没修完也不能直接提交呀,但是切换分支的话我所有做的修改就都没了,怎么办怎么办怎么办。。。这时候发现了 GIT 的一个 stashing 功能,好家伙,这玩意可以暂存一些未提交的修改,接下来就看看怎么用这个命令吧~0x1 stashing 功能简单演示假设目前我的项

2021-10-12 16:26:02 498

原创 GIT 本地仓库基本使用

0x1 将项目初始化为 GIT 仓库0x2 GIT 初体验0x2.1 场景一:修改已经提交过的文件0x2.2 场景二:修改暂存区中的文件0x2.3 场景三:移除 GIT 仓库中的文件0x2.4 场景四:移动某个文件0x2.5 查看工作区、暂存区和 GIT 仓库的不同0x2.6 总结0x3 GIT 仓库的版本回退0x3.1 场景一:最近一次提交记录的修改0x3.2 场景二:版本回退0x3.3 场景三:撤销某次提交0x4 GIT 分支管理0x4.1 提交操作发生了什么?0x4.2 分支的本质0x4.3 分支合.

2021-10-08 13:47:30 305

转载 Linux find 命令超详解

一、简介二、搜索条件(expression)1、根据文件名检索2、根据文件类型检索3、检索空文件4、反义匹配5、根据文件的所属权检索6、 根据时间日期进行检索7、根据文件大小检索8、根据文件权限检索9、 限制遍历的层数10、逻辑组合三、对搜索结果执行命令1、删除文件2、执行自定义命令四、常用参数汇总Linux 上的 find 命令是 findutil 软件包的一部分,一般已经默认集成在了几乎所有的发行版中。find 命令有非常大的灵活性,可以向其指定丰富的搜索条件(如文件权限、属主、属组、文件类型、.

2021-10-02 09:06:02 1259

翻译 KLEE 使用(三)------ 使用 KLEE 为二分查找生成测试

在上一篇博文中,我们展示了如何用 KLEE 来为一个简单程序生成测试用例。在这篇博文中,我们将展示如何使用 KLEE 中的数组和断言。0x1 测试无序数组如下是二分查找的算法实现:int binary_search(int arr[], int size, int target) { print_data(arr, size, target); int low = 0; int high = size - 1; int mid; while (low &lt..

2021-09-25 12:43:41 764

翻译 KLEE 使用(二)------ 怎么自动地生成测试用例?

在这篇博客中,我们将展示如何使用 KLEE 自动地为一些整数相关的小实例(用 C 语言编写)生成测试用例,在下篇博客中,我们将用 KLEE 来测试一段二分查找算法的代码,生成测试用例。符号执行是不同于实际运行程序的,在符号执行中,我们跟踪的不是变量的实际值,而是其“符号值”和对这些值的操作。所以,对于如下这段函数代码:int many_math_operations(int x) { int result = x * 2; result += 5; result /= -3;

2021-09-24 10:43:44 1285 2

原创 KLEE 使用(一)------- 测试一个简单的函数

0x1 手动代码插桩以及编译成中间码在编译好 KLEE 后,可以通过测试一些简单的程序来入手 KLEE 的使用。假如有如下的代码:int get_sign(int x) { if (x == 0) return 0; if (x < 0) return -1; else return 1;}KLEE 是在源代码中对需要符号化的变量进行源代码级别的插桩来进行变量符号化的,通过 klee.h 头文件中声明的 klee_make_symbolic 函数(该函数只

2021-09-24 08:45:24 2236

原创 管理 Linux 系统中的带版本的共享库

前言之前自己在编译共享库的时候一直就把生成的共享库直接命名成 libxxx.so 的形式,最近遇到需要进行共享库版本管理的问题,发现之前对于 Linux 系统对共享库管理的方式已经不再够用了,所以接下来记录 Linux 系统中管理共享库的解决方法。0x1 约定俗称的命名方式在 Linux 上对共享库的命名采用 libxxx.so.a.b.c 的格式,其中 a 代表主版本号,b 代表次版本号,c 代表发布版本号,其中发布版本号一般是可选的。而因此动态库就有了三种名字:linker name:顾名思

2021-09-17 15:47:07 532

翻译 Linux 共享库简介(怎样创建共享库)

前言0x1 什么是共享库0x2 共享库在文件系统中的位置0x3 使用 ldconfig 命令0x4 使用非标准库位置0x5 示例(如何创建一个共享库)前言一个库文件由多个不同的目标文件填充组成,众所周知,目标文件是由源代码经过编译得到的二进制中间文件,所以库文件中也是一系列已经编译好二进制代码,而它可能包含着在特定上下文中使用的一组函数。例如,当我们需要用到多线程中所提供的函数时, pthread 库就会被用到。宽泛地讲,一个库(或者说程序库)有两种类型:1、共享库2、静态库在这篇文章中.

2021-09-15 17:15:13 4464

原创 从程序语言的角度深入剖析 C++11 中的 lambda 表达式

前言在使用 C++11 的标准库算法的时候,常常需要传入一个可调用对象作为实参,那么到底什么是可调用对象呢?从语法层次来说,能够使用运算符()的对象就是可调用对象,即若 obj 是一个可调用对象,那么语法 obj([arg]) 是合法的。C++11 提供了四种可调用的对象,其中我们用的最多的就是函数和函数指针;通过对类重载函数运算符,该类的对象也是一种可调用对象;还有一种可调用对象就是 lambda 表达式。0x1 从普通函数调用说起...

2021-07-04 19:36:23 460

原创 C++ IO 标准库

前言0x1 IO 类型的共性0x1.1 IO 对象不可拷贝或赋值0x1.2 条件状态0x2前言C++ 语言不直接处理输入和输出,而是通过一族定义在标准库中的类型来处理 IO。平时我们用的比较多的 cin 和 cout 就是标准库中的 IO 对象,其直接关联到标准的输入输出,其实标准库还为我们提供了文件 IO 和内存 IO ,通过包含三个独立的头文件,我们则可以使用这些 IO 类型。#include <iostream> :读写流的基本类型,提供了 istream、ostream、ios.

2021-06-16 23:55:11 512 2

原创 C++ 编译器自动生成的函数详解

前言0x1 编译器为我们的类合成了哪些函数?0x2 对象到底调用了哪个函数?前言在定义一个 C++ 类的时候,编译器会为我们做很多事情,比如在某些情况下会为我们合成各种用于初始化、拷贝、移动、赋值操作的函数。那么 C++ 在定义一个类的时候编译器为我们生成了哪些成员函数呢?直接初始化和拷贝初始化调用的构造函数有什么区别吗?此处设计很多知识点,又杂又乱,所以在文章的开始处,我先把结论列出来。编译器可以为我们合成默认构造函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数、析构函数。以上提到.

2021-06-10 12:42:23 2008

原创 C++ 类类型转换

在 C++ 中,对于一个类来说,根据接收的参数数量和类型不同,可以定义多个构造函数。如果在创建一个类的对象时,不需要输入任何实参作为初始值,此时调用的是默认构造函数。如果将同一个类的另外一个对象作为实参初始值,则调用的称为拷贝构造函数。有一种特殊的构造函数,该类构造函数只接收一个实参,他实际上不仅仅实现了一种初始化对象的方式,而且实现了一种转换为此类类型的转换机制,这种构造函数就被称为转换构造函数。...

2021-06-09 20:32:11 2105 1

原创 C++11 中的 =default 的含义

在 C++ 中,当用户定义一个类的时候,如果没有给类定义任何构造函数,那么编译器会生成一个默认构造函数,使得在定义该类的对象的时候,调用了自动生成的默认构造函数为成员变量执行默认初始化。如果用户在定义一个类的时候,只要定义了任何一个构造函数,编译器则不会再为该类生成默认的构造函数,如果我们还需要一个默认构造函数,则只能自己定义。而在 C++11 新标准中,可以通过 = default 关键来声明构造函数,告诉编译器为该类生成一个默认的版本,由编译器自己生成的默认构造函数,性能上一般会比用户自己定义的更好,而

2021-06-06 00:46:58 7462 2

原创 超越经典搜索算法汇总

前言0x01 离散空间的局部搜索0x01.1 爬山法0x01.2 模拟退火法0x01.3 局部束搜索0x01.4 遗传算法0x02 连续空间中的局部搜索0x03 局部搜索算法汇总前言在经典搜索算法中,搜索过程是系统的探索状态空间,通过在内存中保留一条或多条路径和记录路径中的每个结点的选择,当找到目标的时,到达目标的路径就是问题的一个解,比如说在罗马尼亚问题中,关注的是到达目标状态的路径,因此在搜索的过程中,需要在内存中保留一颗搜索树,这对内存是很大的挑战,或者说这类问题有着无限的状态空间,这甚至可能直.

2021-06-01 23:25:31 928

原创 经典搜索算法总结

前言0x01 搜索问题的形式化0x02 树搜索和图搜索0x03 搜索算法的评估0x04 盲目搜索算法0x04.01 宽度优先搜索算法BFS0x04.02 一致代价搜索算法UCS0x04.03 深度优先搜索算法DFS前言搜索问题是在解决各类问题时不可避免的重点难点,很多问题的求解过程都可以转变为搜索问题。比如,对于以下罗马尼亚问题,希望找到一条路径使得从城市 Arad 到城市 Bucuresti 的路径最短,这就是一个经典的搜索问题,在数据结构课程中,我们都知道使用 Dijkstra 算法来求得最优解,.

2021-06-01 19:38:39 16664

原创 C++ 中数组指针和函数指针

数组的类型数组指针怎么写声明返回一个数组指针的函数函数的类型函数指针怎么写数组的类型在往常的编程中,我们都知道数组的名字就代表数组第一个元素的地址,这总是让我们对数组的类型产生误解。比如对于这条指令int a[10] = {0}; ,因为当引用数组名 a 的时候往往相当于引用数组第一个元素 a[0] 的地址,所以我们可能会误认为数组 a 的类型是 int *,然而数组名 a 代表的却是整个数组,他的类型并不是简单的 int *,那数组 a 的类型到底是什么呢?我们都知道一个数组的两个特点是存储元素的类.

2021-05-27 23:16:55 386

原创 C++ 函数重复声明对默认实参的影响

在C++中,函数只能定义一次,但是可以多次声明,通常函数的默认实参可以在声明中指定,也可以在定义中指定,但是对于同一个参数不能在同一个作用域中指定两次,如以下代码,将会报重复定义错误:int (*func(int a, int b = 10))[10];int (*func(int a, int b = 20))[10];clang输出语法树的报错信息如下:但是在重复声明的时候,可以指定不同默认参数的值,此时第二次声明是在第一次声明的基础上添加默认参数。如以下代码:int (*func(int

2021-05-27 16:18:28 892

原创 CMake 入门

前言安装前言如果你是一个刚刚接触C/C++编程的程序员,也许你会用类似于VS的集成开发环境写代码,一键编译运行;如果你开始学习Linux下的编程,也许你会开始使用GCC编译器在命令行中编译自己的代码;如果你开始编写一些稍微有些规模的项目,项目由若干个源文件和头文件组成,甚至可能用到其他的第三方库,也许你开始利用makefile脚本来管理自己的项目,但是makefile只能用于Linux环境下的开发,你的项目可能无法跨平台在Windows或者Mac上构建。而CMake就是一个跨平台的安装(编译)工具,可.

2021-05-13 10:51:47 284

原创 C++ 中的 sizeof 运算符

sizeof 运算符语法:sizeof (type)sizeof (expr)sizeof exprsizeof 运算符返回一条表达式或一个类型名字所占的字节数,其返回值是 size_t 类型的常量表达式。sizeof 运算符对其作用的类型的依赖:对 char 或者类型为 char 的表达式执行 sizeof 运算,结果是1。对引用类型执行 sizeof 运算得到被引用对象所占空间的大小。对指针执行 sizeof 运算得到指针本身所占空间的大小。对解引用指针执行 sizeof 运算

2021-03-21 11:15:42 530

原创 在 Ubuntu 18.04 下安装 Klee 2.2

Klee 是基于 LLVM 的符号执行引擎,因此安装 Klee 首先需要安装对应版本的 LLVM 。Klee 2.2 版本是基于 LLVM 9 的,本文主要记录在纯净 Ubuntu 18.04 安装 Klee 2.2 的过程。 安装依赖$ sudo apt-get install build-essential curl libcap-dev git cmake libncurses5-dev python-minimal python-pip unzip libtcmalloc-minimal4 li

2021-03-20 01:03:09 1250 3

原创 【工具篇(持续更新)】pwn中常使用的工具

pwn中常使用的工具前言0x1 pwntoolspwntools安装前言  pwn作为CTF比赛中的重要一部分,用到的工具不及其他部分的多,但是工具相对来说也比较难用。主要用的工具有:pwn-tools、0x1 pwntoolspwntools是一个用Python编写的CTF框架和开发库,旨在快速构建原型和开发,并旨在使编写利用脚本尽可能简单。pwntools安装...

2021-03-12 12:00:27 5268

原创 C++ 标准库<cctype>

前言<cctype> 标准库是对于单个字符的处理库,包括字符分类和字符操控两大类函数,这个头文件属于NTBS (Null-terminated byte strings)的一部分,源自于C语言中的标准库 <ctype.h>。概述该库中共有14个函数,其函数签名如下:字符分类前12个函数属于字符分类的函数,其作用如下:isalnum(ch):当ch是字母或者数字时返回一个非零值,否则返回0。字母或数字包括26个大写字母、26个小写字母和10个十进制数字。isalph

2021-03-10 15:46:15 498

原创 C++11中的 auto 和 decltype 关键字

C++11中的 auto 和 decltype 关键字auto 关键字0x1 auto 的语法规则0x2 auto的常见用法decltype 关键字0x1 decltype 的语法规则auto 关键字在C++程序中,每个变量都有自己的类型,这就要求变量在声明的时候必须清楚地知道其右侧初始值的类型。然而做到这一点并非易事,有时候甚至无法做到。在C++11之前的版本中,变量在声明或者初始化的时候,必须显式的指定其类型,但是在C++11中引入了 auto 关键字,用它可以让编译器替我们去分析初始值的类型来推

2021-03-04 10:25:18 215 1

原创 为什么在 C++ 中 inline 函数要在头文件中定义

先说结论:inline 函数并不是必须定义在头文件中,但是一个好的工程习惯是定义在头文件中。(核心)inline 函数在链接的时候仅仅在单个 cpp 文件中可见,并不是全局可见。C++中在类中实现的成员函数会被编译器自动默认判定为 inline 函数。对于以下三个文件做测试:test.h// test.h#include <iostream>class Test{public: void func();};test.cpp//test.cpp#include

2021-03-03 17:34:30 6017 2

原创 C++ 中 const 的那些事

C++中 const 的那些事前言0x1 const 和引用0x2 默认状态下,const 对象仅在文件内有效0x3 const 和类型别名0x4 const 和 auto前言cosnt 关键字常被用于定义一个常量,用法较多的可能是定义常量指针、指向常量的指针和指向常量的引用,但是const还是有很多冷门的语法特性,如果使用不当,可能会导致我们写的代码不符合预期,且很难找到错误,因此作如下总结。0x1 const 和引用由于引用本身不是一个对象,所以引用在初始化的时候只能绑定在对象上,而不能与字面

2021-03-03 01:22:46 450

原创 【GYCTF2020】borrowstack------<栈迁移原理、ret2csu万能gadget、one-gadget工具>

【GYCTF2020】borrowstack知识点关键字样本知识点详解0x1 ret2csu原理0x2 栈迁移原理0x3 one-gadget 工具样本分析0x1 静态分析0x2 payload 构造0x3 动态调试0x4 exp参考文献知识点关键字栈迁移、ROP、csu万能gadget、one-gadget样本样本来自于GYTF2020_borrowstack,BUUCTF上有练习环境知识点详解0x1 ret2csu原理动机: 在 64 位程序中,函数的前 6 个参数是通过寄存器传递

2021-01-22 17:56:01 1815 2

原创 【RCTF2017】Recho------<Linux的系统调用、PLT和GOT表>

【RCTF2017】Recho知识点关键字样本知识点详解0x01 Linux的系统调用知识点关键字栈溢出、系统调用、ROP、pwntools中的shutdown方法、plt表和got表样本样本来自于RCTF2017_Recho,攻防世界上有练习环境知识点详解0x01 Linux的系统调用最直观的理解,系统调用是操作系统提供给用户的一系列对计算机资源进行控制的方法,用户可以通过系统调用来请求使用计算机资源。比如Linux系统中,常用的文件I/O,进程控制等函数就是简介使用系统调用方法的函数。在

2020-12-29 01:02:35 1357 1

转载 Linux 在 X86 64下的系统调用表

Note: 64-bit x86 uses syscall instead of interrupt 0x80. The result value will be in %rax.To find the implementation of a system call, grep the kernel tree for SYSCALL_DEFINE.\?(syscall,For example, to find the read system call:/usr/src/linux-source-3.1

2020-12-28 09:30:51 573

原创 【QCTF2018】stack2------<ASLR保护机制>

QCTF2018_stack2前言知识点详解0x1 ASLR保护机制writeupexp前言在最简单的栈溢出中,如果程序中存在获取shell的后门函数,则只需要简单的通过溢出手段将函数的返回地址修改为后门函数的地址,便可以轻松获取shell。而对于没有提供后门函数的程序,可以通过往栈里面写入shellcode,在返回的时候将控制流劫持到栈里面的shellcode获取shell。但是对于加入NX保护的程序,在栈中写入shellcode的方法则不再适用,而ROP就是其中一种绕过保护的手段。ROP的全称为R

2020-12-27 16:47:11 687

原创 深入理解 C++ 中的引用和指针

引用(reference):一个已经存在的对象的别名,引用并非对象。指针(pointer):用来存放地址的一种类型,指向内存中某块存储单元,指针本身就是对象。从引用不是对象,指针是对象来看他们的区别:引用不是一个对象,故程序不会为一个引用分配内存区域;而指针本身就是一个对象,故程序会为指针变量分配内存区域。引用不可以为空,在定义时必须初始化,且之后无法改变;指针可以不初始化(不推荐),在生命周期内可以指向不同的对象。引用只能为一级,指针可以为多级。int **p1; // 合

2020-12-15 16:13:52 464

原创 C++ 中的字面值常量

前言一个形如20的值称之为字面值常量(literal),这样的值一望而知。每个字面值常量对应一种数据类型,由其形式和值决定。0x1 整型字面值整型字面值可以写成十进制数、八进制数、或者十六进制数的形式。例如,我们可以用以下任意一种形式来表示数值20:int decimal_literals = 20; //十进制int octal_literals = 024; //八进制int hexadecimal_literals = 0x14; //十六进制默认情况下,十进制字面值的类型是int、

2020-12-13 18:21:20 2096 1

原创 【Xman】level0------<常用汇编指令、C语言函数调用栈简介>

Xman_level0知识点详解Writeup先用file查看文件的属性,可以看出level0是64位的ELF可执行文件:再用checksec查看文件的保护机制,没有打开栈保护:将文件拖入IDA-64bit进行反汇编和反编译,可以得到main函数:main函数中并没有发现可以利用的漏洞,但是它调用了一个vulnerable_function函数,点进去看一下:可以看到vulnerable_function中有一个read函数,read函数可以从buf所在栈的起始地址开始,写入200h

2020-12-06 22:31:25 370

原创 编译链接简介

pwn核心基础知识二级目录三级目录二级目录三级目录

2020-12-05 14:46:19 310

原创 编译过程发生了什么?

编译过程前言0x1 词法分析0x2 语法分析0x3 语义分析0x4 中间代码生成与优化0x5 目标代码生成0x6 总结前言        我们平时用C语言写的代码是一种语法层面接近人思维的代码,而计算机所执行的代码是机器层面的二进制代码,那么要想让我们编写的C语言代码在机器上运行起来,那这中间必然有一个转换过程,这个过程的最主要部分就是编译。我们在这篇文章中主要关注在编译过程中发生了什么(而不是怎么发生),通过Clang/L

2020-12-04 01:14:22 750

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除