C / C++
The C/C++ family of linters lets you analyze C and C++ projects that support any common build system like CMake or provide a compile_commands.json
file. There are two different linters that provide this functionality:
Linter | Linter name | Available under licenses | Supports |
---|---|---|---|
Qodana Community for C/C++ |
| Community license | Clang-Tidy-based inspections |
Qodana for C/C++ |
| Ultimate and Ultimate Plus licenses | The full set of inspections provided by CLion:
|
* You can run the Qodana for C/C++ linter in the privileged mode to execute commands that need root access because in this case Qodana comes with a default qodana
user that possesses root privileges and does not require a password. To do it, in the -clangXX
tag specify the Clang-Tidy version from 15 to 18, and also specify the -privileged
tag.
Both linters support AMD64 and ARM64 architectures.
To see the list of supported features, navigate to the Supported features section.
Implementation details
The Docker image of Qodana Community for C/C++ employs Clang 16. You can see the Dockerfile
for the detailed description of all software used by the linter.
Qodana Community for C/C++ searches for compile commands in the build/compile_commands.json
file of the project directory. This file is usually generated by your build system. After reading the compile_commands.json
file, the linter analyzes the project, generates analysis reports and saves them locally or uploads to Qodana Cloud.
Before you start
Prepare your project
You can configure Clang-Tidy-based inspections in the
.clang-tidy
file, see the configuration example on the GitHub website. After configuring, save this file under the project root.Open the
.clang-tidy
file and configure the list of files and paths that will be analyzed by Qodana.For Qodana Community for C/C++, you need to generate
compile_commands.json
as explained in the CLion documentation portal, and save it to thebuild
directory under the project root.If you use CMake, you can also generate a compilation database by specifying the following
bootstrap
option in theqodana.yaml
file, for example:bootstrap: | set -eux cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ONYou can skip this step for the Qodana for C/C++ linter. Assuming that you have a build system supported by CLion, the project will be configured automatically. This includes
compile_commands.json
files placed at the project root, not in thebuild/
directory.If your project requires specific packages not previously mentioned in the
Dockerfile
, add the followingbootstrap
command to yourqodana.yaml
file to install the required packages:bootstrap: | set -eux sudo apt-get update sudo apt-get install -y <required-packages> cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ONTo modify analysis paths in the
compile_commands.json
file while running the Qodana Community for C/C++ linter or the Qodana for C/C++ linter using the rawcompile_commands.json
file, follow the instructions from the Modifying paths for analysis section.
Qodana Cloud
Because the Qodana for C/C++ linter requires a Qodana Cloud project token for identifying and verifying a license, follow these steps to get it:
Navigate to Qodana Cloud and create an account there.
In Qodana Cloud, create an organization, a team, and a project.
On the project card, you can find the project token that you will be using further in this section.
Prepare your software
On the QODANA_TOKEN
encrypted secret and save the project token as its value.
In Jenkins, make sure that these plugins are up and running:
Docker and Docker Pipeline are required for running Docker images
Git is required for Git operations in Jenkins projects
Make sure that Docker is installed and accessible to Jenkins.
If applicable, make sure that Docker is accessible to the
jenkins
user as described in the Manage Docker as a non-root user section of the Docker documentation.In Jenkins, create the
qodana-token
credential and save the project token as its value.In Jenkins, create a Multibranch Pipeline project as described on the Jenkins documentation portal.
Make sure that your project repository is accessible to GitLab CI/CD.
In GitLab CI/CD, create the
QODANA_TOKEN
variable and save the project token as its value.
In TeamCity, Create a project and a build configuration.
Install Docker on the machine you are going to run Qodana.
If you are using Linux, you should be able to run Docker under your current non-root user.
Follow the instructions from the Qodana CLI page on GitHub.
Run this command to pull the Docker image of Qodana:
Run Qodana
To analyze the main
branch, release branches and the pull requests coming to your repository, save this workflow configuration to the .github/workflows/code_quality.yml
file:
Here, fetch-depth: 0
is required for checkout in case Qodana works in pull request mode (reports issues that appeared only in that pull request).
To override the location of compile_commands.json
(Qodana Community for C/C++ only), you can specify the location relative to the project root, so the configuration would look like:
More configuration examples are available in the GitHub Actions section.
Save this snippet to the Jenkinsfile
:
To override the location of compile_commands.json
(Qodana Community for C/C++ only), you can specify the location relative to the project root, so the configuration would look like:
More configuration examples are available in the Jenkins section.
In the root directory of your project, save this snippet to the .gitlab-ci.yml
file:
To override the location of the compile_commands.json
file for the Qodana Community for C/C++ linter, specify the location relative to the project root, so the configuration would look like:
More configuration examples are available in the GitLab CI/CD section.
In the TeamCity UI, navigate to the configuration page of a build where you would like to run Qodana.
- page, navigate to the
On the
page, click the button.On the page that opens, select the
runner.On the
page, click and configure the runner:uniquely identifies this step among other build steps.
uniquely identifies this step among other build steps.
configures the build condition that will trigger this build step.
TeamCity documentation for details. You can leave this field empty if the
sets the directory for the build process, see theCheckout directory
parameter is specified on the tab.uniquely identifies the report to let you distinguish between multiple reports when several analysis steps are configured within a single build.
The Test tab of the TeamCity UI. Using this option, you can view codebase problems along with other problems detected.
checkbox configures Qodana report availability in the- configures the
Here, select Custom and in the field below specify the Qodana for C/C++ linter.
is by default set toLatest
.- defines an
qodana.starter (default)
is one of the default profiles.Profile name
lets you specify a profile, see the Existing Qodana profiles section for details.Profile path
lets you specify the path to your custom profile. To use this option, make sure that you also configure the custom profile in theqodana.yaml
file.
project token generated in Qodana Cloud.
configures aConfiguration options section for details.
configure the arguments accepted by a Docker image, see theTypes of options section for details.
let you extend the default Qodana functionality, see theTo override the location of a compilation command database, specify the location relatively to the project root using the
--compile-commands <path-to-compile_commands.json>
command.Qodana CLI version that you would like to use.
lets you specify the
Click the
button.
More configuration examples are available in the TeamCity section.
Run this command:
In this command, source-directory
and output-directory
are full local paths to the project source code directory and the analysis result directory, respectively. The QODANA_TOKEN
variable refers to the project token required by the Ultimate and Ultimate Plus linters. If you omit the QODANA_TOKEN
variable, the analysis results will be available in the qodana.sarif.json
file saved in the output-directory
of your project root.
To override the location of the compile_commands.json
file for the Qodana Community for C/C++ linter, you can specify the location relative to the project root, so the configuration would look like:
In your browser, open Qodana Cloud to examine the analysis results and reconfigure the analysis. See the Analysis reports section of the documentation for full details.
If you run the analysis several times in a row, make sure you've cleaned the results directory before using it in docker run
again.
Explore analysis results
Once Qodana analyzed your project and uploaded the analysis results to Qodana Cloud, you can navigate to your project Qodana Cloud and review the analysis results report.

