Skip to content

Update example to C++20 and use modules #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

18 changes: 16 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ on:
- main
pull_request:
types: [opened, synchronize, reopened]
env:
CLANG_VERSION: 18
jobs:
build:
name: Build
Expand All @@ -15,10 +17,22 @@ jobs:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Install sonar-scanner
uses: sonarsource/sonarcloud-github-c-cpp@v3
- name: Generate compilation database
- name: Install Ninja
run: |
wget https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-linux.zip
sudo unzip ninja-linux.zip -d /usr/local/bin
- name: Install clang
run: |
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" ${{env.CLANG_VERSION}}
sudo apt install -y clang-tools-${{env.CLANG_VERSION}} libc++-${{env.CLANG_VERSION}}-dev
- name: Generate compilation database and build
run: |
mkdir build
cmake -S . -B build
cmake -S . -B build -G Ninja \
-DCMAKE_CXX_COMPILER=clang++-${{env.CLANG_VERSION}} \
-DCMAKE_CXX_COMPILER_CLANG_SCAN_DEPS=clang-scan-deps-${{env.CLANG_VERSION}}
# The project needs to be built so the `.modmap` files are generated
cmake --build build --target all
- name: Run sonar-scanner
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
16 changes: 12 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
cmake_minimum_required(VERSION 3.9)
project(sonar_scanner_example)
cmake_minimum_required(VERSION 3.30)

project(sonar_scanner_example LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_executable(sonar_scanner_example src/main.cpp)

target_sources(sonar_scanner_example
PRIVATE
FILE_SET CXX_MODULES FILES src/args.cppm
)
11 changes: 8 additions & 3 deletions sonar-project.properties
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@

sonar.projectKey=sonarsource-cfamily-examples_linux-cmake-compdb-gh-actions-sc
sonar.organization=sonarsource-cfamily-examples
sonar.projectKey=alejandro-alvarez-sonarsource_linux-cmake-compdb-gh-actions-sc
sonar.organization=alejandro-alvarez-sonarsource
sonar.projectName=linux-cmake-compdb-gh-actions-sc
sonar.projectVersion=1.0-SNAPSHOT
sonar.projectVersion=2.0-MODULES

# =====================================================
# Properties that will be shared amongst all modules
# =====================================================

# SQ standard properties
sonar.sources=src
# Enable C++20 modules
# TODO: Remove internal

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We need to remember to remove it.

sonar.cfamily.internal.enableModules=true
# TODO: Remove
sonar.cfamily.analysisCache.mode=internal.off
40 changes: 40 additions & 0 deletions src/args.cppm
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
module;
#include <iostream>
#include <string_view>
#include <variant>

export module args;

export namespace args {

enum class Error {
Ok,
TooLong,
TooManyArgs,
NullPtr,
};

std::variant<std::string_view, Error> process_args(int argc, char *argv[]) {
int num = argc - 1;

if (num == 0) {
std::cout << "No arguments provided\n";
} else if (num == 0) { // intentional mistake
std::cout << "1 argument provided\n";
} else if (num == 2) {
std::cout << "2 arguments provided\n";
} else {
std::cout << num << " arguments provided\n";
}
if (argv != 0) {
std::cout << "argv not null\n";
; // intentional extra-semicolon
}

if (argv == nullptr) {
return std::string_view(*argv); // intentional nullptr dereference
}

return std::string_view(argv[0]);
}
} // namespace args
32 changes: 14 additions & 18 deletions src/main.cpp
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
#include <iostream>
#include <variant>

using namespace std;
import args;

int main(int argc, char* argv[]) {
int num = argc - 1;
using namespace std;

if (num == 0) {
cout << "No arguments provided\n";
} else if (num == 0) { // intentional mistake
cout << "1 argument provided\n";
} else if (num == 2) {
cout << "2 arguments provided\n";
} else {
cout << num << " arguments provided\n";
}
if (argv != 0) {
cout << "argv not null\n";; // intentional extra-semicolon
}
if (argv == nullptr) {
return **argv; // intentional nullptr dereference
int main(int argc, char *argv[]) {
auto get_proc_name = args::process_args(argc, argv);
if (std::holds_alternative<args::Error>(get_proc_name)) {
switch (std::get<args::Error>(get_proc_name)) {
case args::Error::TooLong:
std::cout << "Proc name too long\n";
return 1;
}
return 0;
}

auto &&value = std::get<std::string_view>(get_proc_name);
std::cout << value << '\n';
return 0;
}

Loading