Skip to content

Commit 9580169

Browse files
committed
Fixing conversion warnings caught by MSVC and adding flags if available on gcc
1 parent 674ad74 commit 9580169

3 files changed

Lines changed: 30 additions & 18 deletions

File tree

‎CMakeLists.txt‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,19 @@ if(DBC_GENERATE_DOCS)
6363
add_subdirectory(doc)
6464
endif()
6565

66+
list(APPEND GCC_CLANG_COMPILE_FLAGS
67+
-Wall -Wextra -Wpedantic
68+
-Warith-conversion -Wconversion
69+
-Wint-in-bool-context
70+
-Wmissing-declarations
71+
-Werror
72+
)
73+
74+
6675
if (MSVC)
6776
add_compile_options(/W4 /WX)
6877
else()
69-
add_compile_options(-Wall -Wextra -Wpedantic -Werror)
78+
add_compile_options(${GCC_CLANG_COMPILE_FLAGS})
7079
endif()
7180

7281
add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES})

‎src/dbc.cpp‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <cstdint>
12
#include <libdbc/dbc.hpp>
23
#include <libdbc/exceptions/error.hpp>
34
#include <libdbc/utils/utils.hpp>
@@ -32,6 +33,7 @@ struct VALObject {
3233
std::vector<libdbc::Signal::SignalValueDescriptions> vd;
3334
};
3435

36+
static bool parseVal(const std::string& str, VALObject& obj);
3537
bool parseVal(const std::string& str, VALObject& obj) {
3638
obj.signal_name = "";
3739
obj.vd.clear();
@@ -67,7 +69,7 @@ bool parseVal(const std::string& str, VALObject& obj) {
6769
}
6870
if (can_id_str.empty())
6971
return false;
70-
obj.can_id = std::stoul(can_id_str);
72+
obj.can_id = static_cast<uint32_t>(std::stoul(can_id_str));
7173
if (*a != ' ')
7274
return false;
7375
a++; // skip whitespace
@@ -237,9 +239,9 @@ void DbcParser::parse_dbc_messages(const std::vector<std::string>& lines) {
237239
VALObject obj;
238240
for (const auto& line : lines) {
239241
if (std::regex_search(line, match, message_re)) {
240-
uint32_t id = std::stoul(match.str(2));
242+
uint32_t id = static_cast<uint32_t>(std::stoul(match.str(2)));
241243
std::string name = match.str(3);
242-
uint8_t size = std::stoul(match.str(4));
244+
uint8_t size = static_cast<uint8_t>(std::stoul(match.str(4)));
243245
std::string node = match.str(5);
244246

245247
Message msg(id, name, size, node);
@@ -251,8 +253,8 @@ void DbcParser::parse_dbc_messages(const std::vector<std::string>& lines) {
251253
if (std::regex_search(line, match, signal_re)) {
252254
std::string name = match.str(2);
253255
bool is_multiplexed = false; // No support yet
254-
uint32_t start_bit = std::stoul(match.str(3));
255-
uint32_t size = std::stoul(match.str(4));
256+
uint32_t start_bit = static_cast<uint32_t>(std::stoul(match.str(3)));
257+
uint32_t size = static_cast<uint32_t>(std::stoul(match.str(4)));
256258
bool is_bigendian = (std::stoul(match.str(5)) == 0);
257259
bool is_signed = (match.str(6) == "-");
258260

‎src/message.cpp‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <algorithm>
2+
#include <cstdint>
23
#include <libdbc/message.hpp>
34

45
namespace libdbc {
@@ -14,20 +15,20 @@ bool Message::operator==(const Message& rhs) const {
1415
}
1516

1617
Message::ParseSignalsStatus Message::parseSignals(const std::vector<uint8_t>& data, std::vector<double>& values) const {
17-
int size = data.size();
18+
auto size = data.size();
1819
if (size > 8)
1920
return ParseSignalsStatus::ErrorMessageToLong; // not supported yet
2021

2122
uint64_t data_little_endian = 0;
2223
uint64_t data_big_endian = 0;
23-
for (int i = 0; i < size; i++) {
24+
for (size_t i = 0; i < size; i++) {
2425
data_little_endian |= ((uint64_t)data[i]) << i * 8;
2526
data_big_endian = (data_big_endian << 8) | (uint64_t)data[i];
2627
}
2728

2829
// TODO: does this also work on a big endian machine?
2930

30-
const uint32_t len = size * 8;
31+
const auto len = size * 8;
3132
uint64_t v = 0;
3233
for (const auto& signal : m_signals) {
3334
if (signal.is_bigendian) {
@@ -40,33 +41,33 @@ Message::ParseSignalsStatus Message::parseSignals(const std::vector<uint8_t>& da
4041
if (signal.is_signed && signal.size > 1) {
4142
switch (signal.size) {
4243
case 8:
43-
values.push_back((int8_t)v * signal.factor + signal.offset);
44+
values.push_back(static_cast<int8_t>(v) * signal.factor + signal.offset);
4445
break;
4546
case 16:
46-
values.push_back((int16_t)v * signal.factor + signal.offset);
47+
values.push_back(static_cast<int16_t>(v) * signal.factor + signal.offset);
4748
break;
4849
case 32:
49-
values.push_back((int32_t)v * signal.factor + signal.offset);
50+
values.push_back(static_cast<int32_t>(v) * signal.factor + signal.offset);
5051
break;
5152
case 64:
52-
values.push_back((int64_t)v * signal.factor + signal.offset);
53+
values.push_back(static_cast<double>(v) * signal.factor + signal.offset);
5354
break;
5455
default: {
5556
// 2 complement -> decimal
56-
const int negative = (v & (1 << (signal.size - 1))) != 0;
57+
const int negative = (v & (1ull << (signal.size - 1))) != 0;
5758
int64_t nativeInt;
5859
if (negative)
59-
nativeInt = v | ~((1 << signal.size) - 1); // invert all bits above signal.size
60+
nativeInt = v | ~((1ull << signal.size) - 1); // invert all bits above signal.size
6061
else
61-
nativeInt = v & ((1 << signal.size) - 1); // masking
62-
values.push_back(nativeInt * signal.factor + signal.offset);
62+
nativeInt = v & ((1ull << signal.size) - 1); // masking
63+
values.push_back(static_cast<double>(nativeInt) * signal.factor + signal.offset);
6364
break;
6465
}
6566
}
6667
} else {
6768
// use only the relevant bits
6869
v = v & ((1 << signal.size) - 1); // masking
69-
values.push_back(v * signal.factor + signal.offset);
70+
values.push_back(static_cast<double>(v) * signal.factor + signal.offset);
7071
}
7172
}
7273
return ParseSignalsStatus::Success;

0 commit comments

Comments
 (0)