Unix的Clang注释。malloc静态分析

时间:2019-02-18 19:30:20

标签: xcode annotations clang static-analysis clang-static-analyzer

我有如下的C代码。已知函数takeString()拥有其malloc-ed指针参数的所有权。 Clang静态分析器将抱怨stringreturn 0处的main()是潜在的内存泄漏。严格地针对C代码,我可以在理想的takeString()声明中应用什么注释,以通知Clang静态分析器string不会泄漏?

#define OwnershipTaken(type)        type

void takeString (OwnershipTaken(char *) string) {
  // ... eventually frees
}

int main(int argc, const char * argv[]) {
  char *string = strdup ("This is a string");
  takeString (string);

  return 0;
}

一个更笼统的问题是,我在哪里可以看到Clang静态分析器可以理解的所有可能注释的列表?

我尝试使用void __attribute((ownership_takes(malloc, 1))) takeString(char *);之类的注释,但这似乎并没有改变结果。 answer指出需要启用unix.MallocWithAnnotations。如何在Xcode中完成?但是,当前版本的Xcode似乎没有包含unix.MallocWithAnnotations

1 个答案:

答案 0 :(得分:0)

要实现我认为您希望实现的目标,可以通过analyzer_noreturn属性来实现。

#ifndef CLANG_ANALYZER_RELEASED
#if __has_feature(attribute_analyzer_noreturn)
#define CLANG_ANALYZER_RELEASED __attribute__((analyzer_noreturn))
#else
#define CLANG_ANALYZER_RELEASED
#endif
#endif

// suppress the leak warning for `string`.

void takeString(char *) CLANG_ANALYZER_RELEASED;

要查看clang静态分析器检查器的完整列表,请执行以下操作:

$ clang -cc1 -analyzer-checker-help
  

* alpha.unix.MallocWithAnnotations在最新版的llvm中似乎不存在。

要启用/禁用检查器,并设置以下选项:(Xcode Build Settings> Other C Flags

OTHER_CFLAGS = -D__clang_analyzer__ -Xclang -analyzer-output=plist-html -Xclang -analyzer-config -Xclang path-diagnostics-alternate=true -Xclang -analyzer-config -Xclang report-in-main-source-file=true -Xclang -analyzer-config -Xclang mode=shallow -Xclang -analyzer-config -Xclang osx.NumberObjectConversion:Pedantic=true -Xclang -analyzer-checker -Xclang security.insecureAPI.UncheckedReturn -Xclang -analyzer-checker -Xclang security.insecureAPI.getpw -Xclang -analyzer-checker -Xclang security.insecureAPI.gets -Xclang -analyzer-checker -Xclang security.insecureAPI.mkstemp -Xclang -analyzer-checker -Xclang security.insecureAPI.mktemp -Xclang -analyzer-disable-checker -Xclang security.insecureAPI.rand -Xclang -analyzer-disable-checker -Xclang security.insecureAPI.strcpy -Xclang -analyzer-checker -Xclang security.insecureAPI.vfork -Xclang -analyzer-checker -Xclang osx.cocoa.RetainCount -Xclang -analyzer-checker -Xclang osx.cocoa.Dealloc

Clang static analyzer checkers not present in Xcode 10