【问题标题】:Why is there no counterpart to cf_consumed for the Clang static analyzer that marks an argument as being retained?为什么 Clang 静态分析器没有对应的 cf_consumed 来标记参数为保留?
【发布时间】:2025-11-28 11:05:03
【问题描述】:

假设我们要创建自己的CFRetainCFRelease 函数,称为MyRetainMyRelease。对于后者,我们可以写成:

void MyRelease(CFTypeRef __attribute__((cf_consumed)) typeRef);
// or
void MyRelease(CFTypeRef CF_RELEASES_ARGUMENT typeRef);

但是,对于MyRetain,我们似乎运气不佳。我会怀疑存在这样的事情:

void MyRetain(CFTypeRef __attribute__((cf_retained)) typeRef);
// or
void MyRetain(CFTypeRef CF_RETAINS_ARGUMENT typeRef);

这仅仅是一个遗漏吗?有没有我没有看到的替代方案?

【问题讨论】:

    标签: memory-management clang core-foundation clang-static-analyzer


    【解决方案1】:

    我认为通常的情况是将其声明为:

    CF_RETURNS_RETAINED CFTypeRef MyRetain(CFTypeRef typeRef);
    

    因为保留函数通常返回相同的值。释放型函数通常返回 void,因此它们必须对参数进行注释。

    【讨论】:

      【解决方案2】:

      您很可能希望使用__attribute__((cf_returns_retained)),通常将#define 用作CF_RETURNS_RETAINED

      来自relevant lines in the CoreFoundation source

      #ifndef CF_RETURNS_RETAINED
      #if __has_feature(attribute_cf_returns_retained)
      #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
      #else
      #define CF_RETURNS_RETAINED
      #endif
      #endif
      

      ……那个文件,CFBase.h,值得细读——它包含许多更模糊的 CF 特定的 #definetypedef 定义。

      【讨论】:

        最近更新 更多