Skip to content

Commit eb0fec1

Browse files
Enable modules analysis
1 parent 859ee7b commit eb0fec1

File tree

4 files changed

+71
-22
lines changed

4 files changed

+71
-22
lines changed

CMakeLists.txt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1-
cmake_minimum_required(VERSION 3.9)
2-
project(sonar_scanner_example)
1+
cmake_minimum_required(VERSION 3.30)
2+
3+
project(sonar_scanner_example LANGUAGES CXX)
4+
5+
set(CMAKE_CXX_STANDARD 20)
6+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
7+
set(CMAKE_CXX_EXTENSIONS OFF)
8+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
39

4-
set(CMAKE_CXX_STANDARD 17)
510
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
611

712
add_executable(sonar_scanner_example src/main.cpp)
8-
13+
target_sources(sonar_scanner_example
14+
PRIVATE
15+
FILE_SET CXX_MODULES FILES src/args.cppm
16+
)

sonar-project.properties

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@ sonar.projectVersion=2.0-MODULES
1010

1111
# SQ standard properties
1212
sonar.sources=src
13+
# Enable C++20 modules
14+
# TODO: Remove internal
15+
sonar.cfamily.internal.enableModules=true
16+
# TODO: Remove
17+
sonar.cfamily.analysisCache.mode=internal.off

src/args.cppm

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
module;
2+
#include <iostream>
3+
#include <string_view>
4+
#include <variant>
5+
6+
export module args;
7+
8+
export namespace args {
9+
10+
enum class Error {
11+
Ok,
12+
TooLong,
13+
TooManyArgs,
14+
NullPtr,
15+
};
16+
17+
std::variant<std::string_view, Error> process_args(int argc, char *argv[]) {
18+
int num = argc - 1;
19+
20+
if (num == 0) {
21+
std::cout << "No arguments provided\n";
22+
} else if (num == 0) { // intentional mistake
23+
std::cout << "1 argument provided\n";
24+
} else if (num == 2) {
25+
std::cout << "2 arguments provided\n";
26+
} else {
27+
std::cout << num << " arguments provided\n";
28+
}
29+
if (argv != 0) {
30+
std::cout << "argv not null\n";
31+
; // intentional extra-semicolon
32+
}
33+
34+
if (argv == nullptr) {
35+
return std::string_view(*argv); // intentional nullptr dereference
36+
}
37+
38+
return std::string_view(argv[0]);
39+
}
40+
} // namespace args

src/main.cpp

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
#include <iostream>
2+
#include <variant>
23

3-
using namespace std;
4+
import args;
45

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

8-
if (num == 0) {
9-
cout << "No arguments provided\n";
10-
} else if (num == 0) { // intentional mistake
11-
cout << "1 argument provided\n";
12-
} else if (num == 2) {
13-
cout << "2 arguments provided\n";
14-
} else {
15-
cout << num << " arguments provided\n";
16-
}
17-
if (argv != 0) {
18-
cout << "argv not null\n";; // intentional extra-semicolon
19-
}
20-
if (argv == nullptr) {
21-
return **argv; // intentional nullptr dereference
8+
int main(int argc, char *argv[]) {
9+
auto get_proc_name = args::process_args(argc, argv);
10+
if (std::holds_alternative<args::Error>(get_proc_name)) {
11+
switch (std::get<args::Error>(get_proc_name)) {
12+
case args::Error::TooLong:
13+
std::cout << "Proc name too long\n";
14+
return 1;
15+
}
16+
return 0;
2217
}
2318

19+
auto &&value = std::get<std::string_view>(get_proc_name);
20+
std::cout << value << '\n';
2421
return 0;
2522
}
26-

0 commit comments

Comments
 (0)