C语言 使用尺寸 8 瓦尔格林德的未初始化值



我得到了

==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函数仅声明两个局部变量和一个函数参数。 变量都有初始值设定项,参数(指针(将作为函数调用的结果接收一个值,假设在调用时它的正确原型在范围内。 因此,这些都不会在未初始化的情况下使用。

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

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

至于您的更新,旨在显示函数的参数实际上指向初始化的数据,我倾向于认为您查找错误的位置,或者在正确的位置但错误的代码。 也就是说,可能存在不同的checkMSB调用导致 Valgrind 抱怨,或者正在测试的二进制文件是从不同版本的代码构建的。 我不准备相信你在问题中提出的一切都是真的,或者至少不相信它像你所说的那样吻合在一起。

最新更新