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

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

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

86320

【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 =

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

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

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

    1.8K40

    C++面试知识总结

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

    1.8K41

    C语言 | 每日基础(92)

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

    4343430

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

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

    3502929

    【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》

    (Initialized data segment) 存储初始化的全局变量和静态变量,可读写 未初始化的数据段(Uninitialized data segment) 存储未初始化的全局变量和静态变量,...未初始化的数据段(Uninitialized data segment) 未初始化的数据段也称为 .bss 段,用于存储所有未初始化的全局变量、局部变量和外部变量。...在这里,静态分配的对象是那些没有显式初始化的对象,初始化为零值。 特点 未初始化: 包含未初始化的全局变量和静态变量。 自动初始化为零: 程序开始时自动将这些变量初始化为零。...栈的内存分配由编译器自动完成,并在函数返回时自动释放。 特点 自动分配和释放: 局部变量和函数调用信息由编译器自动管理。 后进先出: 栈是一种后进先出的数据结构。...global_uninit_var:未初始化的全局变量,存储在BSS段。 static_var:初始化的静态变量,存储在数据段。 local_var:局部变量,存储在栈中。

    20510

    空指针和野指针的区别和定义

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

    37710

    Linux虚拟地址空间布局

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

    3.3K40

    【C语言动态内存管理】—— 智能分配与精准释放之道,打造高效内存循环

    这些变量的生命周期与程序相同,从程序启动开始就存在,直到程序结束才被销毁 2.2.2、全局未初始化数据区(.bss) 定义与功能: 存储未初始化的全局变量和静态变量。...未初始化的全局变量会被放置在全局未初始化数据区。在程序启动时,系统会自动将这个区域中的变量初始化为默认值(对于基本数据类型,如int通常初始化为 0)。...这个区域的存在主要是为了提高内存使用效率,因为未初始化的变量不需要在可执行文件中占用实际的存储字节来保存初始值,只需要记录变量的名称和类型等信息,在程序加载时再进行初始化。...数据区(全局初始化数据区) 已初始化的全局变量和静态变量、字符串常量 编译时 程序整个运行期间 编译时确定,程序加载时初始化 可读可写 保存具有全局作用域且已初始化的数据 数据区(全局未初始化数据区)...未初始化的全局变量和静态变量 编译时确定信息,程序加载时分配并初始化 程序整个运行期间 编译时确定,程序加载时初始化 可读可写 存放全局未初始化数据,启动时初始化为默认值 堆区 动态分配的内存数据(如动态数组

    59020

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

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

    85260

    C:野指针介绍(定义、危害、规避)以及野指针与空指针的区分

    1.1 野指针的成因 1.指针未初始化 #include int main() { int* p;//局部变量未初始化,默认未随机值 *p = 20; return 0; }...也就是说,当指针指向的范围超出数组arr的范围时,p就是野指针 3.指针指向的空间释放 #include int* test() { int n = 100;//n是局部变量 return...或者你可能不小心把包裹放到了别人的家门口,造成包裹送错(这就如同程序错误地修改了不该修改的数据,导致数据出错)。...避免返回局部变量的地址 局部变量在函数结束后其内存会被释放,如果返回其地址,就会得到一个野指针。如上述野指针成因的第三种其情况。...产生原因: 空指针通常是由开发者主动将其赋值为 NULL 来表示某种特殊情况或未初始化的状态。 野指针通常是由于编程错误,比如指针未初始化、指针所指向的内存被释放后未正确处理等原因产生的。

    18810

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

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

    58630

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

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

    55120

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

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

    1.1K10

    jvm系列之对象

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

    26720

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

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

    89810

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

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

    3.4K60
    领券