sscanf的用法误区 导致越界访问
2015-07-29 15:20
543 查看
struct DATA
{
BYTE a;
BYTE b;
BYTE c;
BYTE d;
};
char *str = "fd";
DATA data;
sscanf(str, "%02x", &data.a);
乍一看,程序没有什么毛病,笔者测试发现,上面这段程序实际上已经导致结构体变量b,c,d都被操作赋值了。
原因在于sscanf的参数为"%d" "%x"的时候,会认为传入的地址值为一个整型变量,在VS编译器上是4个字节,
就是说本意只对变量a操作,但是污染了变量b,c,d。
正确的做法是
char *str = "fd";
DATA data;
int tmp = 0;
sscanf(str, "%02x", &tmp );
data.a = (BYTE )tmp ; //这里显示表示整型截断转为字节,
还有结构体使用的时候,也要注意自己对齐的问题,VS编译器默认对齐是4字节。
如果程序需要结构体按1字节对齐,要自己做下处理,这个网上有代码,就不列出来了。
{
BYTE a;
BYTE b;
BYTE c;
BYTE d;
};
char *str = "fd";
DATA data;
sscanf(str, "%02x", &data.a);
乍一看,程序没有什么毛病,笔者测试发现,上面这段程序实际上已经导致结构体变量b,c,d都被操作赋值了。
原因在于sscanf的参数为"%d" "%x"的时候,会认为传入的地址值为一个整型变量,在VS编译器上是4个字节,
就是说本意只对变量a操作,但是污染了变量b,c,d。
正确的做法是
char *str = "fd";
DATA data;
int tmp = 0;
sscanf(str, "%02x", &tmp );
data.a = (BYTE )tmp ; //这里显示表示整型截断转为字节,
还有结构体使用的时候,也要注意自己对齐的问题,VS编译器默认对齐是4字节。
如果程序需要结构体按1字节对齐,要自己做下处理,这个网上有代码,就不列出来了。
相关文章推荐
- 项目安全性问题总结
- js将时间戳转换为日期类型
- docker 使用
- AutoCAD开发小记
- ECSHOP解决大量重复页面问题
- sendfile
- 系统级性能分析工具 — Perf
- 再论Bellman-Ford算法
- SQL 语法之“增”、“删”、“改”、“查”
- Unity3d 中的Mathf 运算
- mysql 解决 emoji 表情存储问题-note
- 1084:写出来吧
- 【转】eclipse下使用git上传(下载)代码至(从)github
- 另一种递归构造二叉树,不同于剑指offer
- NYOJ587 blockhouses【DFS】
- QTP/UFT以XPath作为属性标识对象
- 实现键盘操作鼠标的简单程序
- LeetCode 5_Longest Palindromic Substring
- opencv中keypoint数据结构分析
- 寻找丑数