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

Use of uninitialised value of size 8 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);

您的 checkMSB 函数只声明了两个局部变量和一个函数参数。这两个变量都有初始值设定项,并且参数(指针)将作为函数调用的结果接收一个值,假设它的正确原型在调用点的范围内。因此,其中 none 个未初始化使用。

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

当您更改 BITS 的定义时错误消失可以解释为当 BITS 的计算结果大于 8 时表达式 pKey[0] & msb 被优化掉。

至于你的更新,它声称表明函数的参数实际上指向初始化数据,我倾向于认为你在错误的地方寻找,或者在正确的地方但是在错误的代码。也就是说,可能是对 checkMSB 的不同调用导致 Valgrind 抱怨,或者被测试的二进制文件是从不同版本的代码构建的。我不准备相信您在问题中提出的所有内容都是真实的,或者至少不符合您所说的那样。