c - 使用尺寸 8 Valgrind 的未初始化值

标签 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);

最佳答案

您的 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/

相关文章:

c++ - 使用 C++ 字符串时内存泄漏

c - 游戏中计算机和玩家交替移动

c - 在linux平台上使用c在服务器和两个客户端之间建立蓝牙微微网连接?

memory - 当我知道有足够的内存空间时,为什么cudaMalloc给我一个错误?

java - Tomcat 线程就绪

c++ - 从 map 中删除条目显示 Valgrind 中的泄漏

raspberry-pi - 找不到 valgrind pkg freebsd 13.1 版本

c - 为什么这个简单的 C 代码集成代码会失败?

python - 正则表达式命名组以开头但不以结尾

java - Android服务停止,内存和以前一样