Skip to content

Commit 26e022f

Browse files
committed
json-parser: decode Coverity JSON format [EXPERIMENTAL]
This is needed for Coverity Analysis 2018.12 because the output produced by `cov-format-errors --emacs-style` is no longer compatible with csdiff.
1 parent 544c647 commit 26e022f

File tree

6 files changed

+6919
-1
lines changed

6 files changed

+6919
-1
lines changed

csparser.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ KeyEventDigger::KeyEventDigger():
297297
d->traceEvts.insert("loop");
298298
d->traceEvts.insert("loop_begin");
299299
d->traceEvts.insert("loop_end");
300+
d->traceEvts.insert("path");
300301
d->traceEvts.insert("return");
301302
d->traceEvts.insert("switch");
302303
d->traceEvts.insert("switch_case");

json-parser.cc

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ class SimpleTreeDecoder: public AbstractTreeDecoder {
5454
class CovTreeDecoder: public AbstractTreeDecoder {
5555
public:
5656
virtual void readNode(Defect *def, const pt::ptree &node);
57+
58+
private:
59+
KeyEventDigger keDigger;
5760
};
5861

5962
struct JsonParser::Private {
@@ -276,7 +279,34 @@ void CovTreeDecoder::readNode(
276279
// make sure the Defect structure is properly initialized
277280
(*def) = Defect();
278281

282+
// read per-defect properties
283+
// TODO: read/propagate more properties from the Coverity JSON format
279284
def->checker = defNode.get<std::string>("checkerName");
285+
def->function = valueOf<std::string>(defNode, "functionDisplayName", "");
286+
287+
// count the events and allocate dst array
288+
const pt::ptree &evtList = defNode.get_child("events");
289+
def->events.resize(evtList.size());
290+
291+
// decode events one by one
292+
unsigned idx = 0;
293+
pt::ptree::const_iterator it;
294+
for (it = evtList.begin(); it != evtList.end(); ++it, ++idx) {
295+
const pt::ptree &evtNode = it->second;
296+
DefEvent &evt = def->events[idx];
297+
298+
evt.fileName = valueOf<std::string>(evtNode, "filePathname" , "");
299+
evt.line = valueOf<int> (evtNode, "lineNumber" , 0 );
300+
// TODO: read column?
301+
evt.event = valueOf<std::string>(evtNode, "eventTag" , "");
302+
evt.msg = valueOf<std::string>(evtNode, "eventDescription", "");
303+
304+
if (evtNode.get<bool>("main"))
305+
// this is a key event
306+
// TODO: detect and report re-definitions of key events
307+
def->keyEventIdx = idx;
308+
}
280309

281-
throw pt::ptree_error("CovTreeDecoder has not yet been implemented");
310+
// initialize verbosity level of all events
311+
this->keDigger.initVerbosity(def);
282312
}

tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ test_csgrep(csgrep "42-gcc-parser-smatch" )
152152
test_csgrep(csgrep "43-gcc-parser-smatch" )
153153
test_csgrep(csgrep "44-csparser-new-key-evts" )
154154
test_csgrep(csgrep "45-gcc-parser-clang" )
155+
test_csgrep(csgrep "46-cov-json-v2" )
155156
test_csparser(csparser-5.8 00)
156157
test_csparser(csparser-5.8 01)
157158
test_csparser(csparser-5.8 02)

tests/csgrep/46-cov-json-v2-args.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--mode=json

0 commit comments

Comments
 (0)