Error: Conditional jump or move depends on uninitialised value - C valgrind
Error: Conditional jump or move depends on uninitialised value - C valgrind
我是 C 的新手,我遇到了一个常见问题,但实际上我无法理解我的原因。
我有这个方法,它的目的是用指定的名称初始化一个 Map 并检查它是否存在于红黑树中。
void reduceMap(char *mapName){
Map *tempMap = (Map *) malloc(sizeof(Map));
struct rbNode *tempNode = (struct rbNode *) malloc(sizeof(struct rbNode));
copyName = stringCopy(mapName);
tempMap->name = copyName;
tempNode->data = tempMap;
...DO SEARCH HERE...
freeMap(tempNode);
}
所以我为包含 Map 的节点分配内存,进行研究并最终释放创建的临时对象的内存。我的对象的结构如下:
typedef struct{
char *name;
char *specification;
Point *start, *end;
}Map;
struct rbNode{
Color color;
void *data;
struct rbNode *parent, *leftChild, *rightChild;
};
方法 stringCopy 和 freeMap 是:
void freeMap(struct rbNode *node){
if(node){
free( ((Map *)node->data)->name );
if(((Map *)node->data)->specification != NULL)
free( ((Map *)node->data)->specification );
free( (Map *)node->data );
free(node);
}
}
char *stringCopy(const char *source){
char *copy = (char *)malloc(strlen(source) + 1);
strcpy(copy,source);
return copy;
}
我正在使用 valgrind 测试程序,这是我得到的错误:
Conditional jump or move depends on uninitialised value(s)
==5215== at 0x8049DF3: freeMap (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== by 0x8048C40: reduceMap (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== by 0x80489DA: main (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== Uninitialised value was created by a heap allocation
==5215== at 0x402C17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5215== by 0x8048B0A: reduceMap (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== by 0x80489DA: main (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
我明白问题出在tempMap的分配上,似乎有些东西没有初始化,但为什么呢?我只关心名字和规格。。。我真的看不懂。
如有任何帮助,我们将不胜感激。
谢谢
简单的说,在你的reduceMap
中,似乎发生了这种情况
Map *tempMap = (Map *) malloc(sizeof(Map));
tempMap->name = copyName;
tempMap->specification = /* what!?? */;
您没有初始化整个分配的struct
。考虑编写一个映射构造函数(以 initMap
函数的形式),以匹配您的析构函数 (freeMap
).
旁注:Don't cast the result of malloc.
您没有在映射中初始化规范成员
typedef struct{
char *name;
char *specification;
Point *start, *end;
} Map;
但后来你使用这个未初始化的值进行条件跳转(if语句):
if(((Map *)node->data)->specification != NULL)
解决方案
在使用之前初始化 Map
的所有成员。
我是 C 的新手,我遇到了一个常见问题,但实际上我无法理解我的原因。
我有这个方法,它的目的是用指定的名称初始化一个 Map 并检查它是否存在于红黑树中。
void reduceMap(char *mapName){
Map *tempMap = (Map *) malloc(sizeof(Map));
struct rbNode *tempNode = (struct rbNode *) malloc(sizeof(struct rbNode));
copyName = stringCopy(mapName);
tempMap->name = copyName;
tempNode->data = tempMap;
...DO SEARCH HERE...
freeMap(tempNode);
}
所以我为包含 Map 的节点分配内存,进行研究并最终释放创建的临时对象的内存。我的对象的结构如下:
typedef struct{
char *name;
char *specification;
Point *start, *end;
}Map;
struct rbNode{
Color color;
void *data;
struct rbNode *parent, *leftChild, *rightChild;
};
方法 stringCopy 和 freeMap 是:
void freeMap(struct rbNode *node){
if(node){
free( ((Map *)node->data)->name );
if(((Map *)node->data)->specification != NULL)
free( ((Map *)node->data)->specification );
free( (Map *)node->data );
free(node);
}
}
char *stringCopy(const char *source){
char *copy = (char *)malloc(strlen(source) + 1);
strcpy(copy,source);
return copy;
}
我正在使用 valgrind 测试程序,这是我得到的错误:
Conditional jump or move depends on uninitialised value(s)
==5215== at 0x8049DF3: freeMap (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== by 0x8048C40: reduceMap (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== by 0x80489DA: main (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== Uninitialised value was created by a heap allocation
==5215== at 0x402C17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5215== by 0x8048B0A: reduceMap (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
==5215== by 0x80489DA: main (in /home/ve/Dropbox/progetto2016/Percorsi/percorsi)
我明白问题出在tempMap的分配上,似乎有些东西没有初始化,但为什么呢?我只关心名字和规格。。。我真的看不懂。
如有任何帮助,我们将不胜感激。 谢谢
简单的说,在你的reduceMap
中,似乎发生了这种情况
Map *tempMap = (Map *) malloc(sizeof(Map));
tempMap->name = copyName;
tempMap->specification = /* what!?? */;
您没有初始化整个分配的struct
。考虑编写一个映射构造函数(以 initMap
函数的形式),以匹配您的析构函数 (freeMap
).
旁注:Don't cast the result of malloc.
您没有在映射中初始化规范成员
typedef struct{
char *name;
char *specification;
Point *start, *end;
} Map;
但后来你使用这个未初始化的值进行条件跳转(if语句):
if(((Map *)node->data)->specification != NULL)
解决方案
在使用之前初始化 Map
的所有成员。