c语言,问题1:传入参数私自变化?问题2:调用函数后程序无故死掉? 原因分析
2017-10-13 09:27
477 查看
1:c语言,在被调用函数里并未改变传入参数,参数却变化了的原因分析
2:c语言,调用函数后程序无故死掉原因分析
1:我在函数1中调用函数2,由函数1向函数2传入(uint32_t a,uint32_t b),在函数里并未写改变传入的参数a的语句,结果参数a在操作时竟然不是传入的值,后来找到原因是传入参数a,b,在函数2中操作b时将a值覆盖了,造成操作a时并不是传入的值,那么操作b时怎么会将a覆盖呢,原因是我在函数1中定义a,b
在函数1中定义的b为uint16_t,而传入函数2,函数2把b当成uint32_t数据,当操作b时就会覆盖a地址里的东西,在函数1中,a先入栈,然后b入栈,
当b的地址传入函数2时,函数2把b当成32位的数据操作,就会操作a的前16位,而导致传入参数a数据出错。
我们以为我们没有改变传入参数,实际上由于操作越界就是被调用函数改变了传入参数。
2:那么问题2也是相同的问题,如果函数1的第一个参数在操作时越界,那么调用函数1的函数的压栈返回信息将被破坏,调用函数1的函数将不能返回,最后导致程序崩溃。
我的出错实例:f_read函数传参传错了,导致越界
2:c语言,调用函数后程序无故死掉原因分析
1:我在函数1中调用函数2,由函数1向函数2传入(uint32_t a,uint32_t b),在函数里并未写改变传入的参数a的语句,结果参数a在操作时竟然不是传入的值,后来找到原因是传入参数a,b,在函数2中操作b时将a值覆盖了,造成操作a时并不是传入的值,那么操作b时怎么会将a覆盖呢,原因是我在函数1中定义a,b
int fun1() { uint32_t a; uint16_t b; ... fun2(&a,&b...) } int fun2(uint32_t *m,uint32_t *n);
在函数1中定义的b为uint16_t,而传入函数2,函数2把b当成uint32_t数据,当操作b时就会覆盖a地址里的东西,在函数1中,a先入栈,然后b入栈,
当b的地址传入函数2时,函数2把b当成32位的数据操作,就会操作a的前16位,而导致传入参数a数据出错。
我们以为我们没有改变传入参数,实际上由于操作越界就是被调用函数改变了传入参数。
2:那么问题2也是相同的问题,如果函数1的第一个参数在操作时越界,那么调用函数1的函数的压栈返回信息将被破坏,调用函数1的函数将不能返回,最后导致程序崩溃。
我的出错实例:f_read函数传参传错了,导致越界
p_inf *readPicInf(char *pfilepath) { FIL fileDescriptor; uint16_t readByteResult; char fOptResult; p_inf *infReturn; fOptResult = f_open(&fileDescriptor, (const TCHAR*)pfilepath, FA_READ); if ((fOptResult != FR_OK) || (fileDescriptor.obj.objsize > BMPMEMORYSIZE)) return NULL; infReturn = (p_inf *)malloc(sizeof(p_inf)); if (infReturn == NULL) return NULL; infReturn->pfilestring = (char *)malloc(fileDescriptor.obj.objsize); if (infReturn->pfilestring == NULL) return NULL; fOptResult = f_read(&fileDescriptor,infReturn->pfilestring,fileDescriptor.obj.objsize, (UINT *)&readByteResult); if (fOptResult != FR_OK) return NULL; infReturn->pfilesize = fileDescriptor.obj.objsize; f_close(&fileDescriptor); return infReturn; } FRESULT f_read ( FIL *fp, /* Pointer to the file object */ void *buff, /* Pointer to data buffer */ UINT btr, /* Number of bytes to read */ UINT *br /* Pointer to number of bytes read */ ) { FRESULT res; FATFS *fs; DWORD clst, sect; FSIZE_t remain; UINT rcnt, cc, csect; BYTE *rbuff = (BYTE *)buff; *br = 0; /* Clear read byte counter */ res = validate(&fp->obj, &fs); /* Check validity of the file object */ ..... }
相关文章推荐
- 调用SAP RFC程序,传入参数后,无法查询出结果--问题分析
- 一个很奇怪的问题,程序没有改动加密参数应该也没有变化.但是两次的加密结果却不一致.md5加密问题
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
- JAVA 通过 JNA 调用 C程序 dll 函数传入中文参数问题
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- vc 调用win32程序 参数传入问题
- C访问hadoop程序终端显示运行正确,因为连接参数错误,使得通过网页查看就是没有成功原因分析和解决方案
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
- JAVA程序内存溢出问题原因分析
- Enterprise Library- Data Block使用oracle存储过程,字符串参数传入值为""时出现问题的解决
- 2个程序(一个用glue,一个直接连接xpcom)用了NS_GetServiceManager全部死掉,SIGSEGV的原因
- 关于安装.NET Framework 2.0时偶然碰到的问题(提示"Error 205015. 安装程序集..../System.EnterpriseServices.dll失败,原因是出现了系统错误:拒绝访问。")
- 关于回发或回调参数无效问题原因的剖析
- jsp/servlet取参数乱码问题再分析
- 对mdi程序中一个弹出菜单警告原因的分析
- “从测试用例看测试的问题及变化”文章分析
- ARM程序由于字节对齐引起的问题深入分析
- 古怪问题:vs2003程序 在繁体平台下控件位置发生变化
- FOXPRO 程序在Winxp下面 insufficient memory 问题出现的原因以及解决办法
- 水滴石穿C语言之可变参数问题