Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 9 additions & 13 deletions test/testbufferoverrun.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class TestBufferOverrun : public TestFixture {

private:
/*const*/ Settings settings0 = settingsBuilder().library("std.cfg").severity(Severity::warning).severity(Severity::style).severity(Severity::portability).build();
const Settings settings0_i = settingsBuilder(settings0).certainty(Certainty::inconclusive).build();
const Settings settings1 = settingsBuilder(settings0).severity(Severity::performance).certainty(Certainty::inconclusive).build();

struct CheckOptions
{
Expand All @@ -46,7 +48,7 @@ class TestBufferOverrun : public TestFixture {
#define check(...) check_(__FILE__, __LINE__, __VA_ARGS__)
template<size_t size>
void check_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) {
const Settings settings = options.s ? *options.s : settingsBuilder(settings0).certainty(Certainty::inconclusive).build();
const Settings& settings = options.s ? *options.s : settings0_i;

// Tokenize..
SimpleTokenizer tokenizer(settings, *this, options.cpp);
Expand All @@ -58,10 +60,8 @@ class TestBufferOverrun : public TestFixture {

// TODO: get rid of this
void check_(const char* file, int line, const std::string& code) {
const Settings settings = settingsBuilder(settings0).certainty(Certainty::inconclusive).build();

// Tokenize..
SimpleTokenizer tokenizer(settings, *this);
SimpleTokenizer tokenizer(settings0_i, *this);
ASSERT_LOC(tokenizer.tokenize(code), file, line);

// Check for buffer overruns..
Expand All @@ -72,9 +72,7 @@ class TestBufferOverrun : public TestFixture {
template<size_t size>
void checkP_(const char* file, int line, const char (&code)[size])
{
const Settings settings = settingsBuilder(settings0).severity(Severity::performance).certainty(Certainty::inconclusive).build();

SimpleTokenizer2 tokenizer(settings, *this, code, "test.cpp");
SimpleTokenizer2 tokenizer(settings1, *this, code, "test.cpp");

// Tokenizer..
ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line);
Expand Down Expand Up @@ -2722,7 +2720,7 @@ class TestBufferOverrun : public TestFixture {
" char str[6] = \"\\0\";\n"
" unsigned short port = 65535;\n"
" snprintf(str, sizeof(str), \"%hu\", port);\n"
"}", dinit(CheckOptions, $.s = &settings0, $.cpp = false));
"}", dinit(CheckOptions, $.cpp = false));
Comment on lines -2725 to +2723
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This now also has inconclusive enabled but I think it was not intentionally disabled.

ASSERT_EQUALS("", errout_str());

check("int f(int x) {\n" // #11020
Expand Down Expand Up @@ -3499,18 +3497,16 @@ class TestBufferOverrun : public TestFixture {

void buffer_overrun_errorpath() {
setMultiline();
const Settings settingsOld = settings0; // TODO: get rid of this
settings0.templateLocation = "{file}:{line}:note:{info}";
Settings s = settings0;
s.templateLocation = "{file}:{line}:note:{info}";

check("void f() {\n"
" char *p = malloc(10);\n"
" memset(p, 0, 20);\n"
"}");
"}", dinit(CheckOptions, $.s = &s));
ASSERT_EQUALS("[test.cpp:3:12]: error: Buffer is accessed out of bounds: p [bufferAccessOutOfBounds]\n"
"[test.cpp:2:13]: note: Assign p, buffer with size 10\n"
"[test.cpp:3:12]: note: Buffer overrun\n", errout_str());

settings0 = settingsOld;
}

void buffer_overrun_bailoutIfSwitch() {
Expand Down
8 changes: 4 additions & 4 deletions test/testclass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class TestClass : public TestFixture {
const Settings settings2 = settingsBuilder().severity(Severity::style).library("std.cfg").certainty(Certainty::inconclusive).build();
const Settings settings3 = settingsBuilder().severity(Severity::style).library("std.cfg").severity(Severity::warning).build();
const Settings settings3_i = settingsBuilder(settings3).certainty(Certainty::inconclusive).build();
const Settings settings4 = settingsBuilder().severity(Severity::warning).severity(Severity::portability).library("std.cfg").library("posix.cfg").build();

void run() override {
mNewTemplate = true;
Expand Down Expand Up @@ -2974,8 +2975,7 @@ class TestClass : public TestFixture {
#define checkNoMemset(...) checkNoMemset_(__FILE__, __LINE__, __VA_ARGS__)
template<size_t size>
void checkNoMemset_(const char* file, int line, const char (&code)[size]) {
const Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::portability).library("std.cfg").library("posix.cfg").build();
checkNoMemset_(file, line, code, settings);
checkNoMemset_(file, line, code, settings4);
}

template<size_t size>
Expand Down Expand Up @@ -7626,10 +7626,10 @@ class TestClass : public TestFixture {
" }\n"
"};";

checkConst(code, dinit(CheckConstOptions, $.s = &settings0, $.inconclusive = true));
checkConst(code);
ASSERT_EQUALS("[test.cpp:3:10]: (performance, inconclusive) Technically the member function 'foo::f' can be static (but you may consider moving to unnamed namespace). [functionStatic]\n", errout_str());

checkConst(code, dinit(CheckConstOptions, $.s = &settings0, $.inconclusive = false)); // TODO: Set inconclusive to true (preprocess it)
checkConst(code, dinit(CheckConstOptions, $.inconclusive = false)); // TODO: Set inconclusive to true (preprocess it)
ASSERT_EQUALS("", errout_str());
}

Expand Down
12 changes: 6 additions & 6 deletions test/testcondition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,12 @@ class TestCondition : public TestFixture {
{
const Settings* s = nullptr;
bool cpp = true;
bool inconclusive = false;
};

#define check(...) check_(__FILE__, __LINE__, __VA_ARGS__)
template<size_t size>
void check_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) {
const Settings settings = settingsBuilder(options.s ? *options.s : settings0).certainty(Certainty::inconclusive, options.inconclusive).build();
const Settings& settings = options.s ? *options.s : settings0;

SimpleTokenizer2 tokenizer(settings, *this, code, options.cpp ? "test.cpp" : "test.c");

Expand Down Expand Up @@ -1307,24 +1306,25 @@ class TestCondition : public TestFixture {
}

void incorrectLogicOperator6() { // char literals
const Settings s = settingsBuilder(settings0).certainty(Certainty::inconclusive).build();
check("void f(char x) {\n"
" if (x == '1' || x == '2') {}\n"
"}", dinit(CheckOptions, $.inconclusive = true));
"}", dinit(CheckOptions, $.s = &s));
ASSERT_EQUALS("", errout_str());

check("void f(char x) {\n"
" if (x == '1' && x == '2') {}\n"
"}", dinit(CheckOptions, $.inconclusive = true));
"}", dinit(CheckOptions, $.s = &s));
ASSERT_EQUALS("[test.cpp:2:16]: (warning) Logical conjunction always evaluates to false: x == '1' && x == '2'. [incorrectLogicOperator]\n", errout_str());

check("int f(char c) {\n"
" return (c >= 'a' && c <= 'z');\n"
"}", dinit(CheckOptions, $.inconclusive = true));
"}", dinit(CheckOptions, $.s = &s));
ASSERT_EQUALS("", errout_str());

check("int f(char c) {\n"
" return (c <= 'a' && c >= 'z');\n"
"}", dinit(CheckOptions, $.inconclusive = true));
"}", dinit(CheckOptions, $.s = &s));
ASSERT_EQUALS("[test.cpp:2:20]: (warning, inconclusive) Logical conjunction always evaluates to false: c <= 'a' && c >= 'z'. [incorrectLogicOperator]\n", errout_str());

check("int f(char c) {\n"
Expand Down
16 changes: 7 additions & 9 deletions test/testleakautovar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class TestLeakAutoVar : public TestFixture {
TestLeakAutoVar() : TestFixture("TestLeakAutoVar") {}

private:
const Settings settings = settingsBuilder().library("std.cfg").build();
const Settings settings = settingsBuilder().library("std.cfg").checkLibrary().build();

void run() override {
mNewTemplate = true;
Expand Down Expand Up @@ -223,7 +223,7 @@ class TestLeakAutoVar : public TestFixture {
#define check(...) check_(__FILE__, __LINE__, __VA_ARGS__)
template<size_t size>
void check_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) {
const Settings settings1 = settingsBuilder(options.s ? *options.s : settings).checkLibrary().build();
const Settings& settings1 = options.s ? *options.s : settings;

// Tokenize..
SimpleTokenizer tokenizer(settings1, *this, options.cpp);
Expand All @@ -235,10 +235,8 @@ class TestLeakAutoVar : public TestFixture {

template<size_t size>
void check_(const char* file, int line, const char (&code)[size], const Settings & s) {
const Settings settings0 = settingsBuilder(s).checkLibrary().build();

// Tokenize..
SimpleTokenizer tokenizer(settings0, *this);
SimpleTokenizer tokenizer(s, *this);
ASSERT_LOC(tokenizer.tokenize(code), file, line);

// Check for leaks..
Expand Down Expand Up @@ -454,7 +452,7 @@ class TestLeakAutoVar : public TestFixture {
}

void assign22() { // #9139
const Settings s = settingsBuilder().library("posix.cfg").build();
const Settings s = settingsBuilder().library("posix.cfg").checkLibrary().build();
check("void f(char tempFileName[256]) {\n"
" const int fd = socket(AF_INET, SOCK_PACKET, 0 );\n"
"}", dinit(CheckOptions, $.cpp = true, $.s = &s));
Expand All @@ -467,7 +465,7 @@ class TestLeakAutoVar : public TestFixture {
}

void assign23() {
const Settings s = settingsBuilder().library("posix.cfg").build();
const Settings s = settingsBuilder().library("posix.cfg").checkLibrary().build();
check("void f() {\n"
" int n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14;\n"
" *&n1 = open(\"xx.log\", O_RDONLY);\n"
Expand Down Expand Up @@ -2277,7 +2275,7 @@ class TestLeakAutoVar : public TestFixture {
}

void ifelse24() { // #1733
const Settings s = settingsBuilder().library("std.cfg").library("posix.cfg").build();
const Settings s = settingsBuilder().library("std.cfg").library("posix.cfg").checkLibrary().build();

check("void f() {\n"
" char* temp = strdup(\"temp.txt\");\n"
Expand Down Expand Up @@ -3190,7 +3188,7 @@ class TestLeakAutoVar : public TestFixture {
" <arg nr=\"1\" direction=\"in\"/>\n"
" </function>\n"
"</def>\n";
const Settings settingsLeakIgnore = settingsBuilder().libraryxml(xmldata).build();
const Settings settingsLeakIgnore = settingsBuilder().libraryxml(xmldata).checkLibrary().build();
check("void f() {\n"
" double* a = new double[1024];\n"
" SomeClass::someMethod(a);\n"
Expand Down
3 changes: 1 addition & 2 deletions test/testuninitvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,12 @@ class TestUninitVar : public TestFixture {
struct CheckUninitVarOptions
{
bool cpp = true;
bool debugwarnings = false;
const Settings *s = nullptr;
};

#define checkUninitVar(...) checkUninitVar_(__FILE__, __LINE__, __VA_ARGS__)
void checkUninitVar_(const char* file, int line, const char code[], const CheckUninitVarOptions& options = make_default_obj()) {
const Settings settings1 = settingsBuilder(options.s ? *options.s : settings).debugwarnings(options.debugwarnings).build();
const Settings& settings1 =options.s ? *options.s : settings;

// Tokenize..
SimpleTokenizer tokenizer(settings1, *this, options.cpp);
Expand Down
4 changes: 2 additions & 2 deletions test/testvalueflow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5641,7 +5641,7 @@ class TestValueFlow : public TestFixture {

// #13959
const Settings settingsOld = settings;
settings = settingsBuilder(settingsOld).c(Standards::C23).build();
settings.standards.c = Standards::C23;
code = "void f(int* p) {\n"
" if (p == nullptr)\n"
" return;\n"
Expand All @@ -5651,7 +5651,7 @@ class TestValueFlow : public TestFixture {
ASSERT_EQUALS(1, value.intvalue);
ASSERT_EQUALS(true, value.isKnown());

settings = settingsBuilder(settingsOld).c(Standards::C17).build();
settings.standards.c = Standards::C17;
value = valueOfTok(code, "p ) { }", &settings, /*cpp*/ false);
ASSERT(value == ValueFlow::Value());
settings = settingsOld;
Expand Down