diff --git a/Makefile b/Makefile index 957055df5..de50b8d09 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # This file is generated by tools/dmake, do not edit. ifndef CXXFLAGS - CXXFLAGS=-Wall -Wextra -Wshadow -pedantic -Wno-long-long -Wfloat-equal -Wcast-qual -Wsign-conversion -Wconversion -g + CXXFLAGS=-Wall -Wextra -Wshadow -pedantic -Wno-long-long -Wfloat-equal -Wcast-qual -Wsign-conversion -g endif ifndef CXX @@ -103,8 +103,8 @@ cppcheck: $(LIBOBJ) $(CLIOBJ) $(EXTOBJ) all: cppcheck testrunner -testrunner: $(TESTOBJ) $(LIBOBJ) $(EXTOBJ) cli/threadexecutor.o cli/cmdlineparser.o cli/cppcheckexecutor.o - $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o testrunner $(TESTOBJ) $(LIBOBJ) $(EXTOBJ) -lpcre cli/threadexecutor.o cli/cmdlineparser.o cli/cppcheckexecutor.o $(LDFLAGS) +testrunner: $(TESTOBJ) $(LIBOBJ) $(EXTOBJ) cli/threadexecutor.o cli/cmdlineparser.o cli/cppcheckexecutor.o cli/filelister.o cli/filelister_unix.o + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o testrunner $(TESTOBJ) $(LIBOBJ) $(EXTOBJ) -lpcre cli/threadexecutor.o cli/cmdlineparser.o cli/filelister.o cli/filelister_unix.o $(LDFLAGS) test: all ./testrunner @@ -113,7 +113,7 @@ check: all ./testrunner -g -q dmake: tools/dmake.cpp - $(CXX) -o dmake tools/dmake.cpp lib/filelister*.cpp + $(CXX) -o dmake tools/dmake.cpp cli/filelister*.cpp lib/path.cpp -Ilib clean: rm -f lib/*.o cli/*.o test/*.o externals/tinyxml/*.o testrunner cppcheck cppcheck.1 diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 76217d7f0..c59fcb35e 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -908,7 +908,7 @@ void CheckClass::checkReturnPtrThis(const Scope *scope, const Function *func, co // check if it is a member function for (it = scope->functionList.begin(); it != scope->functionList.end(); ++it) { - // check for a regular function with the same name and a bofy + // check for a regular function with the same name and a body if (it->type == Function::eFunction && it->hasBody && it->token->str() == tok->next()->str()) { @@ -918,7 +918,16 @@ void CheckClass::checkReturnPtrThis(const Scope *scope, const Function *func, co { // make sure it's not a const function if (it->arg->link()->next()->str() != "const") - checkReturnPtrThis(scope, &*it, it->arg->link()->next(), it->arg->link()->next()->link()); + { + /** @todo make sure argument types match */ + // make sure it's not the same function + if (&*it != func) + checkReturnPtrThis(scope, &*it, it->arg->link()->next(), it->arg->link()->next()->link()); + + // just bail for now + else + return; + } } } } diff --git a/test/testclass.cpp b/test/testclass.cpp index 563f07549..431c7252e 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -104,6 +104,7 @@ private: TEST_CASE(operatorEqRetRefThis3); // ticket #1405 TEST_CASE(operatorEqRetRefThis4); // ticket #1451 TEST_CASE(operatorEqRetRefThis5); // ticket #1550 + TEST_CASE(operatorEqRetRefThis6); // ticket #2479 TEST_CASE(operatorEqToSelf1); // single class TEST_CASE(operatorEqToSelf2); // nested class TEST_CASE(operatorEqToSelf3); // multiple inheritance @@ -475,6 +476,23 @@ private: ASSERT_EQUALS("[test.cpp:5]: (style) 'operator=' should return reference to self\n", errout.str()); } + void operatorEqRetRefThis6() // ticket #2478 (segmentation fault) + { + checkOpertorEqRetRefThis( + "class UString {\n" + "public:\n" + " UString& assign( const char* c_str );\n" + " UString& operator=( const UString& s );\n" + "};\n" + "UString& UString::assign( const char* c_str ) {\n" + " std::string tmp( c_str );\n" + " return assign( tmp );\n" + "}\n" + "UString& UString::operator=( const UString& s ) {\n" + " return assign( s );\n" + "}\n"); + } + // Check that operator Equal checks for assignment to self void checkOpertorEqToSelf(const char code[]) { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index a5632d7ff..a1154d325 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -28,6 +28,8 @@ public: ,si(NULL, NULL, NULL) ,vartok(NULL) ,typetok(NULL) + ,t(NULL) + ,found(false) {} private: diff --git a/tools/dmake.cpp b/tools/dmake.cpp index 182a82c07..0ff33c099 100644 --- a/tools/dmake.cpp +++ b/tools/dmake.cpp @@ -237,7 +237,7 @@ int main(int argc, char **argv) fout << "check:\tall\n"; fout << "\t./testrunner -g -q\n\n"; fout << "dmake:\ttools/dmake.cpp\n"; - fout << "\t$(CXX) -o dmake tools/dmake.cpp lib/filelister*.cpp\n\n"; + fout << "\t$(CXX) -o dmake tools/dmake.cpp cli/filelister*.cpp lib/path.cpp -Ilib\n\n"; fout << "clean:\n"; #ifdef _WIN32 fout << "\tdel lib\*.o\n\tdel cli\*.o\n\tdel test\*.o\n\tdel *.exe\n";