如何正确理解Inspector XE的结果及解决问题

intel_zhenyuwang 2011-12-29 03:29:20
加精
Intel(R)Inspector XE 2011是一款专门动态测试应用程序的内存访问错误和线程访问错误的工具。查线程访问错误仅用于多线程程序;查内存访问错误即可以用于多线程程序也可以用于单线程程序。

下面是一段简单程序。(为理解Inspector XE的结果方便起见,配上行号)
01 #include <stdio.h>
02
03 typedef enum { true=1, false=0} bool;
04 struct my_struct{
05 int int_a;
06 bool bool_b;
07 bool dummy[3];
08 int int_c;
09 };
10
11 int main()
12 {
13 struct my_struct *theStruct, theStruct1;
14
15 theStruct = (struct my_struct*)malloc(sizeof(struct my_struct));
16 theStruct->int_a = 10;
17 theStruct->int_c = 20;
18 theStruct->bool_b = true;
19
20 memcpy(&theStruct1, theStruct, sizeof(struct my_struct));
21 printf("integer a is %d, integer c is %d, bool is %d\n", theStruct1.int_a, theStruct1.int_c, theStruct1.bool_b);
22
23 free(theStruct);
24 return 0;
25}

编译后,使用Inspector XE的命令行进行测试
# inspxe-cl -collect mi3 -- ./test_uninitial
Used suppression file(s): []
integer a is 10, integer c is 20, bool is 1

2 new problem(s) found
1 Uninitialized memory access problem(s) detected
1 Uninitialized partial memory access problem(s) detected

输出报告,以了解详细信息。
# inspxe-cl -report problems
Used suppression file(s): []
New Problem P1: Error: Uninitialized memory access
/home/peter/problem_report/test_uninitial.c(15): Error X1: P1: Uninitialized memory access: Allocation site: Function main: Module /home/peter/problem_report/test_uninitial
/home/peter/problem_report/test_uninitial.c(20): Error X2: P1: Uninitialized memory access: Read: Function main: Module /home/peter/problem_report/test_uninitial

New Problem P2: Error: Uninitialized partial memory access
/home/peter/problem_report/test_uninitial.c(15): Error X3: P2: Uninitialized partial memory access: Allocation site: Function main: Module /home/peter/problem_report/test_uninitial
/home/peter/problem_report/test_uninitial.c(20): Error X4: P2: Uninitialized partial memory access: Read: Function main: Module /home/peter/problem_report/test_uninitial

根据以上的结果,你能估计出大概的问题吗?如何解决这个问题?能否给出二种以上的方法。
...全文
435 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
intel_zhenyuwang 2012-01-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 magisu 的回复:]
应该是未初始化dummy吧?
[/Quote]

正解。内存拷贝覆盖结构的地址空间,也即有访问dummy.

解决的方法:(选一种)
1.初始化dummy
2.不使用整个结构拷贝
3.使用calloc代替malloc,此函数含初始化 - calloc(1,sizeof(struct my_struct));
MagiSu 2011-12-31
  • 打赏
  • 举报
回复
应该是未初始化dummy吧?

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