Index: C:/LLVM/llvm/tools/clang/lib/Driver/Tools.cpp =================================================================== --- C:/LLVM/llvm/tools/clang/lib/Driver/Tools.cpp +++ C:/LLVM/llvm/tools/clang/lib/Driver/Tools.cpp @@ -3589,8 +3589,27 @@ if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) { CmdArgs.push_back("-analyzer-checker=core"); - if (!IsWindowsMSVC) + if (!IsWindowsMSVC) { CmdArgs.push_back("-analyzer-checker=unix"); + } else { + // Enable "unix" checkers (which also work on Windows). + // Intentionally NOT enabling unix.Vfork, + // as it may cause false positives. + // Specifically, this enables: + // unix.API (open, pthread_once, calloc, malloc, realloc, alloca) checkers, + // unix.Malloc (leaks, double-frees, use-after-frees, etc...), + // unix.MallocSizeof (misusing sizeof in malloc, calloc, and realloc), + // unix.MismatchedDeallocator (calling delete on a malloc'd pointer, + // freeing a new'd pointer, etc...), + // unix.cstring.BadSizeArg (strncat buffer size misuse), and + // unix.cstring.NullArg (passing null pointers to C string functions). + CmdArgs.push_back("-analyzer-checker=unix.API"); + CmdArgs.push_back("-analyzer-checker=unix.Malloc"); + CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof"); + CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator"); + CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg"); + CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg"); + } if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple) CmdArgs.push_back("-analyzer-checker=osx");