首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

智能合约中“高铁座霸”|存储器局部变量初始化——漏洞分析连载之七

安全,区块链领域举足轻重的话题,本期我们带你分析存储器局部变量初始化会带来什么后果?我们又需要注意什么?...初始化外部指针(引用)会默认指向起始地址,如果不加以初始化,直接进行赋值,0地址上状态变量就会被覆写。...第二个黄色框框是在函数offerToLend()中试图声明一个新局部变量agreement,但其初始化处理,所以起始位置slot 0x00会被新局部变量agreement占据。...表现形式总结与修复建议 总结上述具体案例情况,我们可以说: 初始化存储器局部变量可以指向合约中状态变量,从而导致故意(即开发人员故意将它们放在那里进行攻击)或无意漏洞。...漏洞修复建议 Remix-ide等编译器会对初始化存储器局部变量进行告警,开发人员不能忽略这个警告,在声明变量,应对这些存储器局部变量进行初始化,或者根据其使用情况,将其安排在暂时存储空间Memory

82820

【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 操作一律创建新 指针变量 执行 | 引入 辅助 局部 指针变量 )

文章目录 一、函数形参使用推荐方法 二、完整代码示例 一、函数形参使用推荐方法 ---- 在函数中 , 形参 中 指针变量 , 不建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收...形参中 指针变量 , 具体操作是 函数中 定义 局部指针变量 ; 直接使用 *to_tmp++ 样式代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ; 如果 将...辅助 局部变量 , 接收 函数 形参变量 ; 凡是涉及 修改指针指向 操作一律创建新 指针变量 执行 ; 代码示例 : /* * 实现字符串拷贝 ( 实现了模块化 ) * 将 from...指针指向字符串 拷贝到 to 指针指向字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 形参 char *from_tmp...拷贝到 to 指针指向字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 形参 char *from_tmp =

81710
您找到你想要的搜索结果了吗?
是的
没有找到

【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

段 ( .bss section ) : 存放 没有初始化 静态局部变量 和 全局变量, 可读写 , 程序开始执行时候 初始化为 0 ; ---- ( 2 ) 分析程序文件内存布局 分析简单程序...执行函数, 会根据 esp 栈顶指针 查找函数 局部变量等信息, 需要静态变量会从 bss 段 或 data段 查找信息, 需要常量值 去 rodata 段去查找信息 ; ---- 四....: 目前 C 语言中 无法判断 指针 是否 为野指针 ; ---- ( 2 ) 野指针三大来源 野指针来源 : 1.局部变量指针初始化 : 局部指针变量, 定以后, 没有进行初始化 ; #include..., 或者***② 进行了初始化, 但是超出范围使用***; 1.结构体成员指针初始化 : 结构体成员中 如果有指针, 那么这个指针使用时需要进行初始化, 结构体变量声明后, 其成员变量值是随机值,...即这个方法可以传入任意 int* 类型数据 //不能确定数组大小 : 只有一个 int* 指针变量, 无法确定这个数组大小 //可能出错 : 这里按照10个字节处理数组, 如果传入一个 小于 10

1.6K40

C++面试知识总结

BSS段:存放初始化static变量和全局变量 Data段:存放初始化static变量和全局变量 Text段:存储程序二进制代码,程序代码区。  ...而对宏定义只进行字符替换,没有类型安全检查,所以字符替换可能出错。 2.4 枚举和define区别 #define 是在预编译阶段进行简单替换。枚举常量则是在编译时候确定其值。...2.14 野指针,初始化指针和空指针区别 野指针:指向一个已删除对象或无意义地址指针。 原因:指针变量没有被初始化,或者指针p被free或者delete之后,没有置为NULL。  ...空指针:空指针表示“未分配” 或者“尚未指向任何地方” 指针。 区别:空指针可以确保不指向任何对象或函数; 而指针初始化指针可能指向任何地方。...普通局部变量在定义它函数内有效,这个函数返回会后失效。 static局部变量会自动初始化,而局部变量不会。

1.7K41

C语言 | 每日基础(92)

阿一:通常, 这意味着你程序试图访问不该访问内存地址, 一般是由于堆栈出错 或是不正确使用指针可能原因有: 局部数组溢出;不小心, 用了空指针。...初始化指针、地址对齐指针 或其它没有适当分配指针;malloc 内部被破坏;函数调用参数不匹配, 特别是如果用了指针, 两个可能出错函数是 scanf() 和 fprintf()。...读者:什么是C语言最好代码布局风格? 阿一:如果你编码环境没有建议一个风格, 你也不想发明自己风格, 可以沿用 K&R 中风格。...“好风格” 品质并不简单, 它包含内容远远不止代码布局细节。不要把时间都花在格式上而忽略了更实质性代码本身质量。 读者:用 if(!...阿一:这并不是个很好风格, 虽然这是个流行习惯用法。如果两个字符串相等, 这个测试返回为真, 但 ! (“非”) 使用, 容易引起误会, 以为测试不等值情况。

4113430

基础知识 | 每日一练(140)

——菜根谭 读者:程序执行正确, 但退出崩溃在 main() 最后一个语句之后。为什么会这样? 小林:注意是否错误说明了 main(), 。...是否把局部缓冲传给了 setbuf() 或 setvbuf()。又或者问题出在注册于 atexit() 清理函数。...小林:通常, 这意味着你程序试图访问不该访问内存地址, 一般是由于堆栈出错或是不正确使用指针。...可能原因有: 局部数组溢出 (用堆栈分配自动变量);不小心, 用了空指针初始化指针、地址对齐指针或其它没有适当分配指针); malloc 内部被破坏 ; 函数调用参数不匹配, 特别是如果用了指针..., 两个可能出错函数是 scanf()和 fprintf()。

3242929

指针和野指针区别和定义

指针指向内存可能已经被释放或者尚未分配。 2.区别: 空指针是一个初始化指针变量,没有指向具体内存地址;而野指针指针变量指向一个无效内存地址。...在编程中,使用指针或野指针进行访问内存是一种常见错误,会导致程序崩溃或产生不可预料错误。因此,在使用指针变量,应当始终将其初始化为NULL或有效内存地址,并遵循正确内存管理规则。...野指针形成: 在声明指针变量后,没有立即给它赋初值,而是直接使用它进行操作,此时指针变量值是不确定可能指向任意内存地址,这种指针就称为野指针。...在函数中返回局部变量指针,因为局部变量会在函数结束后被销毁,返回指针就变成了野指针。 需要注意是,使用指针或野指针进行操作都是不安全可能导致程序出错或发生不可预料行为。...因此,在编程中应当避免使用初始化指针变量,并且在释放了内存后,要将指针变量设置为NULL,避免成为野指针

1600

Linux虚拟地址空间布局

用户进程部分分段存储内容如下表所示(按地址递减顺序): 名称 存储内容 栈 局部变量、函数参数、返回地址等 堆 动态分配内存 BSS段 初始化或初值为0全局变量和静态局部变量 数据段 已初始化且初值非...使用堆时经常出现两种问题:1) 释放或改写仍在使用内存(“内存破坏”);2)释放不再使用内存(“内存泄漏”)。当释放次数少于申请次数可能已造成内存泄漏。...所以栈在程序中应用最广泛,函数调用也利用栈来完成,调用过程中参数、返回地址、栈基指针局部变量等都采用栈方式存放。所以,建议尽量使用栈,仅在分配大量或大块内存空间使用堆。...0符号(该初值即common block大小) C语言中,显式初始化静态分配变量初始化为0(算术类型)或空指针(指针类型)。...某些编译器将初始化全局变量保存在common段,链接再将其放入BSS段。在编译阶段可通过-fno-common选项来禁止将初始化全局变量放入common段。

3.3K40

【专业技术】程序在内存中如何分配

好多初学者可能对程序在内存中如何布局都有疑问,在我们和用户沟通过程中也发现有好多同学问相关问题。这里转一个文章,讲得很不错,大家可以看一下。...栈主要用来存放局部变量, 传递参数, 存放函数返回地址.esp 始终指向栈顶, 栈中数据越多, esp值越小....堆用于存放动态分配对象, 当你使用 malloc , new 等进行分配,所得到空间就在堆中. 动态分配得到内存附带有分配信息, 所以你能够 realloc 和 free调它们....v) 非初始化数据(BSS)区用于存放程序静态变量, 这部分内存都是被初始化为零. 初始化数据区用于存放可执行文件里初始化数据. 这两个区统称为数据区....bss段(手动初始化数据)并不给该段数据分配空间,只是记录数据所需空间大小。 data(已手动初始化数据)段则为数据分配空间,数据保存在目标文件中。

81960

C语言内存讲解-详说内存分布和heap空间

全局初始化数据区/静态数据区(data段) 该区包含了在程序中明确被初始化全局变量、已经初始化静态变量(包括全局静态变量局部静态变量)和常量数据(如字符串常量)。...初始化数据区(又叫 bss 区) 存入是全局初始化变量初始化静态变量初始化数据区数据在程序开始执行之前被内核初始化为 0 或者空(NULL)。...一般由程序员分配和释放,若程序员不释放,程序结束由操作系统回收。 变量 局部变量:  概念:定义在函数内部变量。  作用域:从定义位置开始,到包裹该变量第一个右大括号结束。  ...使用 heap 空间     空间连续。 当成数组使用。     free后空间,不会立即失效。 通常将free后 地址置为NULL。     ...否则出错。     如果malloc之后地址一定会变化,那么使用临时变量tmp 保存。

53930

C++学习总结1——几个基本概念

写程序时候,总是被C++里面的指针搞得头昏脑胀。刚开始时候还有些浮躁,不想静下心来仔细看看指针使用细节。...像pi这样,指向内存区域不确定或无意义指针称为“野指针”。 pf虽然经过了初始化,但指向是内存空间0位置,而不是指向一个float型变量内存区域,所以运行时会出错,如下所示: ?...pc使用方式则是合法指针还可以用于new和delete语句,后面会进行描述。 赋值 赋值指擦除对象的当前值并用新值来代替。可以认为,初始化就是给变量第一次赋值过程。...对于初始化变量,除了用作赋值操作左操作数,用于其他用途都是没有意义。 系统默认初始化规则 所谓系统默认初始化规则,就是在声明变量对其进行初始化情况下,编译器对其赋值一套规则。...全局变量保存在全局数据区,该区域变量在编译时会自动初始化;对于局部变量,系统启动不会为其开辟内存空间,只有当它所在函数被调用时,才在栈中建立函数数据空间。变量如果没有显式初始化,则其值为随机值。

53020

17个C++编程常见错误及其解决方案

无符号整数溢出错误示例: 对无符号整数执行减法,当结果小于零可能会导致意外大数值。...字符串字面量和字符数组混淆错误示例: 初始化字符数组,误用字符串字面量,导致正确终止字符串。...不恰当数组边界检查错误示例: 访问数组检查索引有效性,可能导致数组越界。...但依据C++标准,全局对象初始化顺序严格规定,尤其在不同编译器或复杂项目中,可能导致Service使用未完全初始化Database对象,引发预期行为。...静态局部变量:在函数内部使用静态局部变量初始化依赖,这样可以在首次使用时按需初始化,且顺序更为确定。 显式初始化函数:编写一个启动或配置函数来手动控制所有组件初始化顺序。

16610

jvm系列之对象

如果java堆内存是绝对规整,所有用过内存放在一边,使用内存放在另一边,中间放一个指针作为指示器,那分配内存就只是把指针使用区域挪一段与对象大小相等距离;这种分配方式叫指针碰撞式,如图1所示...图1:指针碰撞式内存分配方式 我们知道,堆内存随时都可能被垃圾收集器回收,当内存被回收后堆内存就可能不是连续了,所以当采用指针碰撞方式,垃圾收集器必须有内存整理功能,能对垃圾回收后零散内存进行整理...3.对象访问定位    建立对象是为了使用对象,我们java程序需要通过栈上reference来操作堆上对象。通过reference来访问对象方法有两种——使用句柄和直接指针。...在虚拟机执行一个方法,虚拟机栈 中会为方法分配一个 局部变量表,一个操作数栈;局部变量表是用于保存函数参数以及局部变量,其保存类型有boolean、byte、char、short、int、float...,那么java堆对象布局则如图3所示; 图3:通过直接指针访问对象    对象内存分布使用情况就介绍到这,感兴趣小伙伴可以自己画一画当虚拟机执行递归方法堆栈运行状况示意图。

24820

一文读懂C语言与C++动态内存

C、C++程序编译内存分配 1.从静态存储区域分配 内存在程序编译就已经分配好,这块内存在程序整个运行期间都存在。速度快、不容易出错,因为有系统会善后。例如全局变量,static变量等。...2.在栈上分配 在执行函数,函数内局部变量存储单元都在栈上创建,函数执行结束这些存储单元自动被释放。栈内存分配运算内置于处理器指令集中,效率很高,但是分配内存容量有限。...C、C++程序编译内存分配情况 实例: int a=0; //全局区初始化a char *p1; //全局区初始化p1 static char b; //全局区初始化静态变量...代码二:其中p[]数组是函数A中局部变量,函数返回后,p就被释放掉,str便指向了一段无用内存区域。 代码三:没有判断动态内存申请是否成功而直接使用,没有释放动态申请内存,造成内存泄漏。...注意:申请动态内存一定要先判断是否申请成功,失败要进行失败处理;动态内存使用后要及时释放,不要造成内存泄漏;释放后将原先指向动态内存指针置空,以免生成“野指针”。

85610

C++使用new来初始化指向类指针

-842150451,也就是初始化。...C++指针初始化问题 c++中指针是一个很经典用法,但是也是最容易出错,比如定义了一个指针,必须对其进行初始化,不然这个指针指向是一个未知内存地址,后续对其操作时候,会报错。...c++指针初始化一般方法 1.将一个已经在内存中存在变量地址传递给定义指针 这个指针就指向这个变量内存地址(相同数据类型),完成初始化。...delete释放其实只是释放了申请这块内存空间,但是指针并没有没撤销,指针还是指向这块地址,但是不可用(靠人品吃饭可能可以用),是非法。...自己遇见问题 我在使用结构体指针时候,忘记将结构体指针初始化,导致后面访问结构体成员变量时候出现错误(那种编译没错,执行出错问题),后来将指针使用new初始化解决,还有一点就是,全局变量名称与局部变量名称不要一样

29520

【编程基础】C语言内存使用常见问题

2 多重定义 函数和定义初始化全局变量是强符号;初始化全局变量是弱符号。多重定义符号只允许最多一个强符号。Unix链接器使用以下规则来处理多重定义符号: 规则一:不允许有多个强符号。...若变量定义初始化,则会产生重定义(multiple definition)链接错误;若某处变量定义初始化,则无链接错误,仅在因类型不同而大小不同时可能产生符号大小变化(size of symbol...每次访问(读写)volatile所修饰变量,都必须从该变量内存区域中重新读取,而不要使用寄存器(CPU)中保存值。这样可保证数据一致性,防止由于变量优化而出错。...二、 栈区内存 1 内存初始化 初始化栈区变量其内容为随机值。直接使用这些变量会导致不可预料后果,且难以排查。 指针初始化(野指针)或未有效初始化(如空指针)非常危险,尤以野指针为甚。...【对策】 在定义变量就对其进行初始化。某些编译器会对初始化发出警告信息,便于定位和修改。 2 堆栈溢出 每个线程堆栈空间有限,稍不注意就会引起堆栈溢出错误。注意,此处“堆栈”实指栈区。

3.2K60

什么是野指针

编码运行环境:VS2017+Debug+Win32 文章目录 1.定义 2.野指针常见情形 2.1 初始化指针 2.2 指针所指对象已经消亡 2.3 指针释放后之后未置空 2.4 realloc...2.野指针常见情形 2.1 初始化指针 出现野指针最典型情形就是在定义指针变量之后没有对它进行初始化,如下面的程序。...num值10,因为变量num是存储在栈空间局部变量,离开函数超出其作用域后就会被释放掉,因此输出值就是不确定值了。...2.4 realloc 函数使用不当 在 C 语言中,如果使用 realloc 函数不当,也可能会产生野指针。...因为引用在定义时候,必须初始化,所以可以避免野指针出现。 (2)如果一定要使用指针,那么需要在定义指针变量同时对它进行初始化操作。定义将其置位 NULL 或者指向一个有名变量

68520

搜罗面试题总结(一)

引用与指针区别 引用是变量别名,在使用上与原变量完全一样。...1>引用使用时要求: ①引用在创建必须初始化 ——指针可以在任何时候初始化 ②引用一旦创建就不能再更改引用关系 ——指针还可以指向其他对象 ③引用不能为NULL 2>指针需要单独分配空间...malloc 返回是void *类型,所以需要手动指出类型 new 是类型安全, malloc 不是 int* p = new float[2]; // 编译出错误 类型不匹配 int...2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束可能由OS回收 。注意它与数据结构中堆是两回事,分配方式倒是类似于链表。...3、全局区(静态区)(static)—,全局变量和静态变量存储是放在一块,初始化全局变量和静态变量在一块区域, 初始化全局变量初始化静态变量在相邻另一块区域。- 程序结束后由系统释放。

62810

C语言 | 每日基础(91)

读者:程序执行正确, 但退出崩溃在 main() 最后一个语句之后。为什么会这样? 阿一:注意是否错误说明了 main(,是否把局部缓冲传给了 setbuf() 或 setvbuf()。...又或者问题出在注册于 atexit() 清理函 数。 读者:为什么程序在一台机器上执行完美, 但在另一台上却得到怪异结果? 阿一:许多地方有可能出错。...下面是一些通常检查要点: • 初始化局部变量 • 整数上溢, 特别是在一些 16 比特机器上, 一些中间计算结果可能上溢, 象 a * b / c • 未定义求值顺序 • 忽略了外部函数说明..., 特别是返回值不是 int 函数, 或是参数 “缩小” 或 可变函数 • 复引用空指针 • malloc/free 不适当使用: 假设 malloc 内存都被清零、已释放内存还 可用、再次释放已释放内存...、malloc 内部被破坏 • 指针类常规问题 • printf() 格式与参数不符, 特别是用 %d 输出 long int • 试图分配内存大小超出一个 unsigned int 类型范围,

5773330
领券