C/C++
文章平均质量分 91
C、C++编程语言
狂奔的乌龟
1、博客介绍:专注分享ARM Trustzone/TEE/Linux/嵌入式等领域知识,大部分是个人学习笔记,关注我,一起学习!希望在这里能和大家一起进步,星光不负赶路人,加油!
2、个人介绍:ARM/TEE/Linux等领域忠实爱好者,个人长期专注于硬件安全、系统安全、嵌入式领域安全开发工作。
3、个人语录:积累是一个漫长的过程,未来很长,一起努力,只要路是对的,就不怕路远。
4、招聘广告:目前在国内大厂上班,长期招聘高级别&有经验的硬件安全、系统安全、嵌入式底层软件架构师&SE&MDE,寻求志同道合有志之士,有意向可私信我。
展开
-
LLVM代码空间优化(二)去除不使用函数
也就是说,链接的单位,是函数级别,这样就能丢弃没使用的函数。如果不加-ffunction-sections选项,则默认似乎是每个源文件为一个section进行链接,这样子只要这个文件中用到了一个函数,那么所有的函数都会被链接进来。:编译的时候,把每个函数作为一个section,每个数据(应该是指全局变量之类的吧)也作为一个section,这样链接的时候,–gc-sections会把没用到的section丢弃掉,最终的可执行文件就只包含用到了的函数和数据。选项,在链接的时候,加入。:需要在编译的时候,加入。原创 2023-05-12 22:47:49 · 930 阅读 · 1 评论 -
LLVM代码空间优化(一) 编译器自带的优化选项
LLVM是一个开源的项目,是一个编译器框架,是一系列模块化、可重用的编译器以及工具链技术的集合。LLVM的核心是LLVM库。同时LLVM还实现了一些周边工具。LLVM的一个设计思想是优化可以渗透在整个编译流程中各个阶段,比如编译时、链接时、运行时等。你可以基于LLVM提供的功能开发自己的模块,并集成在LLVM系统上,增加它的功能;或者利用LLVM来支撑底层实现,开发自己的工具。原创 2023-05-12 22:32:26 · 2047 阅读 · 0 评论 -
如何提升代码规范性——嵌入式C编程规范。
分享一篇C语言编程规范,欢迎大家来讨论。编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令人沮丧的。这是不尊重人的,就像某人穿着泥泞的鞋子走进一间一尘不染的房子。因此,无论本文推荐的是什么,如果已经编写了代码并且您正在对其进行修补,请保持其当前的样式一致,即使它不是您最喜欢的样式。这里列出了最明显和最重要的一般规则。在你继续阅读其他章节之前,请仔细检查它们。...原创 2022-06-08 22:21:22 · 724 阅读 · 1 评论 -
【值得一看】Linux C 语言程序之变量类型解析 。
目录背景从编译的角度从 ELF 二进制程序文件的角度从运行的角度背景近期发现项目组同学对于C语言static关键字作用还是不太清晰。从语法的角度去解释某个关键字用法的文章很多,可是这些解释蛮多时候是很生硬的,不是那么好记忆。本文尝试从实操的角度去解析 static以及更多类型的 C语言变量的形态,希望对大家有帮助。static这个关键字用来限定某个变量或者函数的作用域,这个作用域可能是文件层面,也可能是函数层面。从编译的角度假如某个功能需求由多个文件构成如下:$ cat print.hext原创 2022-04-11 09:00:00 · 1018 阅读 · 0 评论 -
TPM分析笔记(六)TPM 如何使用setjmp和longjmp实现异常后处理。
目录背景问题1问题2C 语言中 setjmp 和 longjmp函数间跳转原理函数原型案例说明setjmp和longjmp源码解析背景问题解析背景问题11、 _plat___RunCommand() 函数用于在TPM代码中调用 ExecuteCommand() 。这个函数为TPM命令字处理模块的主入口函数,用于处理来自TPM2-TSS软件栈协议数据。在调用 ExecuteCommand 之前,为什么主入口函数需要先调用setjmp函数?问题2当TPM中出现故障时,手册上表示使用 _plat__Fa原创 2022-04-10 14:40:14 · 600 阅读 · 2 评论 -
大整数相乘
处理大整数相乘的办法很多,我这里贴一种最简单实现,通过字符数组去接收和输入大整数。题目要求如下:代码如下:// 2015.9.15 华为.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdio.h>#include <string.h>#define MAXLENGTH 1024#define M 100 /*输出不超过100位大数乘积原创 2015-09-15 12:09:11 · 669 阅读 · 0 评论 -
C语言关键词volatile用法。
1、引言volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatile int i=10; int j = i; ... int k = i; 2、vo原创 2015-09-14 17:10:35 · 7167 阅读 · 0 评论 -
字符溢出分析(数据类型范围以及‘\0’重新认识)
#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ char a[1000]; int i; for (i=0;i<1000;i++) { a[i] = -1-i; } cout<<strlen(a)<<endl; sys原创 2015-09-14 17:00:38 · 1032 阅读 · 0 评论 -
记录数组指针与指针数组的易混淆点
这两天看Linux设备模型的kobject结构,整个人都不好了,老是搞错一些东西~感觉还是有必要好好在复习一下基础知识。1、指针数组与数组指针 这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针数组指针:a pointer to an array,即指向数组的指针还要注意的是他们用法的区原创 2015-06-04 20:31:15 · 1365 阅读 · 0 评论 -
堆栈顺序存储和 free 失败原因分析
*** Error in `./a.out': free(): invalid pointer: 0x09e7c018 ***======= Backtrace: =========/lib/i386-linux-gnu/libc.so.6(+0x767c2)[0xb76307c2]/lib/i386-linux-gnu/libc.so.6(+0x77510)[0xb7631510]./a原创 2015-10-19 17:20:08 · 2025 阅读 · 0 评论 -
C++ vector 基本用法
STL标准模板库提供三种类型的组件:容器,迭代器和算法,他们都支持泛型程序设计标准;容器主要分为两大类: 顺序容器和关联容器 。顺序容器有:(vector, list, deque和string等)是一系列元素的有序集合。关联容器:(set, multiset,map, multimap)包含查找元素的键值;迭代器的作用是遍历容器;vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。 vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似, 不同的地方就是:数组是原创 2015-03-10 21:43:24 · 813 阅读 · 0 评论 -
浮点型数据存储方式
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而dou转载 2016-03-09 19:58:22 · 1032 阅读 · 0 评论 -
C 语言变长数组 struct 中 char data[0] 的用法
我想举一个自己最近在项目中犯的错误来说明要踏踏实实做人,不要做装B青年 在代码中,我需要在一个library和一个daemon之间通过socket传送数据包,包的格式定义如下(为了简化,我就用最简单的数据类型举例):typedef struct { int head; int size; //指明整个包的长度 char reply; char data[0];} packet;packet* cmd = malloc (sizeof原创 2015-06-16 19:48:15 · 9026 阅读 · 3 评论 -
结构体大小计算之位域字段
类和结构可包含比整型类型占用更少存储空间的成员。这些成员被指定为位域。位域成员声明符规范的语法如下:语法declarator : constant-expression下面的示例声明包含位域的结构:// bit_fields1.c原创 2016-02-26 21:39:58 · 5058 阅读 · 3 评论 -
右左法则解决复杂声明(转)
现在很多IT公司的面试题都或多或少会有复杂声明的题,有一点C基础的人或许能够瞎搬乱套做对,但这样你肯定不爽,一方面显得不专业,有点自欺欺人的感觉,另一方面如果遇到更加复杂的声明就彻底傻了,本篇主要就一些复杂的声明介绍一种方法,这个有些书上也有介绍,比如《C专家编程》。个人觉得这个没有必要深究,只做了解即可,很多时候编程都很难用到,不过这也是大神和一般程序员的区别。右左法则不是C标准里面的内容,它是从转载 2016-06-23 16:27:29 · 599 阅读 · 0 评论 -
数组指针、指针数组、地址的强制转换内存布局
1、指针数组首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。2、数组指针首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。原创 2015-09-09 20:33:36 · 3283 阅读 · 0 评论 -
一步一步学习C++(类)之虚函数和纯虚数
1、 该函数必须与基类的虚函数有相同的名称2、 该函数必须与基类的虚函数有相同的参数个数和相对应的参数类型。3、 该函数必须与基类的虚函数有相同的返回值,或满足类型兼容规则的指针,引用型返回值。4、 如果派生类的函数满足以上三个条件系统就会自动把其定为虚函数。这时派生类的虚函数便覆盖了基类的虚函数,不仅如此派生类中的虚函数还会隐藏基类中同名函数的所有其他重载形式。5、 只有虚函数是动态绑定的,如果派生类需要修改基类的行为,即重写与基类的函数同名的函数,就应该在基类中将相应的函数声原创 2015-04-09 19:51:32 · 6567 阅读 · 0 评论 -
void* 指针有什么用
void*其实可以理解为一个context,利用它可以很好的实现C语言面向对象编程。我觉得使用void*,不是为了看起来合适,而是一个约定,使用C/C++编程的人员看到void*,习惯性的就会认为——这是个私有数据,只有定义的一方才有权解释;这也是我们在回调函数中传递void*作为userdata的基础共识。void*指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果原创 2015-08-11 22:02:12 · 4039 阅读 · 0 评论 -
一步一步学习C++之函数模板
C++提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。看下面的例子就清楚了。定义函数模板的一般形原创 2015-04-11 17:27:01 · 648 阅读 · 0 评论 -
速查表:常用算法和数据结构的复杂度
【摘要】常用算法和数据结构的复杂度速查表转自http://top.jobbole.com/1599/算法数据结构时间复杂度空间复杂度 平均最差最差深度优先搜索 (DFS)Graph of |V| vertices and |E| edges-O(|E| + |V|)O(|V|)广度原创 2015-06-17 19:58:55 · 1080 阅读 · 0 评论 -
关于“指针的指针”的认识(值传递、指针传递区分)
【摘要】对于C语言的参数传递通常都是值传递,当传传递一个指针给函数的时,其实质上还是值传递。我们可以看以下常见的面试题:#include <stdio.h>#include <stdlib.h>#include <string.h>void function1(int *v){ v = (int *)malloc(sizeof(int)); *v = 100;}void原创 2015-06-23 16:28:24 · 1004 阅读 · 0 评论 -
一步一步学习C++(类)之拷贝构造函数
拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”)。1) 一个对象作为函数参数,以值传递的方式传入函数体;Tstudent::Tstudent(const Tstudent &p)//拷贝复制函数{ strcpy(name,p.原创 2015-04-06 21:20:44 · 635 阅读 · 0 评论 -
一步一步学习C++(类)之成员函数的特性
在类体中说明的函数作为类的成员,称为成员函数。一般的成员函数,它是根据某种类的功能的需要来定义的。除此之外,又讨论了一些特殊的成员函数:构造函数、析构函数、拷贝初始化构造函数等。本节讨论除成员函数定义与说明之外的其它一些特殊属性。一.内联函数和外联函数 类的成员函数可分为内联函数与外联函数。内联函数是指定义在类体内的成员函数,即该函数的定义放在类的体内。而对成员函数的说明放在体原创 2015-04-09 11:29:40 · 2446 阅读 · 0 评论 -
一步一步学习C++(类)之友元函数
友元函数使用说明1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分;2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号;3)友元函数不能直接访问类的成员,只能访问对象成员,4)友元函数可以访问对象的私有成员,但普通函数不行;5)调用友元函数时,在实际参数中需要指出要访问的对象,6)类与类之间的原创 2015-04-09 13:01:17 · 701 阅读 · 0 评论 -
已定义的函数有返回值,函数调用可以作为一个函数的实参,但是不能作为形参
1、问题描述若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D ) A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参解析:返回值存在寄存器中, 没有地址, 不能作为形参,但可以作为实参。2、形参与实参区别形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生原创 2015-06-10 20:31:54 · 24012 阅读 · 0 评论 -
一步一步学习C++(类)之继承与派生
继承方式包括: public(公用的),private(私有的)和protected(受保护的),此项是可选的,如果不写此项,则默认为private(私有的)。所谓公用的,是说所定义的变量或函数在类外可以引用,而私有的,则说明定义的变量或函数只能在类内使用,受保护的意为不能被外界引用,但可以被派生类的成员引用。Student(const char *s,int m,int n,int x,int years):Teacher(s,x,years),Wang(s,x,years)1)执行派生类构造函数的顺原创 2015-04-09 16:22:12 · 784 阅读 · 0 评论 -
一步一步学习C++(类)之定义与实现
一、类的介绍 类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。二、类的定义与实现原创 2015-04-05 20:34:37 · 737 阅读 · 0 评论 -
一步一步学习C++(类)之构造函数与析构函数
一旦创建了一个类的对象,有时候就需要有一个有意义的初始值,当对象的生命周期结束时,有时候需要释放对象的内存单元。构造函数和析构函数是两个非常特殊的函数:它们没有返回值。这与返回值为void的普通函数显然不同,虽然void 普通函数没有返回任何值,但还可以让它做点别的事情,而构造函数和析构函数则不允许。在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以原创 2015-04-05 21:03:18 · 656 阅读 · 0 评论 -
一步一步学习C++(类)之多态性与虚函数
1、多态性定义多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphism),字面意思多种形状。2、多态性的实现 C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。(这里我觉得要补充,重写的话可以有两种,直接重写成员函数转载 2015-03-25 19:28:43 · 937 阅读 · 0 评论 -
可重入函数与不可重入函数概念以及编写规范
不可重入怎么改改成可重入函数。一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预原创 2015-06-12 21:32:48 · 4589 阅读 · 1 评论 -
u32、u16、u8 数据类型
#define U32 unsigned int #define U16 unsigned short #define S32 int #define S16 short int #define U8 unsigned char #define S8 charunsigned char = u8 unsigned short int = u16 unsigned long int原创 2015-07-29 19:10:09 · 51246 阅读 · 0 评论 -
格式化说明符以及修饰符(整理)
【摘要】最近用到一些格式化输出符,调试老提示类型不对,故整理一下,方便查看。1、 转换说明符转换说明符 意 义%c把输入解释成一个字符%d把输入解释成一个有符号十进制整数%e,%f,%g,%a把输入解释成一个浮点数(%a 是C99标准)%E,%F,%G原创 2015-07-29 19:06:13 · 1954 阅读 · 0 评论 -
多态性与虚函数
一.多态性的概念:1.多态:在面向对象方法中一般是这样表述多态性的: 向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也可以说,多态性是“一个接口,多种方法”。2.从系统实现的角度看,多态性分为两类: 静态多态性和动态多态性。以前学过的函数重载和运算符重载实现的多态性属于静态多态性,动态多态性是通过虚函数(virtual function)实现的。3.静态转载 2015-03-28 20:44:14 · 626 阅读 · 0 评论