【问题标题】:Valgrind about asprintf: address is 0 bytes inside a block of size <size> alloc'dValgrind 关于 asprintf: address is 0 bytes inside a block of size <size> alloc'd
【发布时间】:2018-01-15 20:46:50
【问题描述】:

我有一些这样的代码:

void logConnectionStatus(char * domain, char * status, mqd_t logQueue) {
    char * message;
    asprintf(&message, "Connection to domain %s: %s", domain, status);
    mq_send(logQueue, message, 1024, 0);
    free(msg);
}

但是 valgrind check 说

地址 0x566c0f5 在大小为 53 的块中分配了 0 个字节

可能是什么原因?谢谢。

【问题讨论】:

  • message 是什么?
  • 我想你的意思是:mq_send(logQueue, msg, strlen(msg), 0);
  • Valgrind 在哪一行说有错误?
  • @Jean-FrançoisFabre 抱歉,这是复制粘贴错误,已修复。
  • @PaulFloyd 首先说:系统调用参数 mq_timedsend(msg_ptr) 指向不可寻址字节,然后是我问题中的消息。就在 asprintf 的那一行。

标签: c linux valgrind asprintf


【解决方案1】:

(假设您的意思是mq_send(logQueue, msg, 1024, 0);,因为这里找不到message

asprintf 调用没问题(除非domainstatus 是损坏/空指针)。

但随后,您发送的消息大小为1024,可能远远超出msg 字符串大小(因为domainstatus 可能是人类可读的短字符串)。

您应该记下asprintf 返回的打印字符数,并在下一次调用中使用:

char * msg;
int nb_printed = asprintf(&msg, "Connection to domain %s: %s", domain, status);
mq_send(logQueue, msg, nb_printed, 0);
free(msg);

【讨论】:

  • 问题出在发送缓冲区大小上。在我将它从 1024 更改为 strlen(message) 后,问题就消失了。感谢您的回答!
猜你喜欢
  • 2013-03-30
  • 2017-05-20
  • 2017-04-09
  • 1970-01-01
  • 2011-01-27
  • 2018-08-01
  • 2020-02-01
  • 2021-12-17
  • 2019-09-21
相关资源
最近更新 更多