我有C代码,如下所示。已知函数takeString()
取得其malloc-ed指针参数的所有权。 Clang静态分析仪会抱怨string
是return 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
。
通过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