[llvm-dev] [cfe-dev] clang-tidy: identify "C++-code-specific-checks" and "C-Code-specific-checks"

Oza, Hiral via llvm-dev llvm-dev at lists.llvm.org
Wed Sep 15 04:56:45 PDT 2021


>> From list of supported clang-tidy checks, how to identify "C++-code-specific-checks" and which are "C-Code-specific-checks"? Can this be checked programmatically?
>There is not a way to identify them from the command line, but each check has an `isLanguageVersionSupported()` function that checks for valid language options that you can use to find this information via manual inspection.

>> What happens internally if C++-code-check ran on C-code? Will it skip parsing C-code?
> If the check is designed to be C++-only, then it will be skipped for a C translation unit.

Ok, I could see below LangOpts checks... from "clang-tools-extra/clang-tidy/ClangTidyCheck.h" could read that 'registerPPCallbacks()' and 'registerMatchers' gets executed if the function isLanguageVersionSupported returns true.

$ grep -ri isLanguageVersionSupported llvm-project/clang-tools-extra -A5 | grep LangOpt | grep -v isLanguageVersionSupported | cut -d' ' -f4- | sort -n | uniq
const LangOptions &LangOpts) const {
(LangOpts.CPlusPlus)
LangOpts.CPlusPlus11;
RequireCPlusPlus14 ? LangOpts.CPlusPlus14 : LangOpts.CPlusPlus11;
 return getLangOpts().CPlusPlus && getLangOpts().CXXExceptions;
 return LangOpts.Blocks;
 return LangOpts.Bool;
 return LangOpts.CPlusPlus;
     return LangOpts.CPlusPlus11;
 return LangOpts.CPlusPlus11;
 return LangOpts.CPlusPlus11 || LangOpts.C11;
 return LangOpts.CPlusPlus14;
 return !LangOpts.CPlusPlus17;
 return LangOpts.CPlusPlus17;
 return LangOpts.CPlusPlus && LangOpts.CXXExceptions;
 return LangOpts.CPlusPlus && !LangOpts.ObjC;
 return LangOpts.CPlusPlus && !LangOpts.ThreadsafeStatics;
 return LangOpts.ObjC;
 return LangOpts.ObjC && LangOpts.ObjCAutoRefCount;
 return LangOpts.OpenMP;
 return LangOpts.OpenMP && LangOpts.CPlusPlus && LangOpts.CXXExceptions;

>> Are “clang-analyzer-“ checks only applied to C++-code?
> Not always, those come from the static analyzer (rather than explicitly written as clang-tidy checks) and many of those apply to C code as well as C++ code (for example, there are checks specific to malloc/free behavior, checks for division by zero, etc).

I am seeing strange observation with clang-analyzer-* checks:
For example: if I run below command to list only single "clang-analyzer-apiModeling.StdCLibraryFunctions" but it list all other clang-analyzer-* checks too!

$ clang-tidy --version
  LLVM version 14.0.0git
  Optimized build.
  Default target: x86_64-unknown-linux-gnu

$ clang-tidy --list-checks --config-file=<path>/config-file-clang-analyzer-apiModeling.StdCLibraryFunctions
Enabled checks:
    clang-analyzer-apiModeling.StdCLibraryFunctions
    clang-analyzer-core.CallAndMessage
    clang-analyzer-core.CallAndMessageModeling
    clang-analyzer-core.DivideZero
    clang-analyzer-core.DynamicTypePropagation
    clang-analyzer-core.NonNullParamChecker
    clang-analyzer-core.NonnilStringConstants
    clang-analyzer-core.NullDereference
    clang-analyzer-core.StackAddrEscapeBase
    clang-analyzer-core.StackAddressEscape
    clang-analyzer-core.UndefinedBinaryOperatorResult
    clang-analyzer-core.VLASize
    clang-analyzer-core.builtin.BuiltinFunctions
    clang-analyzer-core.builtin.NoReturnFunctions
    clang-analyzer-core.uninitialized.ArraySubscript
    clang-analyzer-core.uninitialized.Assign
    clang-analyzer-core.uninitialized.Branch
    clang-analyzer-core.uninitialized.CapturedBlockVariable
    clang-analyzer-core.uninitialized.UndefReturn

Where,
$ cat <path>/config-file-clang-analyzer-apiModeling.StdCLibraryFunctions
---
Checks: '
 -*,
 -clang-analyzer-*,
 -clang-analyzer-apiModeling-*,
 -clang-analyzer-core-*,
 -clang-analyzer-cplusplus-*,
 -clang-analyzer-deadcode-*,
 -clang-analyzer-fuchsia-*,
 -clang-analyzer-nullability-*,
 -clang-analyzer-optin-*,
 -clang-analyzer-osx-*,
 -clang-analyzer-security-*,
 -clang-analyzer-unix-*,
 -clang-analyzer-valist-*,
 -clang-analyzer-apiModeling.google.GTest,
 -clang-analyzer-apiModeling.llvm.CastValue,
 -clang-analyzer-apiModeling.llvm.ReturnValue,
 -clang-analyzer-apiModeling.StdCLibraryFunctions,
 -clang-analyzer-apiModeling.TrustNonnull,
 -clang-analyzer-core.builtin.BuiltinFunctions,
 -clang-analyzer-core.builtin.NoReturnFunctions,
 -clang-analyzer-core.CallAndMessage,
 -clang-analyzer-core.DivideZero,
 -clang-analyzer-core.DynamicTypePropagation,
 -clang-analyzer-core.NonnilStringConstants,
 -clang-analyzer-core.NonNullParamChecker,
 -clang-analyzer-core.NullDereference,
 -clang-analyzer-core.StackAddrEscapeBase,
 -clang-analyzer-core.StackAddressEscape,
 -clang-analyzer-core.UndefinedBinaryOperatorResult,
 -clang-analyzer-core.uninitialized.ArraySubscript,
 -clang-analyzer-core.uninitialized.Assign,
 -clang-analyzer-core.uninitialized.Branch,
 -clang-analyzer-core.uninitialized.CapturedBlockVariable,
 -clang-analyzer-core.uninitialized.UndefReturn,
 -clang-analyzer-core.VLASize,
 -clang-analyzer-cplusplus.Move,
 -clang-analyzer-cplusplus.PureVirtualCall,
 -clang-analyzer-cplusplus.SelfAssignment,
 -clang-analyzer-cplusplus.SmartPtr,
 -clang-analyzer-cplusplus.VirtualCallModeling,
 -clang-analyzer-nullability.NullableDereferenced,
 -clang-analyzer-nullability.NullablePassedToNonnull,
 -clang-analyzer-nullability.NullableReturnedFromNonnull,
 -clang-analyzer-nullability.NullPassedToNonnull,
 -clang-analyzer-nullability.NullReturnedFromNonnull,
 -clang-analyzer-optin.mpi.MPI-Checker,
 -clang-analyzer-optin.performance.GCDAntipattern,
 -clang-analyzer-security.FloatLoopCounter,
 -clang-analyzer-security.insecureAPI.decodeValueOfObjCType,
 -clang-analyzer-security.insecureAPI.getpw,
 -clang-analyzer-security.insecureAPI.gets,
 -clang-analyzer-security.insecureAPI.mkstemp,
 -clang-analyzer-security.insecureAPI.mktemp,
 -clang-analyzer-security.insecureAPI.SecuritySyntaxChecker,
 -clang-analyzer-security.insecureAPI.UncheckedReturn,
 -clang-analyzer-unix.cstring.BadSizeArg,
 -clang-analyzer-unix.cstring.CStringModeling,
 -clang-analyzer-unix.DynamicMemoryModeling,
 -clang-analyzer-valist.CopyToSelf,
 -clang-analyzer-valist.ValistBase,
 clang-analyzer-apiModeling.StdCLibraryFunctions'

Just enabled one "

Thanks Aaron.

-----Original Message-----
From: Aaron Ballman <aaron at aaronballman.com> 
Sent: Wednesday, 15 September, 2021 16:43
Cc: cfe-dev at lists.llvm.org; llvm-dev <llvm-dev at lists.llvm.org>
Subject: Re: [cfe-dev] clang-tidy: identify "C++-code-specific-checks" and "C-Code-specific-checks"

NetApp Security WARNING: This is an external email. Do not click links or open attachments unless you recognize the sender and know the content is safe.




On Wed, Sep 15, 2021 at 3:09 AM Oza, Hiral via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>
> Greetings!
>
> We are using clang-tidy with single ‘config-file’ listing enabled tidy-checks to run for both “C++-code” and “C-code”.
>
> We are looking for your inputs:
>
> From list of supported clang-tidy checks, how to identify "C++-code-specific-checks" and which are "C-Code-specific-checks"? Can this be checked programmatically?

There is not a way to identify them from the command line, but each check has an `isLanguageVersionSupported()` function that checks for valid language options that you can use to find this information via manual inspection.

> Are “clang-analyzer-“ checks only applied to C++-code?

Not always, those come from the static analyzer (rather than explicitly written as clang-tidy checks) and many of those apply to C code as well as C++ code (for example, there are checks specific to malloc/free behavior, checks for division by zero, etc).

> What happens internally if C++-code-check ran on C-code? Will it skip parsing C-code?

If the check is designed to be C++-only, then it will be skipped for a C translation unit.

~Aaron

>
>
>
> Thank you in advance for your valuable inputs.
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev


More information about the llvm-dev mailing list