精华内容
下载资源
问答
  • Valgrind检测使用未初始化的内存

    千次阅读 2019-05-18 10:01:14
    对于位于程序中不同段变量,其初始值是不同,全局变量和静态变量初始值为0,而局部变量和动态申请变量,其初始值为随机值。如果程序使用了为随机数变量,那么程序行为就变得不可预期了。 二错误代码 ...

    一 点睛

    对于位于程序中的不同段的变量,其初始值是不同的,全局变量和静态变量初始值为0,而局部变量和动态申请的变量,其初始值为随机值。如果程序使用了为随机数的变量,那么程序的行为就变得不可预期了。

    二 错误代码

    #include<iostream>
    using namespace std;
    int main(){
        int a[5];
        int i,s=0;
        a[0]=a[1]=a[3]=a[4]=0;
        for(i=0;i<5;i++)
                s=s+a[i];
        if(s==33)
                cout<<"sum is 33"<<endl;
        else
                cout<<"sum is not 33"<<endl;
        return 0;
    }

    三 编译并运行

    [root@localhost charpter05]# g++ -g 0509test.cpp -o 0509
    [root@localhost charpter05]# ./0509
    sum is not 33

    四 用Valgrind检测使用未初始化的内存

    [root@localhost charpter05]# valgrind ./0509
    ==17792== Memcheck, a memory error detector
    ==17792== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
    ==17792== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
    ==17792== Command: ./0509
    ==17792==
    ==17792== Conditional jump or move depends on uninitialised value(s)
    ==17792==    at 0x4008B8: main (0509test.cpp:9)
    ==17792==
    sum is not 33
    ==17792==
    ==17792== HEAP SUMMARY:
    ==17792==     in use at exit: 0 bytes in 0 blocks
    ==17792==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
    ==17792==
    ==17792== All heap blocks were freed -- no leaks are possible
    ==17792==
    ==17792== Use --track-origins=yes to see where uninitialised values come from
    ==17792== For lists of detected and suppressed errors, rerun with: -s
    ==17792== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

    五 分析

    ==17792== Conditional jump or move depends on uninitialised value(s)
    ==17792==    at 0x4008B8: main (0509test.cpp:9)

    程序的第9行,程序的跳转依赖于一个未初始化的变量a[2].Valgrind准确地发现了上述程序中存在的错误。

    展开全文
  • 警告 C6001 使用未初始化的内存“*head”。 #include #include #include #include using namespace std; typedef struct list { int number; struct list* next; }list; void build(list* head,...
  • <p style="text-align:center"><img alt="" height="858" src="https://img-ask.csdnimg.cn/upload/1607954323232.png" width="1519" /></p>  </p>
  • 因为定义指针后直接使用: *p = *x;...这样语句,虽然只是告警并显示错误,但这样做确实是超出规则了,如果只看左边,p相当于是个野指针,*p当然是不行 直接用 p = x 就没有问题 别乱用就行了 ...

    因为定义指针后直接使用:

    *p = *x;
    

    这样的语句,虽然只是告警并未显示错误,但这样做确实是超出规则了,如果只看左边,p相当于是个野指针,*p当然是不行的

    直接用
    p = x 就没有问题

    别乱用就行了

    展开全文
  • 当我们使用未初始化的内存指针时,会导致程序无法进行,因为指针并没有指向一个合法的地址,这时候其内部存的只是一些乱码。所以在调用函数时,会使用乱码所指的内存,指针根本就无权访问,导致出错。 看一段代码 #...

    当我们使用未初始化的内存指针时,会导致程序无法进行,因为指针并没有指向一个合法的地址,这时候其内部存的只是一些乱码。所以在调用函数时,会使用乱码所指的内存,指针根本就无权访问,导致出错。
    看一段代码

    #include<stdio.h>
    void getvalue(float x, float y, float* sum); //计算两个浮点数的和
    int main()
    {
    	float a, b;
    	float* sum;
    	scanf_s("%f%f", &a, &b);
    	getvalue(a, b, sum);
    	return 0;
    }
    void getvalue(float x, float y, float* sum)
    {
    	float sum1;
    	sum1 = x + y;
    	sum = &sum1;
    	printf("两者之和是%.2f\n ", *sum);
    }
    

    会出现
    调用函数getvalue时,其中的指针sum指向的是乱码,函数就无法正确进行
    解决办法是为指针动态分配内存,之后再将其释放
    看代码怎么解决

    #include<stdio.h>
    void getvalue(float x, float y, float* sum);
    int main()
    {
    	float a, b;
    	float(*sum) = malloc(100);  //为指针summ动态分配内存;
    	scanf_s("%f%f", &a, &b);
    	getvalue(a, b, sum);
    	free(sum);    //用完动态内存之后记得将其释放,不然会造成内存的泄露
    	return 0;
    }
    void getvalue(float x, float y, float* sum)
    {
    	float sum1;
    	sum1 = x + y;
    	sum = &sum1;
    	printf("两者之和是%.2f\n ", *sum);
    }
    

    成勋能够成功运行
    博客记录成长

    展开全文
  • 明明已经定义了due,为什么还会报警说“使用未初始化的内存due?” ``` #include main() { float money,due; char ontime; printf("How much do you owe?"); scanf_s("%f", &money); printf("On ...
  • KMSAN(KernelMemorySanitizer)KMSAN是Linux内核未初始化内存使用的检测器。 目前正在开发中。 联系人:[受电子邮件保护]代码带有KMSAN补丁内核分支可用KMSAN(KernelMemorySanitizer)KMSAN是Linux内核未初始化...
  • c语言小白,这 <p style="text-align:center"><img alt="" height="946" src="https://img-ask.csdnimg.cn/upload/1605000591843.png" width="931" /></p> 应该怎么解决 <code>#include<stdio.h> ...</p>
  • KernelMemorySanitizer是在Linux内核中使用未初始化内存的检测器,KMSAN is a detector of uninitialized memory use for the Linux kernel.
  • KMSAN是Linux内核未初始化内存使用的检测器。 目前正在开发中。 联系人:@ ramosian-glider 代码 带有KMSAN补丁内核分支可从获得。 这些将有朝一日在上游,敬请期待! 如何建造 export WORLD=`pwd` 为了使用...
  • malloc到未初始化的内存

    千次阅读 2016-09-20 09:41:23
    在最近开发过程中发现一个malloc到未初始化内存的错误. 在使用CLISH(一款命令行开源软件)时候,每次这个程序退出时候都会发生core dump,错误为invalid pointer: 0x00007ffff02b35d8 . 但是这个错误只在某一台...

    在最近开发过程中发现一个malloc到未初始化内存的错误.

    在使用CLISH(一款命令行开源软件)的时候,每次这个程序退出的时候都会发生core dump,错误为invalid pointer: 0x00007ffff02b35d8 .

    但是这个错误只在某一台机器上发生错误,在完全相同配置(软硬件)的另外一台机器的时候,并不发生错误,调整clish加载的xml文件的之后,这个错误也会消失.

    通过gdb调试发现core发生在free一个ptype_t指针的时候发生的错误,并且该指针地址为一个非法地址,这个指针指向的结构是一个声明了引用,但是并没有声明定义的类型(PTYPE).

    在声明这个引用的定义之后,错误会消失.

    在调试过程中,在最后free之前将指针指向NULL,就不会发生core.

    再最初初始化了这个类型之后,后面有很多的代码都有机会更改这个结构的指针,没办法搜寻所有代码进行分析.

    最后把目光转向初始化

     

    clish_ptype_t *
    clish_ptype_new(const char              *name,
                    const char              *help,
                    const char              *pattern,
                    clish_ptype_method_e     method,
                    clish_ptype_preprocess_e preprocess)
    {
        clish_ptype_t *this = malloc(sizeof(clish_ptype_t));
        memset(this, 0, sizeof(clish_ptype_t)); //这行是后加的
    
        if(NULL != this)
        {
            clish_ptype_init(this,name,help,pattern,method,preprocess);
        }
        return this;
    }
    

     

     

    这个函数初始化之后,就进行init,填充指针指向的地址,但是由于这个类型没有定义,所以有些内容就不会被填充,如果malloc的地址又是一个未初始化的地址,里面的内容就会被当成地址在最后free的时候释放,由于这个地址是非法的,所以就会发生最后的invalid pointer错误.

     

    这个错误其实是配置错误,所有在xml引用的类型都应该有定义,有定义的类型都不会发生coredump

    从另外一个角度讲,这个错误也是由于malloc内存之后没有进行初始化,完全信赖后面的init方法会正确进行初始化造成的, 所以这也是一个clish的bug, malloc之后一定要进行初始化, 虽然这个错误发生并不是绝对的.

    既然建议所有申请的内存都要进行初始化,不知道为什么这个标准api万年不变呢?

    还有一个问题就是这个内存释放发生在程序退出的时机,但是程序退出之后,所有内存都要返回给操作系统,那这个内存释放是否是画蛇添足呢?


     

    展开全文
  • 上次在MSDN论坛上看见一个网友问ZeroMemory用处,问题里面说他在内存上分配了一个变量,但是在使用它调用一个函数时候,系统报告Access ... // 使用未初始化变量.cpp : Defines the entry point for the con
  • 未初始化的指针,动态分配内存,未释放结构体内指针所指向的空间,总结未初始化的指针动态分配内存未释放结构体内指针所指向的空间总结 未初始化的指针 首先我们来说明一下我们之前经常用到的一个例子,然后修改代码...
  • CVE-2020-1206未初始化的内核内存读取POC (c)2020 ZecOps,Inc.- ://www.zecops.com-查找攻击者的错误POC检查CVE-2020-1206 /“ SMBleed”预期结果:包含目标计算机内核内存的本地文件。仅用于公司环境中的教育和...
  • 1、局部变量定义后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化 这意味着定义局部变量后,系统并为这个变量分配内存空间,   2、直到等到程序为这个变量赋初始值时,系统才会为局部变量...
  • 如图:我定义了一个简单的函数传递操作,在另一处赋值,结果vs报错“使用未初始化的局部变量” ![图片说明](https://img-ask.csdn.net/upload/202003/25/1585145597_662090.png) ==========================...
  • 有时候需要将变量定位到闪存或者其他一些非易失性存储器中,这些变量在启动时不应该初始化,在这种情况下,可以创建一个特定的内存区域在ld文件,使用noload 指令。 网上有很多类似的教程,但是我当只定义一个段在...
  • C语言中的未初始化变量

    万次阅读 2017-11-25 11:56:54
    C语言中未初始化的变量的值是0么 全局变量 、静态变量初始值为0局部变量,自动变量初始值随机分配 C语言中,定义局部变量时如果未初始化,则值是随机的,为什么? 定义局部变量,其实就是在栈中通过移动栈...
  • 错误代码: ... 由于 point 指针未初始化, point 值为任意值,它可能指向一段重要程序代码,  接着对 point 指针赋值语句则改写了 point 指向内存内容,这是极其危险。   转载于...
  • <div><p>下边是一些由于使用kernel/core/tos_task.c中tos_task_create函数造成的使用未初始化变量问题,某些情况下会创建task失败。如果有不当地方请见谅! 宏定义TOS_CFG_OBJECT_VERIFY_EN > ...
  • Valgrind是一套Linux下,开放源代码(GPL V2)仿真调试工具集合。Valgrind由内核(core)以及基于内核其他调试工具组成。内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而...
  • C语言中,定义局部变量时如果未初始化,则值是随机,这是为什么呢? 定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的...
  • 空指针的使用可能造成错误,指针初始化的时候赋初值而造成的野指针的错误更加可怕。  前段时间在重写opencv LK金字塔光流迭代算法(cvCalcOpticalFlowPyrLK 函数)的时候,对初始化在程序中的重要作用有了更加...
  • 局部变量定义后,必须经过显式初始化后才能使用,系统不会回局部变量执行初始化。这意味着定义局部变量后,系统并为这个变量分配内存空间,直到等到程序为这个变量赋初始值时,系统才会为局部变量分配内存,并将...
  • 上述没有对指针初始化正确的应该:使用未初始化的指针是非常危险的。通过一个未初始化的指针会很容易覆盖随机的内存区域。造成的损害取决于如何倒霉,所以初始化指针不仅仅是一个好主意。通过指向一个已经被定义变量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,322
精华内容 928
关键字:

使用未初始化的内存