Skip to content
7 changes: 4 additions & 3 deletions lib/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "config.h"

#include <climits>
#include <stdexcept>
#include <string>
#include <vector>

Expand Down Expand Up @@ -149,9 +150,9 @@ namespace cppcheck {
static const char *platformString(PlatformType pt) {
switch (pt) {
case Unspecified:
return "Unspecified";
return "unspecified";
case Native:
return "Native";
return "native";
case Win32A:
return "win32A";
case Win32W:
Expand All @@ -165,7 +166,7 @@ namespace cppcheck {
case PlatformFile:
return "platformFile";
default:
return "unknown";
throw std::runtime_error("unknown platform");
}
}

Expand Down
3 changes: 3 additions & 0 deletions test/fixture.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ extern std::ostringstream errout;
// NOLINTNEXTLINE(readability-redundant-declaration)
extern std::ostringstream output;

// TODO: most asserts do not actually assert i.e. do not return
#define TEST_CASE( NAME ) do { if (prepareTest(#NAME)) { setVerbose(false); NAME(); } } while (false)
#define ASSERT( CONDITION ) if (!assert_(__FILE__, __LINE__, (CONDITION))) return
#define ASSERT_LOC( CONDITION, FILE_, LINE_ ) assert_(FILE_, LINE_, (CONDITION))
Expand All @@ -165,4 +166,6 @@ extern std::ostringstream output;
} \
} while (false)

#define PLATFORM( S, P ) do { std::string errstr; assertEquals(__FILE__, __LINE__, true, S.platform(cppcheck::Platform::platformString(P), errstr, {exename}), errstr); } while (false)

