【问题标题】:GCC: __attribute__((malloc))GCC:__attribute__((malloc))
【发布时间】:2013-08-31 09:09:48
【问题描述】:

引用GCC documentation(强调我的):

malloc 属性用来告诉编译器一个函数可以 被视为好像它返回的任何非 NULL 指针都不能为任何 当函数返回 并且内存有 未定义的内容。这通常会改善优化。标准 具有该属性的函数包括malloccallocrealloc-like 函数没有这个属性,因为指向的内存没有 有未定义的内容。

我有以下代码:

struct buffer {
    size_t alloc;  // Allocated memory in bytes
    size_t size;   // Actual data size in bytes
    char data[];   // Flexible array member
};


#define ARRAY_SIZE <initial_value>

buffer *buffer_new(void) __attribute__((malloc))
{
    struct buffer *ret;

    ret = malloc(sizeof(struct buffer) + ARRAY_SIZE);
    if (!ret)
        fatal(E_OUT_OF_MEMORY);

    ret->alloc = ARRAY_SIZE;
    ret->size = 0;

    return ret;
}

现在我有点困惑:虽然我没有初始化data 成员,但我仍然将allocsize 字段设置为各自的值。我还能认为这个分配的段是“未定义的内容”并使用 malloc 属性吗?

【问题讨论】:

  • 我认为您误解了属性的含义。例如,calloc 返回具有明确内容的内存。
  • @KerrekSB 因为该属性明确指出内容未定义,并且由于calloc 的内存定义非常明确,我想我也一定是误解了一些东西......你能扩展一下吗?
  • 我认为该属性是为了帮助进行别名分析。编译器可以假设返回的内存包含指向现有对象的指针。
  • @Kerrek Seams 合理。我认为手册的措辞很不幸。
  • 对一些 gcc 开发人员列表来说可能是一个好问题(以改进该文档)

标签: c gcc attributes malloc


【解决方案1】:

__attribute__((malloc)) 标记buffer_new 函数是安全的,因为它返回的块不包含指针。

最新的 GCC 文档阐明了__attribute__((malloc)) 的含义:如此标记的函数返回的块不得包含任何指向其他对象的指针。目的是帮助编译器估计哪些指针可能指向同一个对象:该属性告诉 GCC 它不必担心函数返回的对象可能包含指向它正在跟踪的其他对象的指针。

【讨论】:

  • 是的,我可以确认在标记有该属性的函数中分配的内存区域中有指针是一件坏事。我在一个双链表代码中有一个 Heisenbug,我已经搜索了很长时间。
【解决方案2】:

这是来自 Ubuntu 论坛中代码审查的链接,是的,文档需要改进 https://bugs.launchpad.net/ubuntu/+source/gcc-4.7/+bug/1123588

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多