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

为什么从int的地址回读不能返回int的正确值(C & gdb)

从int的地址回读不能返回int的正确值的原因是因为地址回读操作会将地址所指向的内存中的数据按照指定的数据类型进行解析,如果将int类型的地址回读为int类型的值,那么会将地址所指向的内存中的数据按照int类型进行解析,但是实际上内存中存储的数据可能不是一个有效的int值,或者是被其他数据类型覆盖了。

在C语言中,指针可以用来存储变量的地址,通过指针可以访问和修改对应地址上的数据。但是如果将一个int类型的指针直接回读为int类型的值,可能会导致以下问题:

  1. 内存对齐问题:在某些架构下,内存对齐要求变量的地址必须是某个特定值的倍数,如果将一个地址回读为int类型的值,可能会导致内存对齐问题,进而影响数据的正确解析。
  2. 数据类型不匹配:地址回读操作会按照指定的数据类型解析内存中的数据,如果将int类型的地址回读为int类型的值,但实际上内存中存储的数据可能是其他类型的数据,例如字符型、浮点型等,这样就会导致数据类型不匹配,无法正确解析。
  3. 数据被覆盖:在程序运行过程中,内存中的数据可能会被其他变量或操作所修改,如果将int类型的地址回读为int类型的值,但实际上内存中的数据已经被其他数据类型的变量覆盖,那么回读的结果将不是预期的int值。

为了正确回读int类型的值,可以使用指针来获取地址所指向的int类型的数据,例如通过以下方式获取int类型的值:

代码语言:txt
复制
int value = 10;
int* ptr = &value;
int readValue = *ptr;

在这个例子中,通过指针ptr获取了变量value的地址,并使用解引用操作符*来获取地址所指向的int类型的值,这样可以确保获取到正确的int值。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各类业务需求。产品介绍链接
  • 腾讯云云数据库 MySQL 版:高性能、可扩展的关系型数据库服务。产品介绍链接
  • 腾讯云人工智能平台(AI Lab):提供丰富的人工智能算法和模型,支持开发者构建智能应用。产品介绍链接
  • 腾讯云物联网平台(IoT Hub):提供全面的物联网解决方案,支持设备连接、数据管理和应用开发。产品介绍链接
  • 腾讯云移动推送(TPNS):提供高效稳定的移动消息推送服务,支持多种推送场景。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

初识字节流+实现缓冲字节流OutputStream主要方法构造方法关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回Int型而不是

charnum) write(byte[] array) write(byet[] array,int off,int len)写出array中角标off开始len个元素 刷新 flush...read():int read(byte[] array):int 与Reader类一样,如果到了文件末尾,返回-1 这里有个特别好用方法,可以用来知道文件大小 available(...):int; 返回文件字节数 这时就可以用这个方法来定义array大小,那么就可以一次性读完了 关流 flush() ---- 缓冲技术 缓冲技术就是把信息分批处理,再一起丢出去,这样处理速度会快很多...\Users\钟绍威\Desktop>java Demo 复制所用时间:117毫秒 Tips:用write(byte[])会比write(int)快得多多 输入缓冲就是先把数据存在数组中,数组中一个个读到控制台...---- 错误返回了-1 如果扫描到了11111111那么此时将byte->int是-1,如果这样的话,程序就会终止不会进行 为什么read()返回Int型而不是byte型呢??

1.3K80

段错误?打的就是段错误!!

最后一步:gdb调试。这个执行文件叫dcw,是我gdb dcw core.4377,就会看到如下: ? 在最后,它会告诉你,在那个函数、那个地址出了问题。...2 内存/写越界。包括数组访问越界,或在使用一些写内存函数时,长度指定不正确或者这些函数本身不能指定长度,典型函数有strcpy(strncpy),sprintf(snprint)等等。...3 对于C++对象,应该通过相应类接口来去内存进行操作,禁止通过其返回指针对内存进行写操作,典型的如string类c_str()接口,如果你强制往其返回指针进行写操作肯定会段错误,因为其返回地址是只读...4 函数不要返回其中局部对象引用或地址,当函数返回时,函数栈弹出,局部对象地址将失效,改写或这些地址都会造成未知后果。...这类问题也是为什么程序在其他平台跑得好好为什么一移植到这个平台就段错误了。

