我正在努力理解valgrind为什么对我大喊大叫(对C编程和valgrind来说很陌生(
我实现了一个通用链表(在github中找到-多亏了fabianosalles(,它包含如下结构:
typedef struct symbol_entity
{
/* Symbol name */
char *name;
/* Symbol address */
unsigned int address;
/* Indicates if symbol is extern */
bool is_extern;
/* Indicates if symbol is entry */
bool is_entry;
/* Indicates if symbol is instruction */
bool is_instruction;
/* Indicates if symbol is opcode */
bool is_opcode;
} symbol_entity;
此外,我实现了一种将数据插入链表的方法,称为add_symbol_to_list_with_result
如果添加成功,则返回true并将result_symbol设置为添加到列表中的那个人
否则,如果符号已经存在,则返回false,并应将result_symbol初始化为null
(也许还有更好的选择,非常欢迎您提出建议!(
bool add_symbol_to_list_with_result(linked_list **symbols, char *name, bool is_extern, bool is_entry, bool is_instruction, bool is_opcode, unsigned int address, symbol_entity **result_symbol)
{
*result_symbol = (symbol_entity *)verified_malloc(sizeof(symbol_entity));
(*result_symbol)->name = verified_malloc(sizeof(char) * strlen(name));
strncpy((*result_symbol)->name, name, strlen(name));
(*result_symbol)->is_extern = is_extern;
(*result_symbol)->is_entry = is_entry;
(*result_symbol)->is_instruction = is_instruction;
(*result_symbol)->address = address;
(*result_symbol)->is_opcode = is_opcode;
if (!list_contains(*symbols, *result_symbol))
{
list_add(*symbols, *result_symbol);
return TRUE;
}
free(*result_symbol);
result_symbol = NULL;
return FALSE;
}
list_add看起来像:
void list_add(linked_list *list, void *data)
{
node_item *newNode;
if (list != NULL && data != NULL)
{
newNode = verified_malloc(sizeof(node_item));
newNode->data = verified_malloc(list->data_size);
memcpy(newNode->data, data, list->data_size);
if (list->head == NULL)
{
list->head = newNode;
list->tail = newNode;
}
else
{
list->tail->next = newNode;
list->tail = newNode;
}
list->count++;
}
}
当然,经过验证的malloc看起来像:
void *verified_malloc(long size)
{
void *ptr;
ptr = malloc(size);
if (ptr == NULL)
{
printf("Fatal error! Memory allocation failed!");
exit(1);
}
return ptr;
}
add_symbol_to_list_with_result方法被多次调用,我可以在valgrind输出中看到这样的东西:
==9179== Uninitialised value was created by a heap allocation
==9179== at 0x402D17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==9179== by 0x804C074: verified_malloc (in /home/user/.....)
==9179== by 0x804A0F5: list_add (in /home/user/.....)
==9179== by 0x804B4E6: add_symbol_to_list_with_result (in /home/user/.....)
=
.
.
.
==9179== Address 0x4263d94 is 0 bytes after a block of size 4 alloc'd
==9179== at 0x402D17C: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==9179== by 0x804C074: verified_malloc (in /home/user/.....)
==9179== by 0x804B454: add_symbol_to_list_with_result (in /home/user/.....)
这种类型的输出有什么帮助吗
编辑:符号在不同的C文件中声明:linked_list*符号;用以下方法初始化的linked_list:
linked_list *list_create(int dataSize, callback_free free_callback, callback_compare compare_callback)
{
linked_list *list;
if (dataSize > 0)
{
/* Initialize parameters in linked list */
list = (linked_list *)verified_malloc(sizeof(linked_list));
list->count = 0;
list->data_size = dataSize;
list->head = NULL;
list->tail = NULL;
list->callback_free = free_callback;
list->callback_compare = compare_callback;
}
return list;
}
并使用&符号
请尝试
(*result_symbol)->name = verified_malloc(sizeof(char) * (strlen(name)+1));
以说明所需的"\0";在字符串的末尾。
并且在线路之后
strncpy((*result_symbol)->name, name, strlen(name));
包括线路
(*result_symbol)->name[strlen(name)]=' '
只是为了确定。
此外,我猜**symbol
的分配问题会进入bool add_symbol_to_list_with_result
-请显示**symbol
的分配。
问题
list->data_size
等于sizeof(symbol_entity)
吗?
memcpy(newNode->data, data, list->data_size);
请尝试
memcpy(newNode->data, data, sizeof(symbol_entity));
内存处理请注意,您对*result_symbol
的内存处理不准确:
如果返回TRUE,则完全保留*result_symbol
,尽管只需要名称指针的字符数组(*result_symbol
已复制(
如果返回FALSE,则释放*result_symbol
,但不释放名称指针。
在这两种情况下,都会丢失一些内存。
缺少代码是的,您提供的附加代码很有用。然而,由于缺少较大的部分,如其他typedef struct
定义和所提供子程序之上的任何内存处理。。。我什么也看不见了。在开头,您指的是github。你有更多(完整(代码的链接吗?