![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 62
What’smean
这个作者很懒,什么都没留下…
展开
-
char* a[]、a[]、a、char** *p++ (*p)++ *++p ++*p详解
(*p)++ 先去指针p指向的值(数组第一个元素2),再将该值自增1(数组第一个元素变为3)++*p 先取指针p指向的值(数组第一个元素2),再将该值自增1(数组第一个元素变为3)a+1 指向数组的第二项(一维为1,其他都为0;eg:三维 a[1] [0] [0])*++p 先将指针p自增1(此时指向数组第二个元素), 操作再取出该值。*p++ 先取指针p指向的值(数组第一个元素2),再将指针p自增1。&a+1 跳过整个数组,指向数组后的第一个地址。*a+1 跳过第一个元素,指向第二个元素。原创 2023-08-18 10:45:34 · 918 阅读 · 0 评论 -
将EXE文件转化为DLL文件
将属性中的生成改为dll生成完成!原创 2023-07-05 17:32:08 · 3085 阅读 · 0 评论 -
内存对齐相关
在编写代码时,应注意数据类型和结构体的对齐要求,并考虑对齐对性能和可移植性的影响。可以使用编译器提供的对齐指令来调整数据的对齐方式,以满足特定的需求。结构体对齐:结构体的对齐要求是其成员中最大字节大小的数据类型的对齐要求。如果结构体中的成员的总大小不是对齐边界的倍数,则编译器会在结构体的末尾添加一些空白字节,以使结构体满足对齐要求。例如,C/C++ 中的。指令后,结构体的对齐将按照指定的字节大小进行调整,即结构体的大小必须是指定字节大小的倍数。结构体的对齐要求是其成员中最大字节大小的数据类型的对齐要求。原创 2023-07-03 12:49:23 · 157 阅读 · 0 评论 -
函数指针及其作用
需要注意的是,虽然函数指针在某些情况下非常有用,但在现代C++中,有一些更高级的技术和工具,如函数对象、Lambda表达式和std::function,可以提供更强大和灵活的函数调用和处理机制。函数的运行时绑定和重载:函数指针可以用于实现函数的运行时绑定,即根据对象的类型动态选择要调用的函数。函数的延迟加载和动态链接:函数指针可以用于实现函数的延迟加载,即在需要时才加载和调用函数。回调函数:函数指针可以用作回调函数的机制,允许在程序运行时动态地指定要调用的函数。它调用传递的函数指针来处理传递的值。原创 2023-07-03 12:47:25 · 1300 阅读 · 0 评论 -
继承和组合
组合关系是一种强关联关系,被组合的类的对象的生命周期与组合类的对象的生命周期相互依赖。子类可以重写父类的方法,实现自己的行为,同时可以通过父类的引用或指针来访问子类对象,实现多态的效果。通过继承,子类可以获得父类的成员变量和成员函数,并且可以添加自己特定的成员变量和成员函数,以扩展父类的功能或实现自己的特定需求。需要注意的是,组合关系中,被组合的类的对象是作为成员变量直接存在于组合类中的,它们共享同一个命名空间,可以直接访问和使用。继承关系中,子类继承父类的属性和方法,子类可以重写父类的方法,实现多态性。原创 2023-06-30 08:42:46 · 905 阅读 · 0 评论 -
类的静态分配与动态分配
静态分配:由编译器为对象在栈空间中分配内存;动态分配:使用new运算符为对象在堆空间中分配内存。原创 2023-06-30 08:41:19 · 294 阅读 · 0 评论 -
全局变量和局部变量
全局变量(Global Variable)和局部变量(Local Variable)是两种不同作用域的变量。原创 2023-06-30 08:42:05 · 2381 阅读 · 0 评论 -
C++函数调用的压栈过程
需要注意的是,栈的管理是由编译器和操作系统来完成的,具体的实现可能有所不同。C++函数调用的压栈过程是指在函数调用时,将函数的相关信息和局部变量等数据存储在栈(Stack)上的过程。上述示例展示了函数调用的压栈过程,包括参数的传递、局部变量的分配和返回地址的保存。在函数调用之前,将下一条指令的地址(函数调用后执行的下一条指令)压入栈中,以便函数执行完后能够返回到正确的位置。函数调用完成后,会按照相反的顺序将栈上的数据出栈,恢复到调用函数的状态,并将控制权返回给调用函数。函数,按照从右到左的顺序压入栈中。原创 2023-06-29 09:07:55 · 1401 阅读 · 2 评论 -
形参、实参以及参数的传递
实参是函数调用时提供的参数的值,用于传递给函数定义中对应的形参。形参的数量和类型必须与实参的数量和类型匹配,即在函数调用时,提供的实参个数和类型要与函数定义中的形参一致。传递实参给形参时,实参的值被复制到形参中,函数内部对形参的修改不会影响实参的值。在函数调用时,实参的地址被传递给形参,函数内部可以通过解引用指针来修改实参的值。在函数调用时,实参的值被复制到形参中,函数内部对形参的修改不会影响实参的值。位置匹配:实参按照形参的顺序进行对应,位置相同的实参传递给对应的形参。原创 2023-06-29 09:03:34 · 2373 阅读 · 0 评论 -
左值、右值、左值引用、右值引用
需要注意的是,C++11之后,引入了右值引用(Rvalue Reference)和转发引用(Forwarding Reference),在某些情况下可以绑定到左值或右值。总结:右值引用是C++11引入的一种引用类型,用于引用右值。左值引用在函数参数中的使用非常常见,可以用于传递对象的引用,避免了对象的复制。转发引用是右值引用的一种特殊情况,可以绑定到左值或右值,并用于实现完美转发,即将参数以原样转发给其他函数。左值引用在函数参数中的使用非常常见,可以用于传递对象的引用,避免了对象的复制。原创 2023-06-28 16:29:32 · 633 阅读 · 0 评论 -
类成员de初始化
在C++中,类的成员可以使用初始化列表(Initialization List)或构造函数体内的赋值语句进行初始化。原创 2023-06-28 16:00:48 · 191 阅读 · 0 评论 -
重载(Overloading)、覆盖(Override)和隐藏(Hide)
重载允许在同一作用域内定义具有相同名称但不同参数的函数。覆盖允许在派生类中重新定义基类中的虚函数,以改变其行为,实现运行时多态性。隐藏在派生类中定义与基类同名但参数不同的函数,隐藏了基类的函数,使得无法动态调用派生类中的同名函数。原创 2023-06-28 09:25:51 · 711 阅读 · 0 评论 -
顶层const和底层const
顶层const和底层const的区别在于它们所修饰的是指针或变量本身还是所指向的对象。顶层const表示指针或变量本身是常量,而底层const表示指针或引用所指向的对象是常量。这两种const修饰符可以组合使用,形成不同的const类型,以满足不同的需求。顶层const(top-level const)和底层const(low-level const)是C++中用于描述const修饰符的两个概念。const int *a,其中a为指向int型变量的指针,const在 * 左侧,表示a指向不可变常量。原创 2023-06-28 09:07:34 · 840 阅读 · 1 评论 -
strlen和sizeof区别
它可以用于获取数据类型的大小,也可以用于获取数组、结构体、指针等对象的大小。操作符返回的是对象或类型所占用的字节数,因此在计算数组的大小时会包括数组元素的个数乘以每个元素的大小。可以用于获取数据类型的大小,也可以用于获取数组、结构体、指针等对象的大小。计算的是对象或类型所占的字节数,包括终止空字符(对于字符数组)。是C/C++中用于获取字符串长度和内存大小的两个不同的操作。函数只计算字符串的长度,不包括字符串的终止空字符。计算的是字符串的长度,不包括终止空字符。是一个函数,用于计算字符串的长度。原创 2023-06-27 09:00:00 · 231 阅读 · 0 评论 -
宏定义define和typedef的区别
typedef关键字后面跟着的是原有的类型名,然后是新的类型名。总的来说,宏定义和typedef是用于创建别名的不同机制,它们在功能和使用方式上有所不同,开发者可以根据具体的需求和上下文选择合适的方式来创建别名。宏定义是在预处理阶段进行替换的,它可以包含任意的代码片段和表达式。宏定义是在预处理阶段进行文本替换的,而typedef是在编译阶段为类型创建别名。宏定义可以包含任意的代码片段和表达式,而typedef只能用于为类型创建别名。宏定义没有类型检查,而typedef创建的别名是类型安全的。原创 2023-06-27 09:00:24 · 251 阅读 · 0 评论 -
页表 TLB Cache 的协同工作
从它们的关系来看,TLB和Cache共同提高内存访问性能。如果在 TLB 中找到翻译,则检索相应的物理地址。然后,检查高速缓存中是否有与该物理地址关联的数据。如果在缓存中找到数据,则可以快速检索。如果发生 TLB 或高速缓存未命中,则需要分别从页表或主存储器获取必要的转换或数据。总而言之,页表提供虚拟地址和物理地址之间的映射,TLB 缓存最近访问的虚拟到物理地址转换以加速内存访问,缓存存储频繁访问的数据以减少内存延迟。页表、转换后备缓冲区 (TLB) 和缓存是计算机系统内内存管理和缓存的三个重要组件。原创 2023-06-27 08:55:32 · 284 阅读 · 0 评论 -
Linux编译产生警告,造成的编译失败处理办法
Linux编译选项[ ] Compile the kernel with warnings as errorsThis option refers to a setting in the kernel compilation process that determines how the compiler should handle warnings.If the option is unchecked and warnings are generated during the compilat原创 2023-06-27 08:51:26 · 624 阅读 · 0 评论 -
malloc/free和new/delete的区别与联系
分配的内存是以对象为单位的,根据对象的类型进行内存分配。它会自动计算所需的字节数,并在对象的生命周期结束时自动调用析构函数来释放内存。如果需要在内存分配和释放过程中构造和销毁对象,需要手动调用构造函数和析构函数。是C++中的操作符,可以直接用于对象的创建和销毁,不需要进行手动的类型转换。分配的内存是以字节为单位的,需要指定要分配的字节数。它们可以在运行时根据需要分配所需大小的内存,并在不需要时释放内存。都可以用于堆上的内存管理,但使用方式、类型安全性和与对象构造和析构函数的关联方面存在区别。原创 2023-06-26 16:23:20 · 442 阅读 · 0 评论 -
指针和引用的区别与联系
指针是一个变量,存储其他变量的内存地址,可以重新赋值和具有空值;引用是一个变量的别名,必须在定义时初始化,不能重新赋值和具有空值。指针存储变量的地址,可以进行指针运算和解引用;引用不存储地址,直接绑定到已存在的变量上,可以直接使用原始变量的名称。指针和引用都可以作为变量的别名,通过它们来访问和修改原始变量。指针和引用都可以作为函数参数传递,实现对函数外部变量的修改,但传递方式和语法略有不同。指针可以用于遍历数组,引用不是一个独立的变量,不能直接用于遍历数组。都是地址的概念;原创 2023-06-26 16:05:33 · 370 阅读 · 0 评论 -
a与&a的区别与联系
如果。原创 2023-06-26 15:20:16 · 3360 阅读 · 0 评论 -
四个强制类型转换reinterpret_castconst_caststatic_cast dynamic_cast及比较
然后我们使用“reinterpret_cast”创建一个指向浮点数“fp”的指针,它获取“i”的地址并将其视为指向“浮点数”的指针。它可用于相关类型之间的转换,例如将派生类指针转换为基类指针,或执行算术转换,例如将整数转换为浮点数。我们还有一个基类“Base”和一个派生类“Derived”,并创建一个“Derived”类型的新对象并将其赋值给一个“Base*”类型的指针。我们使用“static_cast”将“i”转换为浮点数“f”,这是安全的,结果是“f”的值为 42.0。原创 2023-06-14 10:09:53 · 1600 阅读 · 1 评论 -
PHI Instruction&&PHI Node
在这种情况下,我们合并 `%x`(在 `ifblock` 块中添加到 `%a` 的值)和 `%y`(在 `elseblock` 块中从 `%a` 减去的值)得到 最终结果“%result”。PHI 节点告诉编译器在循环尚未开始时使用在 entry 块中初始化为 0 的 %a 的值,并使用 %j 的值( % 当循环至少运行一次时,i` 加上 1) 来自 `body` 块。在这种情况下,我们使用 `[ 0, %entry ]` 和 `[ %j, %body ]` 作为 `exit` 块的值块对。原创 2023-06-14 09:10:35 · 829 阅读 · 0 评论 -
C++ A lambda function
在此示例中,lambda 函数被分配给变量“add”,它可以像任何其他函数对象一样使用。请注意,“auto”关键字用于推断 lambda 函数的类型,它是一个函数对象。:这是一个可选的变量列表,lambda 函数可以从周围的上下文中捕获这些变量。:这是 lambda 函数的返回类型。它是可选的,如果省略,则返回类型从函数体中的 return 语句推导出来。lambda 函数是 C++ 中的匿名函数,可以内联定义并用作函数对象。:这是 lambda 函数采用的以逗号分隔的参数列表。返回森林中的每棵树。原创 2023-05-30 09:53:59 · 585 阅读 · 0 评论 -
static_cast和dynamic_cast的使用
然后我们使用 `dynamic_cast` 将 `Base*` 指针转换为 `Derived*` 指针。在此示例中,我们使用 `static_cast` 将 `int` 变量 `a` 转换为 `double` 变量 `b`。总之,`static_cast` 用于可以在编译时检查的类型转换,而 `dynamic_cast` 用于在运行时在多态类型之间进行安全向下转换。`static_cast` 和 `dynamic_cast` 都是 C++ 中的转换运算符,但它们用于不同的目的并且具有不同的行为。原创 2023-05-18 15:21:52 · 659 阅读 · 0 评论 -
`try`, `catch`, and `throw` 的简单使用
在 `main()` 函数中,我们在 `try` 块中调用 `divide(a, b)`,并在 `catch` 块中捕获任何类型为 `std::exception` 的异常。`throw` 关键字用于从 `try` 块中显式抛出异常。如果抛出的异常类型与 `catch` 块中指定的类型匹配,则执行 `catch` 块中的代码。在 try 块中,您编写的代码可能会引发异常。总之,`try`、`catch` 和 `throw` 是异常处理中用于处理程序中的错误情况并提供错误报告和恢复机制的关键字。原创 2023-05-17 15:56:05 · 259 阅读 · 0 评论 -
c++结构体对齐
说明符强制结构具有 4 个字节的最小对齐,这意味着 该结构的地址必须是 4 字节的倍数。由于 b 是结构的最大成员,大小为 2 个字节,因此编译器将结构对齐为 2 个字节的倍数。但是,由于 alignas(4) 说明符要求至少对齐 4 个字节,因此编译器会在 c 之后额外添加 2 个字节的填充,以确保结构的地址始终是 4 个字节的倍数。如果没有填充,结构的大小将为 5 个字节(“a”为 1 个字节,“b”为 2 个字节,“c”为 1 个字节),这不是 4 个字节的倍数。结构的大小(以字节为单位),即 8。原创 2023-05-16 17:42:17 · 343 阅读 · 0 评论 -
main函数之前之后执行的代码
之前调用构造函数,这是可能会执行前的一些代码。注册一个函数,它会在main 之后执行;2.可以用 atexit。原创 2023-05-16 17:02:16 · 859 阅读 · 0 评论 -
Unlink
¶ZCTF 2016 的一道题目,考点是 safe unlink 的利用。¶题目是一个 notepad,提供了创建、删除、编辑、查看笔记的功能1.New note5.Quit保护如下所示NX : YesPIE : No¶程序 New 功能用来新建笔记,笔记的大小可以自定只要小于 1024 字节。int new()所有的笔记 malloc 出来的指针存放在 bss 上全局数组 bss_ptr 中,这个数组最多可以存放 8 个 heap_ptr。转载 2023-05-10 16:47:51 · 313 阅读 · 0 评论 -
编译Linux后在根目录下生成的几个文件详解
内核构建系统使用 modules-only.symvers 文件来确保在构建依赖于内置模块导出的符号的外部内核模块时所有必要的符号都可用。使用此文件代替构建外部内核模块时生成的 Module.symvers 文件,因为内置模块的符号在内核映像中已经可用,不需要单独导出。内核构建系统也使用该文件来确保在构建依赖于内核中定义的符号的外部内核模块时所有必要的符号都可用。内核构建系统使用 Module.symvers 文件来确保在构建依赖于模块导出的符号的其他外部内核模块时所有必要的符号都可用。原创 2023-05-08 16:35:39 · 3504 阅读 · 1 评论 -
Linux中/proce/目录
例如,lsmod命令就是cat /proc/modules命令的别名,lspci命令是cat /proc/pci命令的别名。/proc/stat:包含各种系统范围的统计信息,例如上下文切换的次数以及在系统和用户模式下花费的时间。/proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理。/proc/sys/vm:包含有关虚拟内存系统的信息,例如页面缓存的大小和内存不足杀手的行为。/proc/cpuinfo:包含有关系统处理器的信息,例如它们的类型、速度和特性。原创 2023-05-08 15:09:54 · 563 阅读 · 0 评论 -
Detecting Kernel Memory Leaks in Specialized Modules with Ownership Reasoning
原本分配在栈上的内存,由于函数的return和其他函数对该内存的使用,造成栈上变量被分配到堆空间上,而堆上的内存需要自行释放,但没有进行释放,造成内存泄漏。由于 slab 是预分配和预初始化的,因此可以通过简单地从其对应的 slab 返回一个预分配的对象来快速完成内存分配。消费者函数是获取内存对象所有权的当前函数的被调用者。 例如,如果一个函数接受一个指向对象的指针,然后将该指针保存在该函数的范围之外,那么当对象被释放时就会出现问题,并且该指针变成一个悬空指针——一个引用一个对象的指针 不再存在的对象。原创 2023-05-06 10:31:17 · 293 阅读 · 0 评论 -
C++ 内存管理中内存泄漏问题产生原因以及解决方法
C++内存管理中内存泄露(memory leak)一般指的是程序在申请内存后,无法释放已经申请的内存空间,内存泄露的积累往往会导致内存溢出。转载 2023-05-06 09:58:40 · 1750 阅读 · 0 评论 -
静态分析vs动态分析
静态分析有助于在部署软件之前识别潜在的漏洞,但它不提供有关软件在与环境交互时的行为方式的信息。它涉及分析应用程序的运行时行为,包括其输入、输出以及与其他系统的交互。静态分析是一种在不执行或运行的情况下分析应用程序或程序的方法。静态分析测试可以自动化,并提供在软件开发生命周期的早期识别潜在缺陷的机会。静态分析和动态分析是分析软件代码以查找错误、漏洞或其他问题的两种常用方法。总的来说,这两种方法各有优缺点,可能需要结合静态和动态分析才能全面了解软件的弱点并改善其整体安全态势。原创 2023-04-26 11:13:42 · 2819 阅读 · 0 评论 -
kernel 中定义的ref.text段
ref.text段原创 2023-04-18 14:53:07 · 81 阅读 · 0 评论 -
LLVM学习笔记CommandLine
是用来表示标量命令行选项的类,也是最常使用的类。是用于以位向量的形式表示命令行选项列表的类。该类是用于表示命令行选项列表的类。是一个非模板化类,它允许为该选项打印出额外的帮助文本。是一个非模板类,用于为其他参数形成别名。是一个用于声明选项类别的简单类。原创 2023-04-10 11:07:30 · 623 阅读 · 0 评论 -
编译单个kernel module,生成.ko文件提取.bc文件
编译单个kernel module,生成.ko文件提取.bc文件。原创 2023-03-28 13:00:55 · 1072 阅读 · 0 评论 -
写一个kernel driver module
修改上一级的Kconfig和Makefile:(driver/Kconfig driver/Makefile)原创 2023-03-23 13:04:21 · 75 阅读 · 0 评论 -
服务器后台运行程序及标准输出指令详解记录
nohup & 2>&1原创 2023-03-17 16:30:57 · 788 阅读 · 0 评论 -
LLVM pass------out-of-tree
介绍:实现一个简单的打印function name的out-of-tree pass。原创 2023-03-17 15:07:10 · 520 阅读 · 2 评论 -
记:踩坑日记
SVF syzkaller kernel config修改原创 2023-03-17 10:12:44 · 119 阅读 · 0 评论