我明白了
==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
函数仅声明两个局部变量和一个函数参数。这两个变量都有初始值设定项,并且参数(指针)将收到一个值作为函数调用的结果,假设它的正确原型(prototype)位于调用点的范围内。因此,这些都不会在未初始化的情况下使用。
唯一使用的其他数据(不包括常量)是参数pKey
指向的数据。其中,您的代码使用 pKey[0]
。 Valgrind 报告的问题支持了这样的结论:这就是它所提示的数据:valgrind 的默认 memcheck 服务监视动态分配的内存,这是唯一可能动态分配的内容。
当您更改 BITS
的定义时,错误就会消失,这可以通过当 BITS
时优化掉表达式 pKey[0] & msb
来解释。 code> 计算结果为大于 8 的值。
就您的更新而言,它旨在表明该函数的参数实际上指向初始化的数据,我倾向于认为您正在寻找错误的位置,或者在正确的位置但在错误的位置代码。也就是说,可能是对 checkMSB
的不同调用导致 Valgrind 提示,或者正在测试的二进制文件是从不同版本的代码构建的。我不准备相信您在问题中提出的所有内容都是真实的,或者至少不相信它像您所说的那样吻合。
关于c - 使用尺寸 8 Valgrind 的未初始化值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51103943/