diff --git a/Makefile b/Makefile index 83d4cc904..ce2f2dafd 100644 --- a/Makefile +++ b/Makefile @@ -300,7 +300,7 @@ endif ###### Build -$(SRCDIR)/analyzerinfo.o: lib/analyzerinfo.cpp lib/cxx11emu.h lib/analyzerinfo.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/importproject.h lib/platform.h lib/path.h +$(SRCDIR)/analyzerinfo.o: lib/analyzerinfo.cpp lib/cxx11emu.h lib/analyzerinfo.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/importproject.h lib/platform.h lib/path.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/analyzerinfo.o $(SRCDIR)/analyzerinfo.cpp $(SRCDIR)/astutils.o: lib/astutils.cpp lib/cxx11emu.h lib/astutils.h lib/settings.h lib/config.h lib/library.h lib/mathlib.h lib/standards.h lib/errorlogger.h lib/suppressions.h lib/platform.h lib/importproject.h lib/timer.h lib/symboldatabase.h lib/token.h lib/valueflow.h lib/tokenize.h lib/tokenlist.h @@ -390,19 +390,19 @@ $(SRCDIR)/cppcheck.o: lib/cppcheck.cpp lib/cxx11emu.h lib/cppcheck.h lib/config. $(SRCDIR)/errorlogger.o: lib/errorlogger.cpp lib/cxx11emu.h lib/errorlogger.h lib/config.h lib/suppressions.h lib/path.h lib/cppcheck.h lib/settings.h lib/library.h lib/mathlib.h lib/standards.h lib/platform.h lib/importproject.h lib/timer.h lib/check.h lib/token.h lib/valueflow.h lib/tokenize.h lib/tokenlist.h lib/analyzerinfo.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/errorlogger.o $(SRCDIR)/errorlogger.cpp -$(SRCDIR)/importproject.o: lib/importproject.cpp lib/cxx11emu.h lib/importproject.h lib/config.h lib/platform.h lib/path.h lib/settings.h lib/library.h lib/mathlib.h lib/standards.h lib/errorlogger.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/token.h lib/valueflow.h +$(SRCDIR)/importproject.o: lib/importproject.cpp lib/cxx11emu.h lib/importproject.h lib/config.h lib/platform.h lib/path.h lib/settings.h lib/library.h lib/mathlib.h lib/standards.h lib/errorlogger.h lib/suppressions.h lib/timer.h lib/tokenize.h lib/tokenlist.h lib/token.h lib/valueflow.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/importproject.o $(SRCDIR)/importproject.cpp -$(SRCDIR)/library.o: lib/library.cpp lib/cxx11emu.h lib/library.h lib/config.h lib/mathlib.h lib/standards.h lib/errorlogger.h lib/suppressions.h lib/path.h lib/tokenlist.h lib/token.h lib/valueflow.h lib/symboldatabase.h lib/astutils.h +$(SRCDIR)/library.o: lib/library.cpp lib/cxx11emu.h lib/library.h lib/config.h lib/mathlib.h lib/standards.h lib/errorlogger.h lib/suppressions.h lib/path.h lib/tokenlist.h lib/token.h lib/valueflow.h lib/symboldatabase.h lib/astutils.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/library.o $(SRCDIR)/library.cpp -$(SRCDIR)/mathlib.o: lib/mathlib.cpp lib/cxx11emu.h lib/mathlib.h lib/config.h lib/errorlogger.h lib/suppressions.h +$(SRCDIR)/mathlib.o: lib/mathlib.cpp lib/cxx11emu.h lib/mathlib.h lib/config.h lib/errorlogger.h lib/suppressions.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/mathlib.o $(SRCDIR)/mathlib.cpp -$(SRCDIR)/path.o: lib/path.cpp lib/cxx11emu.h lib/path.h lib/config.h +$(SRCDIR)/path.o: lib/path.cpp lib/cxx11emu.h lib/path.h lib/config.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/path.o $(SRCDIR)/path.cpp -$(SRCDIR)/pathmatch.o: lib/pathmatch.cpp lib/cxx11emu.h lib/pathmatch.h lib/config.h lib/path.h +$(SRCDIR)/pathmatch.o: lib/pathmatch.cpp lib/cxx11emu.h lib/pathmatch.h lib/config.h lib/path.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/pathmatch.o $(SRCDIR)/pathmatch.cpp $(SRCDIR)/platform.o: lib/platform.cpp lib/cxx11emu.h lib/platform.h lib/config.h @@ -432,7 +432,7 @@ $(SRCDIR)/token.o: lib/token.cpp lib/cxx11emu.h lib/token.h lib/config.h lib/val $(SRCDIR)/tokenize.o: lib/tokenize.cpp lib/cxx11emu.h lib/tokenize.h lib/errorlogger.h lib/config.h lib/suppressions.h lib/tokenlist.h lib/mathlib.h lib/settings.h lib/library.h lib/standards.h lib/platform.h lib/importproject.h lib/timer.h lib/check.h lib/token.h lib/valueflow.h lib/path.h lib/symboldatabase.h lib/templatesimplifier.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/tokenize.o $(SRCDIR)/tokenize.cpp -$(SRCDIR)/tokenlist.o: lib/tokenlist.cpp lib/cxx11emu.h lib/tokenlist.h lib/config.h lib/token.h lib/valueflow.h lib/mathlib.h lib/path.h lib/preprocessor.h lib/settings.h lib/library.h lib/standards.h lib/errorlogger.h lib/suppressions.h lib/platform.h lib/importproject.h lib/timer.h +$(SRCDIR)/tokenlist.o: lib/tokenlist.cpp lib/cxx11emu.h lib/tokenlist.h lib/config.h lib/token.h lib/valueflow.h lib/mathlib.h lib/path.h lib/preprocessor.h lib/settings.h lib/library.h lib/standards.h lib/errorlogger.h lib/suppressions.h lib/platform.h lib/importproject.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CFG) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(SRCDIR)/tokenlist.o $(SRCDIR)/tokenlist.cpp $(SRCDIR)/valueflow.o: lib/valueflow.cpp lib/cxx11emu.h lib/valueflow.h lib/config.h lib/astutils.h lib/errorlogger.h lib/suppressions.h lib/mathlib.h lib/settings.h lib/library.h lib/standards.h lib/platform.h lib/importproject.h lib/timer.h lib/symboldatabase.h lib/token.h lib/tokenlist.h diff --git a/lib/analyzerinfo.cpp b/lib/analyzerinfo.cpp index 8644d2b77..464aec545 100644 --- a/lib/analyzerinfo.cpp +++ b/lib/analyzerinfo.cpp @@ -18,6 +18,7 @@ #include "analyzerinfo.h" #include "path.h" +#include "utils.h" #include #include @@ -110,7 +111,7 @@ std::string AnalyzerInformation::getAnalyzerInfoFile(const std::string &buildDir } std::string filename = Path::fromNativeSeparators(buildDir); - if (filename.back() != '/') + if (!endsWith(filename, '/')) filename += '/'; const std::string::size_type pos = sourcefile.rfind('/'); if (pos == std::string::npos) diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index bfc987d43..8e6b04d53 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -1734,7 +1734,7 @@ void CheckClass::checkConst() continue; } else if (func->isOperator() && Token::Match(previous, ";|{|}|public:|private:|protected:")) { // Operator without return type: conversion operator const std::string& opName = func->tokenDef->str(); - if (opName.compare(8, 5, "const") != 0 && (opName.back() == '&' || opName.back() == '*')) + if (opName.compare(8, 5, "const") != 0 && (endsWith(opName,'&') || endsWith(opName,'*'))) continue; } else { // don't warn for unknown types.. diff --git a/lib/errorlogger.cpp b/lib/errorlogger.cpp index 3af4a009f..d1f1c9676 100644 --- a/lib/errorlogger.cpp +++ b/lib/errorlogger.cpp @@ -137,7 +137,7 @@ void ErrorLogger::ErrorMessage::setmsg(const std::string &msg) // as an empty message to the user if --verbose is used. // Even this doesn't cause problems with messages that have multiple // lines, none of the the error messages should end into it. - assert(!(msg.back() =='\n')); + assert(!endsWith(msg,'\n')); // The summary and verbose message are separated by a newline // If there is no newline then both the summary and verbose messages diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 04ddecda0..1507b20ce 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -22,6 +22,7 @@ #include "tokenize.h" #include "token.h" #include "tinyxml2.h" +#include "utils.h" #include void ImportProject::ignorePaths(const std::vector &ipaths) @@ -70,7 +71,7 @@ void ImportProject::FileSettings::setDefines(std::string defs) } while (defs.find(";;") != std::string::npos) defs.erase(defs.find(";;"),1); - if (!defs.empty() && defs.back() == ';') + if (!defs.empty() && endsWith(defs,';')) defs.erase(defs.size() - 1U); // TODO: Use std::string::pop_back() as soon as travis supports it bool eq = false; for (std::size_t pos = 0; pos < defs.size(); ++pos) { @@ -123,13 +124,13 @@ void ImportProject::FileSettings::setIncludePaths(const std::string &basepath, c continue; std::string s(Path::fromNativeSeparators(*it)); if (s[0] == '/' || (s.size() > 1U && s.compare(1,2,":/") == 0)) { - if (s.back() != '/') + if (!endsWith(s,'/')) s += '/'; I.push_back(s); continue; } - if (s.back() == '/') // this is a temporary hack, simplifyPath can crash if path ends with '/' + if (endsWith(s,'/')) // this is a temporary hack, simplifyPath can crash if path ends with '/' s.erase(s.size() - 1U); // TODO: Use std::string::pop_back() as soon as travis supports it if (s.find("$(")==std::string::npos) { @@ -154,7 +155,7 @@ void ImportProject::import(const std::string &filename) importCompileCommands(fin); } else if (filename.find(".sln") != std::string::npos) { std::string path(Path::getPathFromFilename(Path::fromNativeSeparators(filename))); - if (!path.empty() && path.back() != '/') + if (!path.empty() && !endsWith(path,'/')) path += '/'; importSln(fin,path); } else if (filename.find(".vcxproj") != std::string::npos) { diff --git a/lib/library.cpp b/lib/library.cpp index 17dcf0c73..48abdd6b0 100644 --- a/lib/library.cpp +++ b/lib/library.cpp @@ -24,6 +24,7 @@ #include "token.h" #include "symboldatabase.h" #include "astutils.h" +#include "utils.h" #include @@ -87,7 +88,7 @@ Library::Error Library::load(const char exename[], const char path[]) while (error == tinyxml2::XML_ERROR_FILE_NOT_FOUND && !cfgfolders.empty()) { const std::string cfgfolder(cfgfolders.front()); cfgfolders.pop_front(); - const char *sep = (!cfgfolder.empty() && cfgfolder.back()=='/' ? "" : "/"); + const char *sep = (!cfgfolder.empty() && endsWith(cfgfolder,'/') ? "" : "/"); const std::string filename(cfgfolder + sep + fullfilename); error = doc.LoadFile(filename.c_str()); if (error != tinyxml2::XML_ERROR_FILE_NOT_FOUND) diff --git a/lib/mathlib.cpp b/lib/mathlib.cpp index d502dd08d..fb75a2f5a 100644 --- a/lib/mathlib.cpp +++ b/lib/mathlib.cpp @@ -20,6 +20,7 @@ #include "mathlib.h" #include "errorlogger.h" +#include "utils.h" #include // VS2013: std::min and std::max #include @@ -524,7 +525,7 @@ MathLib::bigint MathLib::toLongNumber(const std::string & str) return static_cast(doubleval); } - if (str[0] == '\'' && str.size() >= 3U && str.back() == '\'') { + if (str[0] == '\'' && str.size() >= 3U && endsWith(str,'\'')) { return characterLiteralToLongNumber(str.substr(1,str.size()-2)); } @@ -537,7 +538,7 @@ MathLib::bigint MathLib::toLongNumber(const std::string & str) double MathLib::toDoubleNumber(const std::string &str) { - if (str[0] == '\'' && str.size() >= 3U && str.back() == '\'') + if (str[0] == '\'' && str.size() >= 3U && endsWith(str,'\'')) return characterLiteralToLongNumber(str.substr(1,str.size()-2)); if (isIntHex(str)) return static_cast(toLongNumber(str)); diff --git a/lib/path.cpp b/lib/path.cpp index 94152be74..d299182e9 100644 --- a/lib/path.cpp +++ b/lib/path.cpp @@ -20,6 +20,7 @@ #undef __STRICT_ANSI__ #endif #include "path.h" +#include "utils.h" #include #include #include @@ -227,7 +228,7 @@ std::string Path::getRelativePath(const std::string& absolutePath, const std::ve if (absolutePath == *i || i->empty()) // Seems to be a file, or path is empty continue; - bool endsWithSep = i->back() == '/'; + bool endsWithSep = endsWith(*i,'/'); if (absolutePath.compare(0, i->length(), *i) == 0 && absolutePath[i->length() - (endsWithSep?1:0)] == '/') { std::string rest = absolutePath.substr(i->length() + (endsWithSep?0:1)); return rest; diff --git a/lib/pathmatch.cpp b/lib/pathmatch.cpp index d4f6b5bcf..e876e39b2 100644 --- a/lib/pathmatch.cpp +++ b/lib/pathmatch.cpp @@ -18,6 +18,7 @@ #include "pathmatch.h" #include "path.h" +#include "utils.h" #include #include @@ -43,8 +44,8 @@ bool PathMatch::Match(const std::string &path) const std::transform(findpath.begin(), findpath.end(), findpath.begin(), ::tolower); // Filtering directory name - if (excludedPath.back() == '/') { - if (findpath.back() != '/') + if (endsWith(excludedPath,'/')) { + if (!endsWith(findpath,'/')) findpath = RemoveFilename(findpath); if (excludedPath.length() > findpath.length()) diff --git a/lib/token.cpp b/lib/token.cpp index af18a5509..694d64e7e 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -74,9 +74,9 @@ void Token::update_property_info() _tokType = eName; } else if (std::isdigit((unsigned char)_str[0]) || (_str.length() > 1 && _str[0] == '-' && std::isdigit((unsigned char)_str[1]))) _tokType = eNumber; - else if (_str.length() > 1 && _str[0] == '"' && _str.back() == '"') + else if (_str.length() > 1 && _str[0] == '"' && endsWith(_str,'"')) _tokType = eString; - else if (_str.length() > 1 && _str[0] == '\'' && _str.back() == '\'') + else if (_str.length() > 1 && _str[0] == '\'' && endsWith(_str,'\'')) _tokType = eChar; else if (_str == "=" || _str == "<<=" || _str == ">>=" || (_str.size() == 2U && _str[1] == '=' && std::strchr("+-*/%&^|", _str[0]))) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 71cc788c6..939de80ca 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -1855,7 +1855,7 @@ void Tokenizer::combineOperators() } if (prev->isName() && prev->isUpperCaseName()) continue; - if (prev->isName() && prev->str().back() == ':') + if (prev->isName() && endsWith(prev->str(), ':')) simplify = true; break; } @@ -2648,7 +2648,7 @@ void Tokenizer::setVarIdPass1() (tok->str() == "(" && isFunctionHead(tok,"{")) || (tok->str() == "(" && !scopeStack.top().isExecutable && isFunctionHead(tok,";:")) || (tok->str() == "," && !scopeStack.top().isExecutable) || - (tok->isName() && tok->str().back() == ':'))) { + (tok->isName() && endsWith(tok->str(), ':')))) { // No variable declarations in sizeof if (Token::simpleMatch(tok->previous(), "sizeof (")) { @@ -2662,7 +2662,7 @@ void Tokenizer::setVarIdPass1() const Token *tok2 = (tok->isName()) ? tok : tok->next(); // private: protected: public: etc - while (tok2 && tok2->str().back() == ':') { + while (tok2 && endsWith(tok2->str(), ':')) { tok2 = tok2->next(); } if (!tok2) diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index 1c0799d8f..d3ff6aba1 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -24,6 +24,7 @@ #include "preprocessor.h" #include "settings.h" #include "errorlogger.h" +#include "utils.h" #include #include @@ -301,8 +302,8 @@ bool TokenList::createTokens(std::istream &code, const std::string& file0) } else if (std::strchr("+-", ch) && CurrentToken.length() > 0 && std::isdigit((unsigned char)CurrentToken[0]) && - (CurrentToken.back() == 'e' || - CurrentToken.back() == 'E') && + (endsWith(CurrentToken,'e') || + endsWith(CurrentToken,'E')) && !MathLib::isIntHex(CurrentToken)) { // Don't separate doubles "4.2e+10" } else if (CurrentToken.empty() && ch == '.' && std::isdigit((unsigned char)code.peek())) { diff --git a/lib/utils.h b/lib/utils.h index 2023274a0..fce9d8275 100644 --- a/lib/utils.h +++ b/lib/utils.h @@ -55,4 +55,8 @@ private: Cont data_; }; +inline bool endsWith(const std::string &str, char c) { + return str.back() == c; +} + #endif