From 8ac2cdd9ff68d4b81c8fe9cfc716578c026676ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 19 Jan 2020 17:30:57 +0100 Subject: [PATCH] Clang import; If there are syntax errors then abort analysis --- lib/cppcheck.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index baaf2bd45..eac2a5172 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -290,6 +290,45 @@ unsigned int CppCheck::check(const std::string &path) std::cerr << "Failed to execute '" + cmd + "'" << std::endl; return 0; } + + // Ensure there are not syntax errors... + { + std::ifstream fin(stderr); + while (std::getline(fin, line)) { + if (line.find(": fatal error:") != std::string::npos) { + + // file:line:column: error: .... + const std::string::size_type pos3 = line.find(": fatal error:"); + const std::string::size_type pos2 = line.rfind(":", pos3 - 1); + const std::string::size_type pos1 = line.rfind(":", pos2 - 1); + + if (pos1 >= pos2 || pos2 >= pos3) + continue; + + const std::string filename = line.substr(0, pos1); + const std::string linenr = line.substr(pos1+1, pos2-pos1-1); + const std::string colnr = line.substr(pos2+1, pos3-pos2-1); + const std::string msg = line.substr(pos3 + 15); + + std::list locationList; + ErrorLogger::ErrorMessage::FileLocation loc; + loc.setfile(Path::toNativeSeparators(filename)); + loc.line = std::atoi(linenr.c_str()); + loc.column = std::atoi(colnr.c_str()); + locationList.push_back(loc); + ErrorLogger::ErrorMessage errmsg(locationList, + loc.getfile(), + Severity::error, + msg, + "syntaxError", + false); + reportErr(errmsg); + + return 0; + } + } + } + //std::cout << "Checking Clang ast dump:\n" << res.second << std::endl; std::istringstream ast(res.second); Tokenizer tokenizer(&mSettings, this);