Johan W
Johan W

Reputation: 81

Disable clang-tidy warning for a specific macro

I have a macro which instantiates a global variable. And thus clang-tidy will correctly issue an "Initialization of ... with static storage duration may throw an exception which cannot be caught".

Can I disable this warning on a per-macro basis? Preferable inline where the macro is defined.

That is, let's say I have:

// header.h
#define UGLY_MACRO(X)  SomeClass X(#X)

// source.cpp
UGLY_MACRO(SomeName); // clang-tidy complains here

And I want clang-tidy to stop complaining about this.

I want to be as specific as possible. I only want to turn of this warning for this macro. I do not want to turn of the warning globally, then someone might add more of this kind of macros into the code unnoticed. Also, I don’t want to add something (like a //NOLNT(...)) at every place where the macro is used, that would be too much of a hassle.

Or am I approaching this from the wrong direction? I have worked with pc-lint before, where this is possible.

Upvotes: 8

Views: 7032

Answers (2)

pablo285
pablo285

Reputation: 2663

As far as I know this is not possible. The check in question (cert-err58-cpp) doesn't have configurable options which means it can't be disabled on a per-macro basis, only globally.

Save for modifying the check's source the only option you have here is // NOLINT(cert-err58-cpp) and // NOLINTNEXTLINE(cert-err58-cpp). The latter is a little easier to use for text search and replace as you only need to catch a newline followed by the macro name.

Upvotes: 2

Dan Nestor
Dan Nestor

Reputation: 2531

I have the same problem. I have found two ways to do this, none of which are perfect, sadly.

Option 1 by using the --line-filter command-line argument for clang-tidy:

clang-tidy --line-filter='["name":"header.h"]' source.cpp

Notes:

  • Sadly this doesn't selectively work on one warning only, it disables all of them.
  • Unlike --filter-regex, this works even for macro expansion.
  • You can be more specific and specify the range of line numbers in header.h you want to disable the warnings for (see the help text for --line-filter)

Option 2 by wrapping the macro:

#define UGLY_MACRO_NOLINT(...) UGLY_MACRO(__VA_ARGS__) //NOLINT(...)

Notes:

  • Requires modifying your source code to use the nolint version
  • Does not work if UGLY_MACRO is multi-line

Upvotes: 6

Related Questions