cppcheck/lib/tokenlist.h

223 lines
6.2 KiB
C
Raw Normal View History

/*
* Cppcheck - A tool for static C/C++ code analysis
2022-02-05 11:45:17 +01:00
* Copyright (C) 2007-2022 Cppcheck team.
*
* 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"
Fix crash bug #8579 (#1238) * Added declaration for deletePrevious function * Added definition for deletePrevious function * Fixed crash from deleteThis invalidating pointers The crash was caused by deleteThis() invalidating the pointer to a constant variable usage. This happened when a usage followed an assignment. This fixes bug #8579. * Added tokensFront to match tokensBack This means deletePrevious can set the list's front if necessary. * Initialised tokensFront in appropriate places * Switched to using default Token constructor * Switched to using Token default constructor * Switched to using default constructor for Token * Added missing argument to Token constructor * Changed to use default constructor for Tokens * Switched to using default constructor for Tokens * Switched to using default constructor for Token * Added new test for deleting front Token Also made sure to use the correct constructor for Token in other tests. * Syntax error * Replaced tokensFront and tokensBack with a struct This decreases the size of the Token class for performance purposes. * Replaced tokensFront and tokensBack with a struct * Added tokensFrontBack to destructor * Reworked to use TokensBackFront struct Also ran astyle. * Reworked to use TokenList's TokensFrontBack member * Reworked to use TokensFrontBack struct * Reworked to use TokensFrontBack struct * Reworked to work with TokensFrontBack struct * Removed unnecessary scope operator * Added missing parentheses * Fixed syntax error * Removed unnecessary constructor * Default constructor now 0-initialises everything This is safer for not using a temporary TokensFrontBack object, and doesn't use delegating constructors which aren't supported yet. * Fixed unsafe null check * Added missing explicit keyword * Fixing stylistic nits Removed default constructor as it has been superseded by the single-argument constructor with a default argument value. Renamed listEnds to tokensFrontBack. Fixed if statement that was supposed to be adding safety but would actually cause a crash if tokensFrontBack was null. * Fixing stylistic nits Removed default constructor and replaced it with a single-argument constructor with a default value. * Fixing stylistic nits Renamed _listEnds to _tokensFrontBack. * Fixing stylistic nits Renamed _listEnds to _tokensFrontBack.
2018-05-25 07:15:05 +02:00
#include "token.h"
2017-05-27 04:33:47 +02:00
#include <iosfwd>
#include <string>
#include <unordered_set>
#include <vector>
class Settings;
namespace simplecpp {
class TokenList;
}
/// @addtogroup Core
/// @{
class CPPCHECKLIB TokenList {
public:
explicit TokenList(const Settings* settings);
~TokenList();
TokenList(const TokenList &) = delete;
TokenList &operator=(const TokenList &) = delete;
2014-11-20 14:20:09 +01:00
void setSettings(const Settings *settings) {
mSettings = settings;
}
const Settings *getSettings() const {
return mSettings;
}
/** @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;
}
/** 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;
}
/**
* Delete all tokens in given token list
* @param tok token list to delete
*/
static void deleteTokens(Token *tok);
2022-05-08 20:42:06 +02:00
void addtoken(const std::string& str, const nonneg int lineno, const nonneg int column, const nonneg int fileno, bool split = false);
void addtoken(const std::string& str, const Token *locationTok);
void addtoken(const Token *tok, const nonneg int lineno, const nonneg int column, const nonneg int fileno);
void addtoken(const Token *tok, const Token *locationTok);
void addtoken(const Token *tok);
2019-07-17 10:14:00 +02:00
static void insertTokens(Token *dest, const Token *src, nonneg int n);
/**
* 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);
/**
* 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
*/
bool createTokens(std::istream &code, const std::string& file0 = emptyString);
void createTokens(simplecpp::TokenList&& tokenList);
/** Deallocate list */
void deallocateTokens();
/** 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);
/** get first token of list */
2014-11-20 14:20:09 +01:00
const Token *front() const {
return mTokensFrontBack.front;
}
2014-11-20 14:20:09 +01:00
Token *front() {
return mTokensFrontBack.front;
}
/** get last token of list */
2014-11-20 14:20:09 +01:00
const Token *back() const {
return mTokensFrontBack.back;
}
2014-11-20 14:20:09 +01:00
Token *back() {
return mTokensFrontBack.back;
}
/**
* 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;
}
std::string getOrigFile(const Token *tok) const;
/**
* 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;
/**
* Calculates a hash of the token list used to compare multiple
* token lists with each other as quickly as possible.
2021-08-07 20:51:18 +02:00
*/
std::size_t calculateHash() const;
/**
* Create abstract syntax tree.
*/
void createAst() const;
/**
* Check abstract syntax tree.
* Throws InternalError on failure
*/
void validateAst() const;
/**
* 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;
/**
* Convert platform dependent types to standard types.
* 32 bits: size_t -> unsigned long
* 64 bits: size_t -> unsigned long long
*/
void simplifyPlatformTypes();
/**
* Collapse compound standard types into a single token.
* unsigned long long int => long _isUnsigned=true,_isLong=true
*/
void simplifyStdType();
void clangSetOrigFiles();
bool isKeyword(const std::string &str) const;
private:
void determineCppC();
/** Token list */
TokensFrontBack mTokensFrontBack;
/** filenames for the tokenized source code (source + included) */
2018-06-16 16:23:55 +02:00
std::vector<std::string> mFiles;
/** Original filenames for the tokenized source code (source + included) */
std::vector<std::string> mOrigFiles;
/** settings */
const Settings* mSettings;
std::unordered_set<std::string> mKeywords;
/** File is known to be C/C++ code */
bool mIsC;
bool mIsCpp;
};
/// @}
//---------------------------------------------------------------------------
#endif // tokenlistH