使用大小为8的未初始化值Valgrind

时间:2018-06-29 14:26:59

标签: c memory valgrind

我要

==56903== Use of uninitialised value of size 8
==56903==    at 0x1000361D1: checkMSB (in ./UnittestCSA)
==56903==    by 0x10003732A: S_derive_k1_k2 (in ./UnittestCSA)

代码如下:

int32_t checkMSB(uint8_t *pKey){
    int8_t msb = 0;
    int32_t ret = 0;
    msb = 1 << (8 - 1);
    /* Perform bitwise AND with msb and num */
    if(pKey[0] & msb){
        ret = 1;
    } else {
        ret = 0;
    }
    return ret;
}

不确定是什么原因引起的。

如果

#define BITS (sizeof(int8_t) * 8)

已更改为此

#define BITS (sizeof(int) * 8)

它没有抱怨。我有#include <stdint.h>头文件。

更新

uint8_t localK1[BLOCKSIZE];
for(index = 0; index < inputLen; index++){
    localK1[index] = pInputText[index];
}

result = checkMSB(localK1);

1 个答案:

答案 0 :(得分:0)

您的checkMSB函数仅声明两个局部变量和一个函数参数。变量都具有初始化程序,并且参数(指针)将通过函数调用接收到一个值,前提是该函数的正确原型位于调用点的范围内。因此,这些都没有被未初始化使用。

唯一使用的其他数据(不计算常数)是参数pKey指向 的那些数据。其中,您的代码使用pKey[0]。 Valgrind报告该问题支持的结论是,它正在抱怨的数据是:valgrind的默认memcheck服务监视动态分配的内存,并且这是唯一可能动态分配的内容。

当您更改BITS的定义时错误消失了,这可能是由于pKey[0] & msb的值大于8时表达式BITS被优化了。

就您的更新而言,该更新旨在表明该函数的参数实际上指向已初始化的数据,我倾向于认为您正在寻找错误的位置,或者在正确的位置但错误的位置码。也就是说,可能是对checkMSB的另一个调用导致Valgrind抱怨,或者正在测试的二进制文件是从不同版本的代码构建的。我不准备相信您在问题中提出的所有内容都是正确的,或者至少不完全按照您似乎所说的那样正确。