Clang Аннотации для статического анализа Unix.malloc - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть C-код, который выглядит следующим образом.Известно, что функция takeString() становится владельцем аргумента malloc-ed указателя.Статический анализатор Clang будет жаловаться, что string - это потенциальная утечка памяти при return 0 в main().Только для кода C, какую аннотацию я могу применить, в идеале в объявлении takeString(), которая сообщит Clang Static Analyzer, что 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 *);, но это, похоже, не меняет результат.Этот ответ отмечает, что unix.MallocWithAnnotations необходимо включить.Как это делается в Xcode?Однако текущая версия XCode, кажется, не включает unix.MallocWithAnnotations.

1 Ответ

0 голосов
/ 01 марта 2019

Достичь того, что, как я полагаю, вы хотите сделать, можно с помощью атрибута 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 static analyzer:

$ 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 отсутствуют в Xcode 10

...