C++20 support, compilation database and other news

Hello C and C++ folks,

We brought quite some care and love to our C and C++ analyzers.

A lot of false negatives for several rules with various versions of the C++ STL (MS, GNU, CLANG) were fixed.

Configuring the analysis with a compilation database as an alternative way to build-wrapper is now supported. It has been a very requested feature for some time. In some cases, it can help to analyze the code without building it. It is also an alternative to the build-wrapper in cases it cannot support the build system in use.

At last but not least, we are happy to announce that things have been moving on the C++20 front.
Initial C++20 support is here. It includes:

  • compatibility with many new language features while parsing the code
  • previous rules adapted to make sense with C++20 code/features
  • 18 new rules specific to C++20
    • S6214: “std::cmp_*” functions must be used to compare signed and unsigned values
    • S6169: Call to “std::is_constant_evaluated” should not be gratuitous
    • S6190: “std::source_location” should be used instead of “FILE”, “LINE”, and “func” macros
    • S6189: Function template parameters should be named if reused
    • S6186: Redundant comparison operators should not be defined
    • S6181: “std::bit_cast” should be used to reinterpret binary representation instead of “std::memcpy”
    • S6180: “[[likely]]” and “[[unlikely]]” should be used instead of compiler built-ins
    • S6178: “starts_with” and “ends_with” should be used for prefix and postfix checks
    • S6168: “std::jthread” should be used instead of “std::thread”
    • S6165: Elements in a container should be erased with “std::erase” or “std::erase_if”
    • S6164: Mathematical constants should not be hardcoded
    • S6197: STL constrained algorithms with range parameter should be used when iterating over the entire range
    • S6188: “std::span” should be used for a uniform sequence of elements contiguous in memory
    • S6187: Operator spaceship “<=>” should be used to define comparable types
    • S6179: “std::midpoint” and “std::lerp” should be used for midpoint computation and linear interpolation
    • S6171: “contains” should be used to check if a key exists in a container
    • S6183: “std::cmp_*” functions should be used to compare signed and unsigned values
    • S6166: “nodiscard” attributes on functions should include explanations

All this is already available on SonarCloud.io and will be available with SonarQube 9.0 starting from Developer Edition.