Skip to content

Commit cc66c38

Browse files
committed
review fixes, other fixes
1 parent e1278b4 commit cc66c38

File tree

14 files changed

+123
-31
lines changed

14 files changed

+123
-31
lines changed

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ ifndef INCLUDE_FOR_LIB
173173
endif
174174

175175
ifndef INCLUDE_FOR_CLI
176-
INCLUDE_FOR_CLI=-Ilib -isystem externals/simplecpp -isystem externals/tinyxml2
176+
INCLUDE_FOR_CLI=-Ilib -isystem externals/picojson -isystem externals/simplecpp -isystem externals/tinyxml2
177177
endif
178178

179179
ifndef INCLUDE_FOR_TEST
@@ -762,7 +762,7 @@ $(libcppdir)/vfvalue.o: lib/vfvalue.cpp lib/config.h lib/errortypes.h lib/mathli
762762
cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h lib/xml.h
763763
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp
764764

765-
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/cppcheckexecutorseh.h cli/executor.h cli/processexecutor.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
765+
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/cppcheckexecutorseh.h cli/executor.h cli/processexecutor.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
766766
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp
767767

768768
cli/cppcheckexecutorseh.o: cli/cppcheckexecutorseh.cpp cli/cppcheckexecutor.h cli/cppcheckexecutorseh.h lib/config.h lib/filesettings.h lib/path.h lib/platform.h lib/standards.h lib/utils.h

cli/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ if (BUILD_CLI)
1212
else()
1313
target_include_directories(cli_objs SYSTEM PRIVATE ${tinyxml2_INCLUDE_DIRS})
1414
endif()
15+
target_externals_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/externals/picojson/)
1516
target_externals_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/externals/simplecpp/)
1617
if (NOT CMAKE_DISABLE_PRECOMPILE_HEADERS)
1718
target_precompile_headers(cli_objs PRIVATE precompiled.h)

cli/cli.vcxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
</PropertyGroup>
8686
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
8787
<ClCompile>
88-
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
88+
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\picojson;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
8989
<BufferSecurityCheck>true</BufferSecurityCheck>
9090
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
9191
<Optimization>Disabled</Optimization>
@@ -114,7 +114,7 @@
114114
</ItemDefinitionGroup>
115115
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug-PCRE|x64'">
116116
<ClCompile>
117-
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
117+
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\picojson;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
118118
<BufferSecurityCheck>true</BufferSecurityCheck>
119119
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
120120
<Optimization>Disabled</Optimization>
@@ -143,7 +143,7 @@
143143
</ItemDefinitionGroup>
144144
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
145145
<ClCompile>
146-
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
146+
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\picojson;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
147147
<BufferSecurityCheck>false</BufferSecurityCheck>
148148
<Optimization>MaxSpeed</Optimization>
149149
<PreprocessorDefinitions>CPPCHECKLIB_IMPORT;TINYXML2_IMPORT;NDEBUG;WIN32;_CRT_SECURE_NO_WARNINGS;WIN32_LEAN_AND_MEAN;_WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -181,7 +181,7 @@
181181
</ItemDefinitionGroup>
182182
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release-PCRE|x64'">
183183
<ClCompile>
184-
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
184+
<AdditionalIncludeDirectories>..\lib;..\externals;..\externals\picojson;..\externals\simplecpp;..\externals\tinyxml2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
185185
<BufferSecurityCheck>false</BufferSecurityCheck>
186186
<Optimization>MaxSpeed</Optimization>
187187
<PreprocessorDefinitions>CPPCHECKLIB_IMPORT;TINYXML2_IMPORT;NDEBUG;WIN32;HAVE_RULES;_CRT_SECURE_NO_WARNINGS;WIN32_LEAN_AND_MEAN;_WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>

cli/cmdlineparser.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,20 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
917917
else if (std::strncmp(argv[i], "--output-file=", 14) == 0)
918918
mSettings.outputFile = Path::simplifyPath(argv[i] + 14);
919919

