Verification; Added --verify-diff option
This commit is contained in:
parent
3af3219076
commit
48be067dd1
|
@ -197,6 +197,24 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
|
||||||
mSettings->verificationReport = argv[i] + 16;
|
mSettings->verificationReport = argv[i] + 16;
|
||||||
} else if (std::strcmp(argv[i], "--debug-verify") == 0)
|
} else if (std::strcmp(argv[i], "--debug-verify") == 0)
|
||||||
mSettings->debugVerification = true;
|
mSettings->debugVerification = true;
|
||||||
|
else if (std::strncmp(argv[i], "--verify-diff=", 14) == 0) {
|
||||||
|
std::ifstream fin(argv[i] + 14);
|
||||||
|
if (!fin.is_open()) {
|
||||||
|
printMessage("cppcheck: could not open file " + std::string(argv[i] + 14) + ".");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
mSettings->verifyDiff = Settings::loadDiffFile(fin);
|
||||||
|
mSettings->verification = true;
|
||||||
|
|
||||||
|
for (const auto &diff: mSettings->verifyDiff) {
|
||||||
|
if (!Path::acceptFile(diff.filename))
|
||||||
|
continue;
|
||||||
|
const std::string filename = Path::fromNativeSeparators(diff.filename);
|
||||||
|
if (std::find(mPathNames.begin(), mPathNames.end(), filename) == mPathNames.end())
|
||||||
|
mPathNames.push_back(filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Enforce language (--language=, -x)
|
// Enforce language (--language=, -x)
|
||||||
else if (std::strncmp(argv[i], "--language=", 11) == 0 || std::strcmp(argv[i], "-x") == 0) {
|
else if (std::strncmp(argv[i], "--language=", 11) == 0 || std::strcmp(argv[i], "-x") == 0) {
|
||||||
|
|
|
@ -1694,6 +1694,23 @@ void ExprEngine::executeFunction(const Scope *functionScope, const Tokenizer *to
|
||||||
// TODO.. what about functions in headers?
|
// TODO.. what about functions in headers?
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!settings->verifyDiff.empty()) {
|
||||||
|
const std::string filename = tokenizer->list.getFiles().at(functionScope->bodyStart->fileIndex());
|
||||||
|
bool verify = false;
|
||||||
|
for (const auto &diff: settings->verifyDiff) {
|
||||||
|
if (diff.filename != filename)
|
||||||
|
continue;
|
||||||
|
if (diff.fromLine > functionScope->bodyEnd->linenr())
|
||||||
|
continue;
|
||||||
|
if (diff.toLine < functionScope->bodyStart->linenr())
|
||||||
|
continue;
|
||||||
|
verify = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!verify)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int symbolValueIndex = 0;
|
int symbolValueIndex = 0;
|
||||||
TrackExecution trackExecution;
|
TrackExecution trackExecution;
|
||||||
Data data(&symbolValueIndex, tokenizer, settings, callbacks, &trackExecution);
|
Data data(&symbolValueIndex, tokenizer, settings, callbacks, &trackExecution);
|
||||||
|
|
|
@ -149,3 +149,39 @@ bool Settings::isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<Settings::Diff> Settings::loadDiffFile(std::istream &istr)
|
||||||
|
{
|
||||||
|
std::vector<Settings::Diff> ret;
|
||||||
|
std::string line;
|
||||||
|
std::string filename;
|
||||||
|
while (std::getline(istr, line)) {
|
||||||
|
if (line.compare(0, 11, "diff --git ") == 0) {
|
||||||
|
std::string::size_type pos = line.rfind(" b/");
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
continue;
|
||||||
|
filename = line.substr(pos+3);
|
||||||
|
}
|
||||||
|
if (line.compare(0,4,"@@ -") == 0) {
|
||||||
|
std::string::size_type pos1 = line.find(" ",4);
|
||||||
|
if (pos1 == std::string::npos)
|
||||||
|
continue;
|
||||||
|
std::string::size_type pos2 = line.find(" ",pos1 + 1);
|
||||||
|
if (pos2 == std::string::npos || pos2 < pos1+3)
|
||||||
|
continue;
|
||||||
|
if (line[pos1+1] != '+')
|
||||||
|
continue;
|
||||||
|
std::string::size_type posComma = line.find(",", pos1);
|
||||||
|
if (posComma > pos2)
|
||||||
|
continue;
|
||||||
|
std::string line1 = line.substr(pos1 + 2, posComma - pos1 - 2);
|
||||||
|
std::string line2 = line.substr(posComma+1, pos2 - posComma - 1);
|
||||||
|
Diff diff;
|
||||||
|
diff.filename = filename;
|
||||||
|
diff.fromLine = std::atoi(line1.c_str());
|
||||||
|
diff.toLine = std::atoi(line1.c_str()) + std::atoi(line2.c_str());
|
||||||
|
ret.push_back(diff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -197,6 +197,14 @@ public:
|
||||||
/** @brief Generate verification debug output */
|
/** @brief Generate verification debug output */
|
||||||
bool debugVerification;
|
bool debugVerification;
|
||||||
|
|
||||||
|
/** @brief Verify diff */
|
||||||
|
struct Diff {
|
||||||
|
std::string filename;
|
||||||
|
int fromLine;
|
||||||
|
int toLine;
|
||||||
|
};
|
||||||
|
std::vector<Diff> verifyDiff;
|
||||||
|
|
||||||
/** @brief check unknown function return values */
|
/** @brief check unknown function return values */
|
||||||
std::set<std::string> checkUnknownFunctionReturn;
|
std::set<std::string> checkUnknownFunctionReturn;
|
||||||
|
|
||||||
|
@ -360,6 +368,8 @@ public:
|
||||||
*/
|
*/
|
||||||
bool isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck=false) const;
|
bool isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck=false) const;
|
||||||
|
|
||||||
|
static std::vector<Diff> loadDiffFile(std::istream &istr);
|
||||||
|
|
||||||
/** Is posix library specified? */
|
/** Is posix library specified? */
|
||||||
bool posix() const {
|
bool posix() const {
|
||||||
return std::find(libraries.begin(), libraries.end(), "posix") != libraries.end();
|
return std::find(libraries.begin(), libraries.end(), "posix") != libraries.end();
|
||||||
|
|
Loading…
Reference in New Issue