首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个C代码有漏洞吗?

这个C代码有漏洞吗?
EN

Stack Overflow用户
提问于 2012-06-16 18:16:22
回答 3查看 151关注 0票数 1

这个C代码有漏洞吗?

虽然答案是正确的,但只是想知道这样写是否可以:

代码语言:javascript
运行
复制
// _mm_adds_epi16 : Adds the 8 signed 16-bit integers in a to the 8 signed 
//16-bit integers in b and saturates
__m128i t7=_mm_adds_epi16(  t5 ,t6  );
unsigned short *p= (unsigned short *)malloc(8);
p=(unsigned short *)&t7;
for(int i=0;i<8;i++)
{
    printf("%d\n", p[i]);
}

更新的

因此,我现将其更新如下:

代码语言:javascript
运行
复制
// _mm_adds_epi16 : Adds the 8 signed 16-bit integers in a to the 8 signed 
//16-bit integers in b and saturates
__m128i t7=_mm_adds_epi16(  t5 ,t6  );
unsigned short *p= (unsigned short *)malloc(8);
p=(unsigned short *)&t7;
for(int i=0;i<8;i++)
{
    printf("%d\n", p[i]);
}

 free(p);

我还有泄密吗?

打印t7的正确方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-16 18:18:21

C中的每个malloc都需要有相应的free,这些free在终止前是可以到达的。这方面的任何异常都构成内存泄漏。

您将malloc的返回存储在p中,并通过覆盖它丢失指针。因此,没有机会释放指针。在特定情况下,malloc本身是多余的,因为您没有以任何方式使用返回。

对于新代码是否存在内存泄漏的问题,是的。malloc分配内存并返回指向分配内存的指针。您正在丢失指针,方法是覆盖指针的值,然后永远不要使用分配的内存。更糟糕的是,您现在正在调用free,它似乎是一个自动变量,它是未定义的行为。

如果打印工作正常,则只需执行以下操作:

代码语言:javascript
运行
复制
__m128i t7 = _mm_adds_epi16(t5, t6);
unsigned short *p = (unsigned short *)&t7;
for(int i=0;i<8;i++) {
    printf("%d\n", p[i]);
}

malloc是多余的,因为您甚至没有使用它分配的内存。

票数 5
EN

Stack Overflow用户

发布于 2012-06-16 18:18:19

是的,有个漏洞。立即覆盖存储动态分配内存地址的指针。这样记忆就无法再访问了。

票数 8
EN

Stack Overflow用户

发布于 2012-06-16 19:08:23

free将释放malloc分配的任何内存。

代码语言:javascript
运行
复制
unsigned short *p= (unsigned short *)malloc(8);

在这里,您已经分配了8个字节的内存,并将该内存地址分配给p

代码语言:javascript
运行
复制
p=(unsigned short *)&t7;

您刚刚为p分配了一个不同的内存地址;前面的内存地址(由malloc返回的内存地址)已被覆盖。我们不再知道分配了8个字节的内存地址。

代码语言:javascript
运行
复制
free(p);

内存泄漏。它不再指向malloc分配的内存。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11065921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档