2012-05-05 18:33:26 +02:00
|
|
|
/*
|
|
|
|
* Cppcheck - A tool for static C/C++ code analysis
|
2021-03-21 20:58:32 +01:00
|
|
|
* Copyright (C) 2007-2021 Cppcheck team.
|
2012-05-05 18:33:26 +02:00
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
#ifndef tokenlistH
|
|
|
|
#define tokenlistH
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
2017-05-27 04:33:47 +02:00
|
|
|
#include "config.h"
|
2018-05-25 07:15:05 +02:00
|
|
|
#include "token.h"
|
2017-05-27 04:33:47 +02:00
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
#include <string>
|
2021-01-16 13:52:09 +01:00
|
|
|
#include <unordered_set>
|
2012-05-05 18:33:26 +02:00
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
class Settings;
|
|
|
|
|
2017-05-17 15:38:31 +02:00
|
|
|
namespace simplecpp {
|
|
|
|
class TokenList;
|
|
|
|
}
|
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/// @addtogroup Core
|
|
|
|
/// @{
|
|
|
|
|
2012-06-10 14:19:09 +02:00
|
|
|
class CPPCHECKLIB TokenList {
|
2012-05-05 18:33:26 +02:00
|
|
|
public:
|
2015-03-08 18:18:09 +01:00
|
|
|
explicit TokenList(const Settings* settings);
|
2012-05-05 18:33:26 +02:00
|
|
|
~TokenList();
|
|
|
|
|
2014-11-20 14:20:09 +01:00
|
|
|
void setSettings(const Settings *settings) {
|
2018-06-16 16:10:28 +02:00
|
|
|
mSettings = settings;
|
2012-05-05 18:33:26 +02:00
|
|
|
}
|
|
|
|
|
2016-07-08 20:39:34 +02:00
|
|
|
const Settings *getSettings() const {
|
2018-06-16 16:10:28 +02:00
|
|
|
return mSettings;
|
2016-07-08 20:39:34 +02:00
|
|
|
}
|
|
|
|
|
2014-06-04 18:00:22 +02:00
|
|
|
/** @return the source file path. e.g. "file.cpp" */
|
|
|
|
const std::string& getSourceFilePath() const;
|
|
|
|
|
|
|
|
/** Is the code C. Used for bailouts */
|
2014-11-20 14:20:09 +01:00
|
|
|
bool isC() const {
|
2018-06-16 16:28:03 +02:00
|
|
|
return mIsC;
|
2014-06-24 17:34:20 +02:00
|
|
|
}
|
2014-06-04 18:00:22 +02:00
|
|
|
|
|
|
|
/** Is the code CPP. Used for bailouts */
|
2014-11-20 14:20:09 +01:00
|
|
|
bool isCPP() const {
|
2018-06-16 16:28:03 +02:00
|
|
|
return mIsCpp;
|
2014-06-24 17:34:20 +02:00
|
|
|
}
|
2014-06-04 18:00:22 +02:00
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/**
|
|
|
|
* Delete all tokens in given token list
|
|
|
|
* @param tok token list to delete
|
|
|
|
*/
|
|
|
|
static void deleteTokens(Token *tok);
|
|
|
|
|
2020-12-08 10:34:23 +01:00
|
|
|
void addtoken(std::string str, const nonneg int lineno, const nonneg int column, const nonneg int fileno, bool split = false);
|
2019-08-17 07:38:07 +02:00
|
|
|
void addtoken(std::string str, const Token *locationTok);
|
|
|
|
|
2020-12-08 10:34:23 +01:00
|
|
|
void addtoken(const Token *tok, const nonneg int lineno, const nonneg int column, const nonneg int fileno);
|
2019-08-17 07:38:07 +02:00
|
|
|
void addtoken(const Token *tok, const Token *locationTok);
|
|
|
|
void addtoken(const Token *tok);
|
2012-05-05 18:33:26 +02:00
|
|
|
|
2019-07-17 10:14:00 +02:00
|
|
|
static void insertTokens(Token *dest, const Token *src, nonneg int n);
|
2012-05-05 18:33:26 +02:00
|
|
|
|
2018-01-07 14:07:34 +01:00
|
|
|
/**
|
|
|
|
* Copy tokens.
|
|
|
|
* @param dest destination token where copied tokens will be inserted after
|
|
|
|
* @param first first token to copy
|
|
|
|
* @param last last token to copy
|
|
|
|
* @param one_line true=>copy all tokens to the same line as dest. false=>copy all tokens to dest while keeping the 'line breaks'
|
|
|
|
* @return new location of last token copied
|
|
|
|
*/
|
|
|
|
static Token *copyTokens(Token *dest, const Token *first, const Token *last, bool one_line = true);
|
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/**
|
|
|
|
* Create tokens from code.
|
|
|
|
* The code must be preprocessed first:
|
|
|
|
* - multiline strings are not handled.
|
|
|
|
* - UTF in the code are not handled.
|
|
|
|
* - comments are not handled.
|
|
|
|
* @param code input stream for code
|
|
|
|
* @param file0 source file name
|
|
|
|
*/
|
2014-06-26 11:44:19 +02:00
|
|
|
bool createTokens(std::istream &code, const std::string& file0 = emptyString);
|
2012-05-05 18:33:26 +02:00
|
|
|
|
2020-05-16 18:44:17 +02:00
|
|
|
void createTokens(simplecpp::TokenList&& tokenList);
|
2017-05-17 14:57:54 +02:00
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/** Deallocate list */
|
|
|
|
void deallocateTokens();
|
|
|
|
|
2014-01-28 17:15:07 +01:00
|
|
|
/** append file name if seen the first time; return its index in any case */
|
2019-07-17 10:14:00 +02:00
|
|
|
int appendFileIfNew(const std::string &fileName);
|
2014-01-28 17:15:07 +01:00
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/** get first token of list */
|
2014-11-20 14:20:09 +01:00
|
|
|
const Token *front() const {
|
2018-06-16 16:22:35 +02:00
|
|
|
return mTokensFrontBack.front;
|
2012-05-05 18:33:26 +02:00
|
|
|
}
|
2014-11-20 14:20:09 +01:00
|
|
|
Token *front() {
|
2018-06-16 16:22:35 +02:00
|
|
|
return mTokensFrontBack.front;
|
2012-05-05 18:33:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/** get last token of list */
|
2014-11-20 14:20:09 +01:00
|
|
|
const Token *back() const {
|
2018-06-16 16:22:35 +02:00
|
|
|
return mTokensFrontBack.back;
|
2012-05-05 18:33:26 +02:00
|
|
|
}
|
2014-11-20 14:20:09 +01:00
|
|
|
Token *back() {
|
2018-06-16 16:22:35 +02:00
|
|
|
return mTokensFrontBack.back;
|
2012-05-05 18:33:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get filenames (the sourcefile + the files it include).
|
|
|
|
* The first filename is the filename for the sourcefile
|
|
|
|
* @return vector with filenames
|
|
|
|
*/
|
2014-11-20 14:20:09 +01:00
|
|
|
const std::vector<std::string>& getFiles() const {
|
2018-06-16 16:23:55 +02:00
|
|
|
return mFiles;
|
2012-05-05 18:33:26 +02:00
|
|
|
}
|
|
|
|
|
2018-11-18 16:08:08 +01:00
|
|
|
std::string getOrigFile(const Token *tok) const;
|
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/**
|
|
|
|
* get filename for given token
|
|
|
|
* @param tok The given token
|
|
|
|
* @return filename for the given token
|
|
|
|
*/
|
|
|
|
const std::string& file(const Token *tok) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get file:line for a given token
|
|
|
|
* @param tok given token
|
|
|
|
* @return location for given token
|
|
|
|
*/
|
|
|
|
std::string fileLine(const Token *tok) const;
|
|
|
|
|
2014-09-02 18:05:02 +02:00
|
|
|
/**
|
|
|
|
* Calculates a 64-bit checksum of the token list used to compare
|
|
|
|
* multiple token lists with each other as quickly as possible.
|
|
|
|
*/
|
|
|
|
unsigned long long calculateChecksum() const;
|
|
|
|
|
2015-12-12 15:39:38 +01:00
|
|
|
/**
|
|
|
|
* Create abstract syntax tree.
|
|
|
|
*/
|
2021-01-09 20:32:38 +01:00
|
|
|
void createAst() const;
|
2012-12-15 20:21:09 +01:00
|
|
|
|
2015-12-12 15:39:38 +01:00
|
|
|
/**
|
2015-12-12 16:08:52 +01:00
|
|
|
* Check abstract syntax tree.
|
|
|
|
* Throws InternalError on failure
|
2015-12-12 15:39:38 +01:00
|
|
|
*/
|
2017-01-07 14:13:22 +01:00
|
|
|
void validateAst() const;
|
2015-12-12 15:39:38 +01:00
|
|
|
|
2015-12-27 17:38:15 +01:00
|
|
|
/**
|
|
|
|
* Verify that the given token is an element of the tokenlist.
|
|
|
|
* That method is implemented for debugging purposes.
|
|
|
|
* @param[in] tok token to be checked
|
|
|
|
* \return true if token was found in tokenlist, false else. In case of nullptr true is returned.
|
|
|
|
*/
|
|
|
|
bool validateToken(const Token* tok) const;
|
|
|
|
|
2019-02-15 13:29:52 +01:00
|
|
|
/**
|
|
|
|
* Convert platform dependent types to standard types.
|
|
|
|
* 32 bits: size_t -> unsigned long
|
|
|
|
* 64 bits: size_t -> unsigned long long
|
|
|
|
*/
|
|
|
|
void simplifyPlatformTypes();
|
|
|
|
|
2017-10-03 22:10:13 +02:00
|
|
|
/**
|
|
|
|
* Collapse compound standard types into a single token.
|
|
|
|
* unsigned long long int => long _isUnsigned=true,_isLong=true
|
|
|
|
*/
|
|
|
|
void simplifyStdType();
|
|
|
|
|
2020-02-22 11:57:09 +01:00
|
|
|
bool isKeyword(const std::string &str) const;
|
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
private:
|
2015-12-12 15:39:38 +01:00
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/** Disable copy constructor, no implementation */
|
|
|
|
TokenList(const TokenList &);
|
|
|
|
|
|
|
|
/** Disable assignment operator, no implementation */
|
|
|
|
TokenList &operator=(const TokenList &);
|
|
|
|
|
2020-05-17 17:25:33 +02:00
|
|
|
void determineCppC();
|
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/** Token list */
|
2018-06-16 16:22:35 +02:00
|
|
|
TokensFrontBack mTokensFrontBack;
|
2012-05-05 18:33:26 +02:00
|
|
|
|
|
|
|
/** filenames for the tokenized source code (source + included) */
|
2018-06-16 16:23:55 +02:00
|
|
|
std::vector<std::string> mFiles;
|
2012-05-05 18:33:26 +02:00
|
|
|
|
2018-11-18 16:08:08 +01:00
|
|
|
/** Original filenames for the tokenized source code (source + included) */
|
|
|
|
std::vector<std::string> mOrigFiles;
|
|
|
|
|
2012-05-05 18:33:26 +02:00
|
|
|
/** settings */
|
2018-06-16 16:10:28 +02:00
|
|
|
const Settings* mSettings;
|
2014-06-24 17:34:20 +02:00
|
|
|
|
2021-01-16 13:52:09 +01:00
|
|
|
std::unordered_set<std::string> mKeywords;
|
2020-02-22 11:57:09 +01:00
|
|
|
|
2014-06-24 17:34:20 +02:00
|
|
|
/** File is known to be C/C++ code */
|
2020-02-22 11:57:09 +01:00
|
|
|
bool mIsC;
|
|
|
|
bool mIsCpp;
|
2012-05-05 18:33:26 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/// @}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
2013-09-04 20:59:49 +02:00
|
|
|
#endif // tokenlistH
|