防止无效内存访问valgrind C



我正在努力理解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。你有更多(完整(代码的链接吗?

最新更新