使用大小为 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 抱怨,或者被测试的二进制文件是从不同版本的代码构建的。我不准备相信您在问题中提出的所有内容都是真实的,或者至少不符合您所说的那样。
我正在
==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 抱怨,或者被测试的二进制文件是从不同版本的代码构建的。我不准备相信您在问题中提出的所有内容都是真实的,或者至少不符合您所说的那样。