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
)
2 changes: 2 additions & 0 deletions sonar-project.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ sonar.projectVersion=1.0-SNAPSHOT

# SQ standard properties
sonar.sources=src
# Enable C++20 modules
sonar.cfamily.enableModules=true
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