#endif // fixtureH
2 changes: 1 addition & 1 deletion test/testcharvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class TestCharVar : public TestFixture {
Settings settings;

void run() override {
settings.platform(Settings::Unspecified);
PLATFORM(settings, Settings::Unspecified);
settings.severity.enable(Severity::warning);
settings.severity.enable(Severity::portability);

Expand Down
11 changes: 8 additions & 3 deletions test/testclangimport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1052,10 +1052,15 @@ class TestClangImport : public TestFixture {
#define GET_SYMBOL_DB(AST) \
Settings settings; \
settings.clang = true; \
settings.platform(cppcheck::Platform::PlatformType::Unix64); \
{ \
std::string errstr; \
ASSERT_EQUALS_MSG(true, settings.platform("unix64", errstr, {exename.c_str()}), errstr); \
} \
Tokenizer tokenizer(&settings, this); \
std::istringstream istr(AST); \
clangimport::parseClangAstDump(&tokenizer, istr); \
{ \
std::istringstream istr(AST); \
clangimport::parseClangAstDump(&tokenizer, istr); \
} \
const SymbolDatabase *db = tokenizer.getSymbolDatabase(); \
ASSERT(db)

Expand Down
6 changes: 3 additions & 3 deletions test/testcondition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ class TestCondition : public TestFixture {

void run() override {
// known platform..
settings0.platform(cppcheck::Platform::PlatformType::Native);
settings1.platform(cppcheck::Platform::PlatformType::Native);
PLATFORM(settings0, cppcheck::Platform::Native);
PLATFORM(settings1, cppcheck::Platform::Native);

LOAD_LIB_2(settings0.library, "qt.cfg");
LOAD_LIB_2(settings0.library, "std.cfg");
Expand Down Expand Up @@ -5580,7 +5580,7 @@ class TestCondition : public TestFixture {
void compareOutOfTypeRange() {
Settings settingsUnix64;
settingsUnix64.severity.enable(Severity::style);
settingsUnix64.platform(cppcheck::Platform::PlatformType::Unix64);
PLATFORM(settingsUnix64, cppcheck::Platform::PlatformType::Unix64);

check("void f(unsigned char c) {\n"
" if (c == 256) {}\n"
Expand Down
4 changes: 3 additions & 1 deletion test/testfilelister.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ class TestFileLister : public TestFixture {
// bail out if the tests are not executed from the base folder
{
std::ifstream fin("test/testfilelister.cpp");
if (!fin.is_open())
if (!fin.is_open()) {
// TODO: log
return;
}
}

TEST_CASE(isDirectory);
Expand Down
2 changes: 1 addition & 1 deletion test/testio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ class TestIO : public TestFixture {
if (portability)
settings.severity.enable(Severity::portability);
settings.certainty.setEnabled(Certainty::inconclusive, inconclusive);
settings.platform(platform);
PLATFORM(settings, platform);

// Tokenize..
Tokenizer tokenizer(&settings, this);
Expand Down
8 changes: 4 additions & 4 deletions test/testother.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1991,7 +1991,7 @@ class TestOther : public TestFixture {
ASSERT_EQUALS("", errout.str());

Settings settings1;
settings1.platform(Settings::Win64);
PLATFORM(settings1, cppcheck::Platform::Win64);
check("using ui64 = unsigned __int64;\n"
"ui64 Test(ui64 one, ui64 two) { return one + two; }\n",
/*filename*/ nullptr, /*experimental*/ false, /*inconclusive*/ true, /*runSimpleChecks*/ true, /*verbose*/ false, &settings1);
Expand Down Expand Up @@ -2137,12 +2137,12 @@ class TestOther : public TestFixture {
"void f(X x) {}";

Settings s32(_settings);
s32.platform(cppcheck::Platform::Unix32);
PLATFORM(s32, cppcheck::Platform::Unix32);
check(code, &s32);
ASSERT_EQUALS("[test.cpp:5]: (performance) Function parameter 'x' should be passed by const reference.\n", errout.str());

Settings s64(_settings);
s64.platform(cppcheck::Platform::Unix64);
PLATFORM(s64, cppcheck::Platform::Unix64);
check(code, &s64);
ASSERT_EQUALS("", errout.str());
}
Expand Down Expand Up @@ -7421,7 +7421,7 @@ class TestOther : public TestFixture {

// #9040
Settings settings1;
settings1.platform(Settings::Win64);
PLATFORM(settings1, cppcheck::Platform::Win64);
check("using BOOL = unsigned;\n"
"int i;\n"
"bool f() {\n"
Expand Down
144 changes: 109 additions & 35 deletions test/testplatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,11 @@ class TestPlatform : public TestFixture {
private:
void run() override {
TEST_CASE(empty);
TEST_CASE(valid_config_native_1);
TEST_CASE(valid_config_native_2);
TEST_CASE(valid_config_win32a);
TEST_CASE(valid_config_unix64);
TEST_CASE(valid_config_win32w);
TEST_CASE(valid_config_unix32);
TEST_CASE(valid_config_win64);
TEST_CASE(valid_config_file_1);
TEST_CASE(valid_config_file_2);
TEST_CASE(valid_config_file_3);
Expand All @@ -50,50 +53,133 @@ class TestPlatform : public TestFixture {
// An empty platform file does not change values, only the type.
const char xmldata[] = "<?xml version=\"1.0\"?>\n<platform/>";
cppcheck::Platform platform;
ASSERT(platform.platform(cppcheck::Platform::Win64));
ASSERT(readPlatform(platform, xmldata));
ASSERT_EQUALS(cppcheck::Platform::PlatformFile, platform.platformType);
ASSERT(!platform.isWindowsPlatform());
ASSERT_EQUALS(8, platform.char_bit);
ASSERT_EQUALS('\0', platform.defaultSign);
// TODO: this should fail - platform files need to be complete
TODO_ASSERT(!readPlatform(platform, xmldata));
}

void valid_config_win32a() const {
// Verify if native Win32A platform is loaded correctly
cppcheck::Platform platform;
PLATFORM(platform, cppcheck::Platform::Win32A);
ASSERT_EQUALS(cppcheck::Platform::Win32A, platform.platformType);
ASSERT(platform.isWindowsPlatform());
ASSERT_EQUALS(1, platform.sizeof_bool);
ASSERT_EQUALS(2, platform.sizeof_short);
ASSERT_EQUALS(4, platform.sizeof_int);
ASSERT_EQUALS(4, platform.sizeof_long);
ASSERT_EQUALS(8, platform.sizeof_long_long);
ASSERT_EQUALS(4, platform.sizeof_float);
ASSERT_EQUALS(8, platform.sizeof_double);
ASSERT_EQUALS(8, platform.sizeof_long_double);
ASSERT_EQUALS(2, platform.sizeof_wchar_t);
ASSERT_EQUALS(4, platform.sizeof_size_t);
ASSERT_EQUALS(4, platform.sizeof_pointer);
ASSERT_EQUALS('\0', platform.defaultSign);
ASSERT_EQUALS(8, platform.char_bit);
ASSERT_EQUALS(16, platform.short_bit);
ASSERT_EQUALS(32, platform.int_bit);
ASSERT_EQUALS(32, platform.long_bit);
ASSERT_EQUALS(64, platform.long_long_bit);
}

void valid_config_native_1() const {
// Verify if native Win32A platform is loaded correctly
void valid_config_unix64() const {
// Verify if native Unix64 platform is loaded correctly
cppcheck::Platform platform;
ASSERT(platform.platform(cppcheck::Platform::Win32A));
ASSERT_EQUALS(cppcheck::Platform::Win32A, platform.platformType);
ASSERT(platform.isWindowsPlatform());
PLATFORM(platform, cppcheck::Platform::Unix64);
ASSERT_EQUALS(cppcheck::Platform::Unix64, platform.platformType);
ASSERT(!platform.isWindowsPlatform());
ASSERT_EQUALS(1, platform.sizeof_bool);
ASSERT_EQUALS(2, platform.sizeof_short);
ASSERT_EQUALS(4, platform.sizeof_int);
ASSERT_EQUALS(8, platform.sizeof_long);
ASSERT_EQUALS(8, platform.sizeof_long_long);
ASSERT_EQUALS(4, platform.sizeof_float);
ASSERT_EQUALS(8, platform.sizeof_double);
ASSERT_EQUALS(16, platform.sizeof_long_double);
ASSERT_EQUALS(4, platform.sizeof_wchar_t);
ASSERT_EQUALS(8, platform.sizeof_size_t);
ASSERT_EQUALS(8, platform.sizeof_pointer);
ASSERT_EQUALS('\0', platform.defaultSign);
ASSERT_EQUALS(8, platform.char_bit);
ASSERT_EQUALS(16, platform.short_bit);
ASSERT_EQUALS(32, platform.int_bit);
ASSERT_EQUALS(64, platform.long_bit);
ASSERT_EQUALS(64, platform.long_long_bit);
}

void valid_config_win32w() const {
// Verify if native Win32W platform is loaded correctly
cppcheck::Platform platform;
PLATFORM(platform, cppcheck::Platform::Win32W);
ASSERT_EQUALS(cppcheck::Platform::Win32W, platform.platformType);
ASSERT(platform.isWindowsPlatform());
ASSERT_EQUALS(1, platform.sizeof_bool);
ASSERT_EQUALS(2, platform.sizeof_short);
ASSERT_EQUALS(4, platform.sizeof_int);
ASSERT_EQUALS(4, platform.sizeof_long);
ASSERT_EQUALS(8, platform.sizeof_long_long);
ASSERT_EQUALS(4, platform.sizeof_float);
ASSERT_EQUALS(8, platform.sizeof_double);
ASSERT_EQUALS(8, platform.sizeof_long_double);
ASSERT_EQUALS(2, platform.sizeof_wchar_t);
ASSERT_EQUALS(4, platform.sizeof_size_t);
ASSERT_EQUALS(4, platform.sizeof_pointer);
ASSERT_EQUALS('\0', platform.defaultSign);
ASSERT_EQUALS(8, platform.char_bit);
ASSERT_EQUALS(16, platform.short_bit);
ASSERT_EQUALS(32, platform.int_bit);
ASSERT_EQUALS(32, platform.long_bit);
ASSERT_EQUALS(64, platform.long_long_bit);
}

void valid_config_native_2() const {
// Verify if native Unix64 platform is loaded correctly
void valid_config_unix32() const {
// Verify if native Unix32 platform is loaded correctly
cppcheck::Platform platform;
ASSERT(platform.platform(cppcheck::Platform::Unix64));
ASSERT_EQUALS(cppcheck::Platform::Unix64, platform.platformType);
PLATFORM(platform, cppcheck::Platform::Unix32);
ASSERT_EQUALS(cppcheck::Platform::Unix32, platform.platformType);
ASSERT(!platform.isWindowsPlatform());
ASSERT_EQUALS(1, platform.sizeof_bool);
ASSERT_EQUALS(2, platform.sizeof_short);
ASSERT_EQUALS(4, platform.sizeof_int);
ASSERT_EQUALS(4, platform.sizeof_long);
ASSERT_EQUALS(8, platform.sizeof_long_long);
ASSERT_EQUALS(4, platform.sizeof_float);
ASSERT_EQUALS(8, platform.sizeof_double);
ASSERT_EQUALS(12, platform.sizeof_long_double);
ASSERT_EQUALS(4, platform.sizeof_wchar_t);
ASSERT_EQUALS(4, platform.sizeof_size_t);
ASSERT_EQUALS(4, platform.sizeof_pointer);
ASSERT_EQUALS('\0', platform.defaultSign);
ASSERT_EQUALS(8, platform.char_bit);
ASSERT_EQUALS(16, platform.short_bit);
ASSERT_EQUALS(32, platform.int_bit);
ASSERT_EQUALS(32, platform.long_bit);
ASSERT_EQUALS(64, platform.long_long_bit);
}

void valid_config_win64() const {
// Verify if native Win64 platform is loaded correctly
cppcheck::Platform platform;
PLATFORM(platform, cppcheck::Platform::Win64);
ASSERT_EQUALS(cppcheck::Platform::Win64, platform.platformType);
ASSERT(platform.isWindowsPlatform());
ASSERT_EQUALS(1, platform.sizeof_bool);
ASSERT_EQUALS(2, platform.sizeof_short);
ASSERT_EQUALS(4, platform.sizeof_int);
ASSERT_EQUALS(4, platform.sizeof_long);
ASSERT_EQUALS(8, platform.sizeof_long_long);
ASSERT_EQUALS(4, platform.sizeof_float);
ASSERT_EQUALS(8, platform.sizeof_double);
ASSERT_EQUALS(8, platform.sizeof_long_double);
ASSERT_EQUALS(2, platform.sizeof_wchar_t);
ASSERT_EQUALS(8, platform.sizeof_size_t);
ASSERT_EQUALS(8, platform.sizeof_pointer);
ASSERT_EQUALS('\0', platform.defaultSign);
ASSERT_EQUALS(8, platform.char_bit);
ASSERT_EQUALS(16, platform.short_bit);
ASSERT_EQUALS(32, platform.int_bit);
ASSERT_EQUALS(8, platform.sizeof_long);
ASSERT_EQUALS(64, platform.long_bit);
ASSERT_EQUALS(32, platform.long_bit);
ASSERT_EQUALS(64, platform.long_long_bit);
}

void valid_config_file_1() {
Expand Down Expand Up @@ -184,7 +270,7 @@ class TestPlatform : public TestFixture {
ASSERT_EQUALS(100, platform.long_long_bit);
}

void valid_config_file_3() {
void valid_config_file_3() const {
// Valid platform configuration without any usable information.
// Similar like an empty file.
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
Expand All @@ -206,17 +292,8 @@ class TestPlatform : public TestFixture {
" </sizeof1>\n"
" </platform>";
cppcheck::Platform platform;
ASSERT(platform.platform(cppcheck::Platform::Win64));
ASSERT(readPlatform(platform, xmldata));
ASSERT_EQUALS(platform.PlatformFile, platform.platformType);
ASSERT(!platform.isWindowsPlatform());
ASSERT_EQUALS(8, platform.char_bit);
ASSERT_EQUALS('\0', platform.defaultSign);
ASSERT_EQUALS(1, platform.sizeof_bool);
ASSERT_EQUALS(2, platform.sizeof_short);
ASSERT_EQUALS(4, platform.sizeof_int);
ASSERT_EQUALS(4, platform.sizeof_long);
ASSERT_EQUALS(8, platform.sizeof_long_long);
// TODO: needs to fail - files need to be complete
TODO_ASSERT(!readPlatform(platform, xmldata));
}

void valid_config_file_4() {
Expand Down Expand Up @@ -287,7 +364,7 @@ class TestPlatform : public TestFixture {
ASSERT(!readPlatform(platform, xmldata));
}

void empty_elements() {
void empty_elements() const {
// Valid platform configuration without any usable information.
// Similar like an empty file.
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
Expand All @@ -309,10 +386,7 @@ class TestPlatform : public TestFixture {
" </sizeof>\n"
" </platform>";
cppcheck::Platform platform;
ASSERT(platform.platform(cppcheck::Platform::Win64));
ASSERT(!readPlatform(platform, xmldata));
ASSERT_EQUALS(platform.PlatformFile, platform.platformType);
ASSERT(!platform.isWindowsPlatform());
}

void default_platform() {
Expand Down
4 changes: 2 additions & 2 deletions test/testpreprocessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -480,12 +480,12 @@ class TestPreprocessor : public TestFixture {
simplecpp::TokenList tokens(istr, files, "test.c");

// preprocess code with unix32 platform..
settings.platform(Settings::PlatformType::Unix32);
PLATFORM(settings, Settings::PlatformType::Unix32);
preprocessor.setPlatformInfo(&tokens);
ASSERT_EQUALS("\n1", preprocessor.getcode(tokens, "", files, false));

// preprocess code with unix64 platform..
settings.platform(Settings::PlatformType::Unix64);
PLATFORM(settings, Settings::PlatformType::Unix64);
preprocessor.setPlatformInfo(&tokens);
ASSERT_EQUALS("\n\n\n2", preprocessor.getcode(tokens, "", files, false));
}
Expand Down
2 changes: 1 addition & 1 deletion test/testsimplifytemplate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ class TestSimplifyTemplate : public TestFixture {
errout.str("");

settings.debugwarnings = debugwarnings;
settings.platform(type);
PLATFORM(settings, type);
Tokenizer tokenizer(&settings, this);

std::istringstream istr(code);
Expand Down
Loading