To learn more about Qodana report UI, see the Analysis reports section.
Extend Qodana configuration
Adjusting the scope of analysis
Qodana recognizes the qodana.yaml
file for the analysis configuration, so that you don't need to pass any additional parameters. For the Qodana for C/C++ linter, you can configure:
Commands that will run before the linter using the
boostrap
option. Using this, you can modify the list of paths in thecompile_commands.json
file.Baseline and quality gate features.
Modifying paths for analysis
Recommendations from this section are applicable only to the Qodana Community for C/C++ linter and specific cases where the Qodana for C/C++ linter is analyzing a project configured with a raw compile_commands.json
file.
To modify analysis paths in the compile_commands.json
file contained in the Docker container of the linter, you can run a script during the bootstrap stage of analysis. For example, the Python scripts below use glob patterns and regular expressions that modify paths in the compile_commands.json
file inside the Docker container of Qodana.
To run a script, use the bootstrap
section of the qodana.yaml
file, for example:
Enabling the baseline feature
You can skip analysis for specific problems by using the baseline feature. Information about a baseline is contained in a SARIF-formatted file.
Save this snippet to the .github/workflows/code_quality.yml
file:
This snippet has the args: --baseline,<path/to/qodana.sarif.json>
line that specifies the path to the SARIF file containing a baseline.
The stages
block contains the --baseline <path/to/qodana.sarif.json>
line that specifies the path to the SARIF-formatted baseline file:
The --baseline <path/to/qodana.sarif.json>
line in the script
block invokes the baseline feature.
In the TeamCity UI, navigate to the configuration page of a build where you would like to run Qodana.
- page, navigate to the
On the
page, click the button.On the page that opens, select the
runner.On the
page, click and configure the runner:uniquely identifies this step among other build steps.
uniquely identifies this step among other build steps.
configures the build condition that will trigger this build step.
TeamCity documentation for details. You can leave this field empty if the
sets the directory for the build process, see theCheckout directory
parameter is specified on the tab.uniquely identifies the report to let you distinguish between multiple reports when several analysis steps are configured within a single build.
The Test tab of the TeamCity UI. Using this option, you can view codebase problems along with other problems detected.
checkbox configures Qodana report availability in the- configures the
Here, select Custom and in the field below specify the Qodana for C/C++ linter.
is by default set toLatest
.- defines an
qodana.starter (default)
is one of the default profiles.Profile name
lets you specify a profile, see the Existing Qodana profiles section for details.Profile path
lets you specify the path to your custom profile. To use this option, make sure that you also configure the custom profile in theqodana.yaml
file.
project token generated in Qodana Cloud.
configures aConfiguration options section for details.
configure the arguments accepted by a Docker image, see theTypes of options section for details.
let you extend the default Qodana functionality, see theIn this field, specify the baseline feature using the
--baseline <path/to/qodana.sarif.json>
option.Qodana CLI version that you would like to use.
lets you specify the
Click the
button.
Run this command invoking the --baseline
option:
Enabling the quality gate
You can configure quality gates for:
The total number of project problems
Multiple quality gates for problem severities.
Save this snippet to the qodana.yaml
file:
Analyzing pull requests
You can analyze pull requests using the Qodana for C/C++ linter.
The Qodana Scan GitHub action automatically analyzes all pull requests, so you do not have to provide any additional configuration. Save this configuration to the .github/workflows/code_quality.yml
file:
In the root directory of your project, save the .gitlab-ci.yml
file containing the following snippet:
This configuration enables merge request analysis.
Information about configuring TeamCity for analyzing pull and merge requests is available on the TeamCity documentation portal.
To analyze changes in your code, employ the --diff-start
option and specify a hash of the commit that will act as a base for comparison:
Supported features
Both linters provide the following Qodana features:
Feature | Available under licenses |
---|---|
Community, Ultimate and Ultimate Plus | |
Community, Ultimate and Ultimate Plus |
Usage statistics
According to the JetBrains EAP user agreement, we can use third-party services to analyze the usage of our features to further improve the user experience. All data is collected anonymously. To disable the statistics, use the --no-statistics=true
CLI option.