From b2fafbf513a286b4fe607d948168d17437da7a1f Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 18 May 2021 16:00:40 -0400 Subject: [PATCH] fix: [plugin] json error parsing for kaitai compilers (#102) --- .../analyzers/KaitaiStruct/kaitaistruct.cpp | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/hobbits-plugins/analyzers/KaitaiStruct/kaitaistruct.cpp b/src/hobbits-plugins/analyzers/KaitaiStruct/kaitaistruct.cpp index 7c4ebabf..3f6e350f 100644 --- a/src/hobbits-plugins/analyzers/KaitaiStruct/kaitaistruct.cpp +++ b/src/hobbits-plugins/analyzers/KaitaiStruct/kaitaistruct.cpp @@ -111,9 +111,9 @@ QSharedPointer KaitaiStruct::analyzeBits( progress->setProgressPercent(20); #ifdef Q_OS_WIN - QStringList kscAgs = {"/C", kscPath, "--debug", "-t", "python", ksy.fileName()}; + QStringList kscAgs = {"/C", kscPath, "--debug", "--ksc-json-output", "-t", "python", ksy.fileName()}; #else - QStringList kscAgs = {"--debug", "-t", "python", ksy.fileName()}; + QStringList kscAgs = {"--debug", "--ksc-json-output", "-t", "python", ksy.fileName()}; #endif QProcess kscProcess; QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); @@ -136,18 +136,63 @@ QSharedPointer KaitaiStruct::analyzeBits( if (errorFile.open(QIODevice::ReadOnly)) { errorOutput = errorFile.readAll(); errorFile.close(); - kscOutput += QString("stderr:\n%2").arg(errorOutput); + kscOutput += QString("ksc stderr:\n%2").arg(errorOutput); } if (stdoutFile.open(QIODevice::ReadOnly)) { stdOutput = stdoutFile.readAll(); stdoutFile.close(); - kscOutput += QString("stdout:\n%2").arg(stdOutput); + kscOutput += QString("ksc stdout:\n%2").arg(stdOutput); } + // Check for unexpected stderr if (!errorOutput.isEmpty()) { return AnalyzerResult::error(QString("kaitai-struct-compiler error:\n%1").arg(kscOutput)); } + // Otherwise, parse the JSON + QJsonObject json = QJsonDocument::fromJson(stdOutput.toLatin1()).object(); + for (QString key : json.keys()) { + if (!json.value(key).isObject()) { + continue; + } + QJsonObject obj = json.value(key).toObject(); + if (!obj.contains("errors") || !obj.value("errors").isArray()) { + continue; + } + + QString errorString = "KSC Error:\n"; + QJsonArray arr = obj.value("errors").toArray(); + for (QJsonValue val: arr) { + if (!val.isObject()) { + continue; + } + QJsonObject valObj = val.toObject(); + + QString errFile = valObj.value("file").toString(); + QString errLoc = ""; + QString errMsg = valObj.value("message").toString(); + + if (valObj.contains("path") && valObj.value("path").isArray()) { + QJsonArray errPathArr = valObj.value("path").toArray(); + QStringList errPathStrings; + for (QJsonValue pathVal: errPathArr) { + errPathStrings.append(pathVal.toString()); + } + errLoc += " " + errPathStrings.join("/"); + } + + if (valObj.contains("line")) { + errLoc += QString(" line:%1").arg(valObj.value("line").toInt()); + } + + if (valObj.contains("col")) { + errLoc += QString(" col:%1").arg(valObj.value("col").toInt()); + } + + errorString += QString("%1%2 - %3\n").arg(errFile).arg(errLoc).arg(errMsg); + } + return AnalyzerResult::error(errorString); + } } else if (parameters.contains(PARAM_PY)