我有如下的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
。
答案 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