920+
else if (std::strncmp(argv[i], "--output-format=", 16) == 0) {
921+
const std::string format = argv[i] + 16;
922+
if (format == "sarif")
923+
mSettings.outputFormat = Settings::OutputFormat::sarif;
924+
else if (format == "xml")
925+
mSettings.outputFormat = Settings::OutputFormat::xml;
926+
else {
927+
mLogger.printError("argument to '--output-format=' must be 'sarif' or 'xml'.");
928+
return Result::Fail;
929+
}
930+
mSettings.xml = (mSettings.outputFormat == Settings::OutputFormat::xml);
931+
}
932+
933+
920934
// Experimental: limit execution time for extended valueflow analysis. basic valueflow analysis
921935
// is always executed.
922936
else if (std::strncmp(argv[i], "--performance-valueflow-max-time=", 33) == 0) {
@@ -951,6 +965,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
951965

952966
// Write results in results.plist
953967
else if (std::strncmp(argv[i], "--plist-output=", 15) == 0) {
968+
mSettings.outputFormat = Settings::OutputFormat::plist;
954969
mSettings.plistOutput = Path::simplifyPath(argv[i] + 15);
955970
if (mSettings.plistOutput.empty())
956971
mSettings.plistOutput = ".";
@@ -1362,12 +1377,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
13621377
else if (std::strcmp(argv[i], "-v") == 0 || std::strcmp(argv[i], "--verbose") == 0)
13631378
mSettings.verbose = true;
13641379

1365-
else if (std::strcmp(argv[i], "--sarif") == 0)
1366-
mSettings.sarif = true;
1367-
13681380
// Write results in results.xml
1369-
else if (std::strcmp(argv[i], "--xml") == 0)
1381+
else if (std::strcmp(argv[i], "--xml") == 0) {
13701382
mSettings.xml = true;
1383+
mSettings.outputFormat = Settings::OutputFormat::xml;
1384+
}
13711385

13721386
// Define the XML file version (and enable XML output)
13731387
else if (std::strncmp(argv[i], "--xml-version=", 14) == 0) {
@@ -1383,6 +1397,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
13831397
mSettings.xml_version = tmp;
13841398
// Enable also XML if version is set
13851399
mSettings.xml = true;
1400+
mSettings.outputFormat = Settings::OutputFormat::xml;
13861401
}
13871402

13881403
else {
@@ -1628,6 +1643,10 @@ void CmdLineParser::printHelp() const
16281643
" is 2. A larger value will mean more errors can be found\n"
16291644
" but also means the analysis will be slower.\n"
16301645
" --output-file=<file> Write results to file, rather than standard error.\n"
1646+
" --output-format=<format>\n"
1647+
" Specify the output format. The available formats are:\n"
1648+
" * sarif\n"
1649+
" * xml\n"
16311650
" --platform=<type>, --platform=<file>\n"
16321651
" Specifies platform specific types and sizes. The\n"
16331652
" available builtin platforms are:\n"

cli/cppcheckexecutor.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@
2828
#include "errorlogger.h"
2929
#include "errortypes.h"
3030
#include "filesettings.h"
31+
#include "json.h"
3132
#include "settings.h"
3233
#include "singleexecutor.h"
3334
#include "suppressions.h"
3435
#include "utils.h"
3536

36-
#define PICOJSON_USE_INT64
37-
#include "../externals/picojson/picojson.h"
38-
3937
#if defined(HAS_THREADING_MODEL_THREAD)
4038
#include "threadexecutor.h"
4139
#endif
@@ -90,13 +88,13 @@ namespace {
9088
picojson::object shortDescription;
9189
shortDescription["text"] = picojson::value(finding.shortMessage());
9290
rule["shortDescription"] = picojson::value(shortDescription);
93-
ret.push_back(picojson::value(rule));
91+
ret.emplace_back(rule);
9492
}
9593
}
9694
return ret;
9795
}
9896

99-
picojson::array serializeLocations(const ErrorMessage& finding) const {
97+
static picojson::array serializeLocations(const ErrorMessage& finding) {
10098
picojson::array ret;
10199
for (const auto& location : finding.callStack) {
102100
picojson::object physicalLocation;
@@ -109,7 +107,7 @@ namespace {
109107
physicalLocation["region"] = picojson::value(region);
110108
picojson::object loc;
111109
loc["physicalLocation"] = picojson::value(physicalLocation);
112-
ret.push_back(picojson::value(loc));
110+
ret.emplace_back(loc);
113111
}
114112
return ret;
115113
}
@@ -125,12 +123,12 @@ namespace {
125123
message["text"] = picojson::value(finding.shortMessage());
126124
res["message"] = picojson::value(message);
127125
res["ruleId"] = picojson::value(finding.id);
128-
results.push_back(picojson::value(res));
126+
results.emplace_back(res);
129127
}
130128
return results;
131129
}
132130

133-
picojson::value serializeRuns(std::string productName, std::string version) const {
131+
picojson::value serializeRuns(const std::string& productName, const std::string& version) const {
134132
picojson::object driver;
135133
driver["name"] = picojson::value(productName);
136134
driver["version"] = picojson::value(version);
@@ -147,8 +145,10 @@ namespace {
147145

148146
std::string serialize(std::string productName) const {
149147
const auto nameAndVersion = Settings::getNameAndVersion(productName);
150-
productName = nameAndVersion.first;
151-
const std::string version = nameAndVersion.first.empty() ? CppCheck::version() : nameAndVersion.second;
148+
productName = nameAndVersion.first.empty() ? "Cppcheck" : nameAndVersion.first;
149+
std::string version = nameAndVersion.first.empty() ? CppCheck::version() : nameAndVersion.second;
150+
if (version.find(" ") != std::string::npos)
151+
version.erase(version.find(" "), std::string::npos);
152152

153153
picojson::object doc;
154154
doc["version"] = picojson::value("2.1.0");
@@ -216,8 +216,8 @@ namespace {
216216
}
217217

218218
~StdLogger() override {
219-
if (mSettings.sarif) {
220-
std::cerr << mSarifReport.serialize(mSettings.cppcheckCfgProductName);
219+
if (mSettings.outputFormat == Settings::OutputFormat::sarif) {
220+
reportErr(mSarifReport.serialize(mSettings.cppcheckCfgProductName));
221221
}
222222
delete mErrorOutput;
223223
}
@@ -564,7 +564,7 @@ void StdLogger::reportErr(const ErrorMessage &msg)
564564
if (!mShownErrors.insert(msg.toString(mSettings.verbose)).second)
565565
return;
566566

567-
if (mSettings.sarif)
567+
if (mSettings.outputFormat == Settings::OutputFormat::sarif)
568568
mSarifReport.addFinding(msg);
569569
else if (mSettings.xml)
570570
reportErr(msg.toXML());

lib/settings.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,9 @@ class CPPCHECKLIB WARN_UNUSED Settings {
271271
/** @brief write results (--output-file=&lt;file&gt;) */
272272
std::string outputFile;
273273

274+
enum class OutputFormat : std::uint8_t {text, plist, sarif, xml};
275+
OutputFormat outputFormat = OutputFormat::text;
276+
274277
Platform platform;
275278

276279
/** @brief pid of cppcheck. Intention is that this is set in the main process. */
@@ -441,9 +444,6 @@ class CPPCHECKLIB WARN_UNUSED Settings {
441444
/** @brief Is --verbose given? */
442445
bool verbose{};
443446

444-
/** @brief write SARIF results (--sarif) */
445-
bool sarif{};
446-
447447
/** @brief write XML results (--xml) */
448448
bool xml{};
449449

releasenotes.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ GUI:
1010
-
1111

1212
Changed interface:
13+
- SARIF output. Use --output-format=sarif to activate this.
14+
- Add option --output-format=<format>. Allowed formats are sarif and xml.
1315
-
1416

1517
Deprecations:
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
void foo(int x) {
3+
if (x >= 0 || x <= 10) {}
4+
}
5+
6+
dummy=foo();
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
void foo(int x) {
3+
if (x >= 0 && x <= 10) {}
4+
}
5+
6+
dummy=foo();
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
samples/incorrectLogicOperator/bad.c:3:16: warning: Logical disjunction always evaluates to true: x >= 0 || x <= 10. [incorrectLogicOperator]
2+
if (x >= 0 || x <= 10) {}
3+
^

0 commit comments

Comments
 (0)