3.7K20
  • 缓冲区溢出攻击初学者手册(更新版)

    我们已经在内存中写入了比用户输入更多数据,因此重写EBP,返回地址是‘xxxx’,这个过程会尝试在地址0×787878处重复执行,这就会导致段错误。...3b 改变返回地址 让我们尝试利用这个程序来返回lame()来代替它返回,我们要改变返回地址0x80484d0到0x80484cb,在内存中,我们有32字节缓冲区空间,4个字节保存EBP,...如果有溢出存在,函数返回地址是可以变,从而改变程序执行线程。 4 Shellcode 为了简单,Shellcode使用简单汇编指令,我们写在栈上,然后更改返回地址,使它返回到栈内。...call会自动在栈内存储和返回地址,这个返回地址是在下一个call指令后4个字节。在call运行后放置一个正确变量,我们间接地址压进了栈中,没有必要了解它。...5c 重要注意事项 你将不能在Windows 或是Macintosh上使用这个教程,不要和我要cc.exe和gdb.exe。

    1.4K90

    汇编角度来理解linux下多层函数调用堆栈运行状态

    c9                      leave    80483f1:       c3                      ret bar函数有一个int返回,这个返回是通过...现在esp所指向栈顶保存着返回地址,把这个恢复给eip(pop),同时esp增加4,esp变成0xbffff690。 2....根据上面的分析,ebp最终会重新获取值0x00000000, 而main函数返回到0xb7e39473地址去执行,最终esp为0xbffff6b0。...知道了main函数返回地址,我们也就明白了所谓shellcode大概实现原理,利用栈空间变量缓冲区溢出将返回地址覆盖掉,将esp所指返回地址pop到eip时,就会改变程序流程,不再是正确地退出...注意函数调用和返回过程中这些规则: 1. 参数压栈传递,并且是右向左依次压栈。 2. ebp总是指向当前栈帧栈底。 3. 返回通过eax寄存器传递。

    95020

    gdb 调试笔记

    DR0-DR7 不需要修改程序代码,可以针对EEPROM上代码位置 有数量限制,x86上最多4个 (4)监视断点 监视表达式,变化时中断 watch a*b + c/d watch *(int *...p/d 显示有符号十进制 p/u 显示无符号十进制 p/o 显示八进制 p/t 显示二进制 p/a 显示地址 p/c 显示符号 p/f 显示浮点数 p/r 以上一次格式显示 x/i 显示汇编 x...set print finish on 继续执行到函数后会打印返回,本机测试不成功???...call func 执行func函数并打印返回 return result 强制返回返回为result 六、实用操作 gdb 重放操作 repeat (1)启动参数 gdb ‐n :可以不加载任何...info symbol addr 查找地址对应symbol,如果找不到,会返回最近symbol+偏移 directory/dir dirname 设置符号表搜索路径 info program 显示程序状态

    90700

    汇编角度来理解linux下多层函数调用堆栈运行状态

    c9                      leave    80483f1:       c3                      ret bar函数有一个int返回,这个返回是通过...现在esp所指向栈顶保存着返回地址,把这个恢复给eip(pop),同时esp增加4,esp变成0xbffff690。 2....根据上面的分析,ebp最终会重新获取值0x00000000, 而main函数返回到0xb7e39473地址去执行,最终esp为0xbffff6b0。...知道了main函数返回地址,我们也就明白了所谓shellcode大概实现原理,利用栈空间变量缓冲区溢出将返回地址覆盖掉,将esp所指返回地址pop到eip时,就会改变程序流程,不再是正确地退出...注意函数调用和返回过程中这些规则: 1. 参数压栈传递,并且是右向左依次压栈。 2. ebp总是指向当前栈帧栈底。 3. 返回通过eax寄存器传递。

    1.5K00

    Biu一下GDB

    注意在程序开始执行前只能用r,而不能c n next 执行一条语句。如果有函数调用,则把它当做一个整体 s step 执行一条语句。...如果要实现真正交换,我们应该传入是存储变量地址,此时函数swap形参类型应该为指针类型 PS: C语言变量都是放在内存中,而内存中间每一个字节都有一个称为地址(address)编号。...每一个变量都占有一定数目的字节(可以用sizeof运算符获得),其中第一个字节地址称为变量地址。...在函数执行体完毕后删除栈帧,处理返回,并修改当前代码行数。...f(1)栈帧):师爷,你给我算下f(0) 师爷(拥有f(0)栈帧):老爷,f(0)=1 县令(心算f(1)=f(0)1=1):知府大人,f(1)=1 知府(心算f(2)=f(1)2=2):大人

    33630

    Ffplay源码之read_thread解析(二)

    调函数中返回1则代表ffmpeg结束耗时操作退出当前函数调⽤ 调函数中返回0则代表ffmpeg内部继续执⾏耗时操作,直到完成既定任务(⽐如读取到既定 数据包) static int decode_interrupt_cb...为什么在调⽤了avformat_open_input后,仍然需要调⽤avformat_find_stream_info 才能获取正确流信息呢: 该函数是通过读取媒体⽂件部分数据来分析流信息。...如果指定了正确wanted_stream_nb,⼀般情况都是直接返回该指定流,即⽤户选择流。...我们接着往下: //待处理流中获取相关参数,设置显示窗⼝宽度、⾼度及宽⾼⽐ is->show_mode = show_mode; if (st_index[AVMEDIA_TYPE_VIDEO...//此函数会尝试返回待显示帧应当使⽤宽⾼⽐。 //基本逻辑是优先使⽤流宽⾼⽐(前提是是合理),其次使⽤帧宽⾼⽐。

    60330

    字节对齐

    什么是对齐,以及为什么要对齐: 现代计算机中内存空间都是按照byte划分理论上讲似乎对任何类型变量访问可以任何地址开始,但实际情况是在访问特定变量时候经常在特定内存地址访问,这就需要各类型数据按照一定规则在空间上排列...比如有些平台每次都是地址开始,如果一个int型(假设为 32位系统)如果存放在偶地址开始地方,那么一个周期就可以读出,而如果存放在奇地址开始地方,就可能会需要2个周期,并对两次读出结果高低字节进行拼凑才能得到该...例子分析: 分析例子B; struct B { char b; int a; short c; }; 假设B地址空间0x0000开始排放。...第三个变量c自身对齐为2,所以有效对齐为2,顺序存放 在0x0006、0x0007中,符合0x0006%2=0。所以0x0000到0x00007共八字节存放C变量。...) p &a1->a $1 = 0x501010 "" (gdb) p &a1->b $2 = (short int *) 0x501012 (gdb) p &a1->c $3 =

    2.1K50

    腾讯C++后台开发面试笔试知识点参考笔记

    查看内存 (gdb)p &a //打印变量地址 (gdb)x 0xbffff543 //查看内存单元内变量 0xbffff543: 0x12345678 (gdb) x /4xb 0xbffff543...//单字节查看4个内存单元变量 0xbffff543: 0x78 0x56 0x34 0x12 多线程调试 (gdb) info threads:查看GDB当前调试程序各个线程相关信息 (gdb...已连接 UDP 套接字 相对于 未连接 UDP 套接字 会有以下变化: 不能给输出操作指定目的 IP 地址和端口号(因为调用 connect 函数时已经指定),即不能使用 sendto 函数,而是使用...在一个已连接 UDP 套接字上,由内核为输入操作返回数据报只有那些来自 connect 函数所指定协议地址数据报。...)(operator new) 调用构造函数 (调用A构造函数(如果A有的话))(placement new) 返回正确指针 当然,如果我们创建是简单类型变量,那么第二步会被省略。

    1K10

    雪城大学信息安全讲义 4.3~4.4

    3.2 系统化代码修改 StackShield:分离控制(返回地址)和数据。 它是保护返回地址 GCC 编译器扩展。 当函数调用时,StackShield 将返回地址复制到不能覆盖区域。...函数返回时,返回地址被存储。因此,即使栈上返回地址发生改变,也没有效果,因为原始返回地址返回地址用于跳转之前复制了回来。...无论函数什么时候调用,都可以将一个哨兵放在返回地址旁边。 如果函数返回,哨兵发生改变,就代表发生了缓冲区溢出。 StackGuard 也内建于 GCC。...在执行漏洞程序之前,创建环境变量,为/bin/sh。当 C 程序 Shell 执行时,它就会 Shell 继承所有环境变量。...我们首先让目标程序返回到 Libc setuid函数。当这个函数返回时,它会栈上抓取返回地址,并跳到该地址

    53330

    GDB调试入门,看这篇就够了

    本文以C程序为例,介绍GDB启动调试多种方式。 哪类程序可被调试 对于C程序来说,需要在编译时加上-g参数,保留调试信息,否则不能使用GDB进行调试。...打印指针指向内容 如果还是使用上面的方式打印指针指向内容,那么打印出来只是指针地址而已,例如: (gdb) p d $1 = (int *) 0x602010 (gdb) 而如果想要打印指针指向内容...查看内存内容 examine(简写为x)可以用来查看内存地址。...,这里没有考虑溢出*/ int add(int a, int b) { int c = a + b; return c; } /*打印0到num-1数*/ int count(int...(gdb) 设置完成后,可以通过show substitute-path来查看设置结果。这样它也能在正确路径查找源码啦。

    7.6K62

    c++中引用面试点7连问以及引用真的不分配内存吗

    引用作为函数返回需遵循规则: 不能返回局部变量引用,因为局部变量在函数返回同时也会被释放掉; 不能返回函数内部动态分配变量引用,因为引用只是作为一个临时变量出现,并未赋予一个实际变量,该引用所指向空间无法被释放...; 可以返回类成员引用,但最好是const类型,防止成员被修改; 为了保证连续使用流操作符(>)重载返回时,操作是同一个对象,流操作符重载返回应该声明为引用; +-*/这四则运算符重载不能返回引用...c7 45 ec 02 00 00 00 movl $0x2,-0x14(%rbp) #把2这个赋给寄存器rbp偏移20个位置地方,也就是把a这个变量赋给它地址 (gdb) n 4...rbp寄存器偏移8个位置地方,其实就是把变量a地址存入rbp寄存器偏移8个位置地方 (gdb) 5 int *c = &a; => 0x000000000040056f <main...通过以上代码和汇编指令,对引用和数组区别总结如下: c++层面看,引用是变量别名,对引用进行操作其实就是对变量本身操作,而指针是通过它所保存地址来对变量进行间接操作; 引用和指针一样,都会申请一段内存用来存放变量地址

    55320

    40.Linux应用调试-使用gdb和gdbserver

    通过Makefile里arm-linux-gcc  -g 来,     -g:表示编译文件里包含gdb调试信息 1.2为什么需要调试信息编译文件?...比如开发板应用程序里变量a: 首先gdb通过应用程序带调试信息编译文件,来找出变量a存地址位置 然后将地址发送给开发板里gdbserver,来读出a地址 2.安装gdb和gdbserver...) #include void C(int *p) {    *p = 0x12; } void B(int *p) {   C(p); } void A(int *p).../test_debug //192.168.2.107:本地IP地址 //2345:端口号,用来让gdb来连接用 //....c 启动程序运行  step 单步执行 next   单步执行,和step不同是,比如:当前行里有函数调用时,next直接执行下一句,step会进入函数 print a 打印a变量 quit 退出

    3.9K80

    吃土记之GDB调试原理

    老王:gdb调试呀 小王:gdb 为什么可以非侵入调试进程呀。 老王:这个我没想过。。。平时不考虑这个问题 gdb基本上大家都在用,你有没有想过它实现原理是什么?...为什么它可以控制程序执行、中断、访问内存甚至直接使程序流程改变? 在使用gdb调试程序时,程序进程状态是”T”,但又似乎并非接到了SIGSTOP信号, 那么这个”T”是什么呢?...addr:进程某个地址空间,可以通过这个参数对进程某个地址进行或写操作。...等待(时间、时间、信号) 内存分配和去配 文件管理 文件创建和删除 打开和关闭 、写和重定位 得到/设置文件属性 设备管理 设备请求和释放 、写和重定位 得到/设置设备属性 设备逻辑关联或去关联...对应封装函数由下列汇编指令实现(以函数调用为例): ; NASM ; read(int fd, void *buffer, size_t nbytes) mov eax, 3 ;

    1.1K20

    结合实例深入理解C++对象内存布局

    成员方法是如何拿到成员变量地址? 这些其实涉及 C++ 对象模型,《深度探索 C++对象模型:Inside the C++ Object Model》这本书全面聊了这个问题,非常值得一。...函数调用约定与优化 上面的汇编代码中,setB 两个参数,都是寄存器先放到栈上,接着又从栈上放到寄存器进行操作,为什么要移来移去多此一举呢?要回答这个问题,需要先了解函数调用约定和寄存器使用。...接着又将-0x8(%rbp) 放到 rax 寄存器,然后再通过movsd %xmm0,0x8(%rax)写入成员变量 b ,为啥不直接xmm0寄存器写到基于 rbp 偏移地址呢?...这是因为 C++标准关注是行为和语义,确保我们使用多态特性时能够得到正确行为,但它不规定底层内存布局或具体实现机制,这些细节通常由编译器实现来决定。...地址空间布局随机化 前面的例子中,如果用 GDB 多次运行程序,对象虚拟内存地址每次都一样,这是为什么呢?

    46821

    如何实现一个Lua调试器

    实现 下面是具体实现细节,既然期望是gdb风格,那么很显然,我们不能修改源程序,不管是c部分还是lua部分。所以我们需要一个第三方程序来附加到目标进程上,然后开始调试。..."}; 然后我们使用gdb,去获得每个函数对应内存地址,例如: gdb -p PID -ex "p (long)luaV_execute" --batch 最后,在这个地址,使用hooksoargp.../hookso argp PID 0xXXXXXX 1 循环几个函数尝试,最后我们拿到了lua_State指针 2.png 这里可能有人要问,为什么不自己去解析,要使用gdb呢?...而start_agent只是设置一下lua_sethook,和一个标志位,如下: extern "C" int start_agent(lua_State *L, int pid) { if...然后判断这个函数返回即可 step模式 前面提到,当触发断点后,进入了step模式。

    2.1K30

    HOK日志组件BqLog为什么这么快之2——创新型WaitFree并发队列

    交换:如果相等,则将这个地址值更新为新;如果不相等,说明其他线程已经修改了这个,当前线程操作失败,需要重试。...它通过两个步骤完成操作: 获取当前:获取变量操作前。 执行加法:将指定加到变量上,并原子地更新该返回之前返回执行add前该变量实际。...buf, 15);//线程C调用 假设fifo->in初始是0,三个线程同时执行后,它们分别对应内存开始位置可能是: 线程A:0。...为了解决这个问题,既要Wait-Free,又要结果正确,bq::ring_buffer发明了一种滚机制,当发生空间不足时候,可以做一次Rollback。然后返回空间不足错误。...接下来重点说一下滚算法思路。为什么滚算法需要是CAS,而不是直接fetchadd(this->in, -len)这样把自己加上去数值减掉。

    25710
    领券