【问题标题】:Resolving Invalid Writes errors in valgrind解决 valgrind 中的无效写入错误
【发布时间】:2017-10-27 00:40:23
【问题描述】:

我对使用 valgrind 和一般的 C 语言编程很陌生。我正在尝试理解以下 valgrind 消息

==6225== Invalid write of size 4
==6225==    at 0x10000144D: handle_client (server.c:82)
==6225==    by 0x10000186A: main (server.c:201)
==6225==  Address 0x100a83248 is 0 bytes after a block of size 8 alloc'd
==6225==    at 0x10000BE81: malloc (vg_replace_malloc.c:302)
==6225==    by 0x100001431: handle_client (server.c:80)
==6225==    by 0x10000186A: main (server.c:201)
==6225== 
==6225== Invalid write of size 4
==6225==    at 0x100001458: handle_client (server.c:83)
==6225==    by 0x10000186A: main (server.c:201)
==6225==  Address 0x100a8324c is 4 bytes after a block of size 8 alloc'd
==6225==    at 0x10000BE81: malloc (vg_replace_malloc.c:302)
==6225==    by 0x100001431: handle_client (server.c:80)
==6225==    by 0x10000186A: main (server.c:201)

它解决了这个代码,我试图在其中分配一个结构(ClientContext)

#define DEFAULT_CC_CHANDLES 4
... 
[78]    // create the client context here
[79]    ClientContext* client_context = NULL;
[80]    client_context = malloc( sizeof(client_context) );
[81]    client_context->chandle_table = malloc( sizeof(GeneralizedColumnHandle) * DEFAULT_CC_CHANDLES );
[82]    client_context->chandles_in_use = 0;
[83]    client_context->chandle_slots = DEFAULT_CC_CHANDLES;

该结构的定义是:

typedef struct ClientContext {
    GeneralizedColumnHandle* chandle_table;
    int chandles_in_use;
    int chandle_slots;
    int client_fd;
} ClientContext;

那么究竟是什么导致了这里的无效写入?我没有为结构分配足够的空间吗?我是否应该首先检查 alloc 是否返回有效指针?

【问题讨论】:

  • 打印出sizeof(client_context)的结果,我敢打赌是4或8。
  • 对指针执行sizeof 总是返回指针本身的大小,而不是它所指向的(或它可能指向的)未来,这是无法预测的)。

标签: c memory-management struct valgrind


【解决方案1】:

您将指针的大小传递给malloc(),这还不够,试试

client_context = malloc(sizeof *client_context);

您的代码不起作用的原因是因为sizeof client_context 等于sizeof(void *)sizeof(ClientContext) 不同。

此外,请始终检查 malloc() 是否确实成功。

【讨论】:

    【解决方案2】:
    client_context = malloc(sizeof(*client_context));
    

    事实上,您分配给client_context 的是指针本身的大小,而不是内部需要的大小。就像char * 一样:

    char *str = malloc(sizeof(char) * ..);
    

    您将char 放在char * 中,这与结构相同

    【讨论】:

    • 但是sizeof(char)总是1,实际上是标准规定的1。所以通常情况下,没有人会使用sizeof(char),这与sizeof(int)sizeof(double) 不同,后者可用于如何分配给定类型的多个元素的常见示例。
    【解决方案3】:

    谢谢大家。通过更改修复

    client_context = malloc( sizeof(client_context) );
    

    client_context = malloc( sizeof(ClientContext) );
    

    我不正确地将内存分配给变量 client_context 的大小,而不是实际的 struct ClientContext。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2013-11-13
      • 2014-08-04
      • 1970-01-01
      • 2015-09-11
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多