/*
* Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2018 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 .
*/
//---------------------------------------------------------------------------
#ifndef ctuH
#define ctuH
//---------------------------------------------------------------------------
#include "check.h"
#include "valueflow.h"
/// @addtogroup Core
/// @{
/** @brief Whole program analysis (ctu=Cross Translation Unit) */
namespace CTU {
class CPPCHECKLIB FileInfo : public Check::FileInfo {
public:
std::string toString() const override;
struct Location {
Location() = default;
Location(const Tokenizer *tokenizer, const Token *tok);
Location(const std::string &fileName, unsigned int linenr) : fileName(fileName), linenr(linenr) {}
std::string fileName;
unsigned int linenr;
};
struct UnsafeUsage {
UnsafeUsage() = default;
UnsafeUsage(const std::string &functionId, unsigned int argnr, const std::string &argumentName, const Location &location) : functionId(functionId), argnr(argnr), argumentName(argumentName), location(location) {}
std::string functionId;
unsigned int argnr;
std::string argumentName;
Location location;
std::string toString() const;
};
struct FunctionCall {
std::string functionId;
std::string functionName;
std::string argumentExpression;
unsigned int argnr;
long long argvalue;
ValueFlow::Value::ValueType valueType;
Location location;
};
struct NestedCall {
NestedCall() = default;
NestedCall(const std::string &id_, const std::string &functionName_, unsigned int argnr_, const std::string &fileName, unsigned int linenr)
: id(id_),
functionName(functionName_),
argnr(argnr_),
argnr2(0) {
location.fileName = fileName;
location.linenr = linenr;
}
NestedCall(const Tokenizer *tokenizer, const Scope *scope, unsigned int argnr_, const Token *tok);
std::string id;
std::string id2;
std::string functionName;
unsigned int argnr;
unsigned int argnr2;
Location location;
};
std::list functionCalls;
std::list nestedCalls;
void loadFromXml(const tinyxml2::XMLElement *xmlElement);
std::map> getNestedCallsMap() const;
enum InvalidValueType { null, uninit };
std::list getErrorPath(InvalidValueType invalidValue,
const UnsafeUsage &unsafeUsage,
const std::map> &nestedCallsMap,
const char info[],
const FunctionCall * * const functionCallPtr) const;
};
CPPCHECKLIB std::string toString(const std::list &unsafeUsage);
CPPCHECKLIB std::string getFunctionId(const Tokenizer *tokenizer, const Function *function);
/** @brief Parse current TU and extract file info */
CPPCHECKLIB FileInfo *getFileInfo(const Tokenizer *tokenizer);
CPPCHECKLIB std::list getUnsafeUsage(const Tokenizer *tokenizer, const Settings *settings, const Check *check, bool (*isUnsafeUsage)(const Check *check, const Token *argtok));
CPPCHECKLIB std::list loadUnsafeUsageListFromXml(const tinyxml2::XMLElement *xmlElement);
}
/// @}
//---------------------------------------------------------------------------
#endif // ctuH