Skip to content

Commit 2fee380

Browse files
authored
Merge branch 'main' into fix_14206
2 parents 3ae5770 + 92fffee commit 2fee380

24 files changed

Lines changed: 1891 additions & 170 deletions

.github/workflows/asan.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ jobs:
149149
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json frontend || ec=1
150150
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json -Ifrontend cli || ec=1
151151
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json --enable=internal lib || ec=1
152-
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui/*.cpp || ec=1
152+
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui || ec=1
153153
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli -Ifrontend test/*.cpp || ec=1
154154
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1
155-
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage/*.cpp || ec=1
155+
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage || ec=1
156156
exit $ec

.github/workflows/tsan.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ jobs:
151151
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json frontend || ec=1
152152
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json -Ifrontend cli || ec=1
153153
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json --enable=internal lib || ec=1
154-
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui/*.cpp || ec=1
154+
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui || ec=1
155155
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli -Ifrontend test/*.cpp || ec=1
156156
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1
157-
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage/*.cpp || ec=1
157+
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage || ec=1
158158
exit $ec

.github/workflows/ubsan.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ jobs:
144144
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json frontend || ec=1
145145
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json -Ifrontend cli || ec=1
146146
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options --addon=naming.json --enable=internal lib || ec=1
147-
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui/*.cpp || ec=1
147+
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt --addon=naming.json -Icmake.output/gui -Ifrontend -Igui gui/*.cpp cmake.output/gui || ec=1
148148
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli -Ifrontend test/*.cpp || ec=1
149149
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -Icli tools/dmake/*.cpp || ec=1
150-
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage/*.cpp || ec=1
150+
./cmake.output/bin/cppcheck $selfcheck_options $cppcheck_options -DQ_MOC_OUTPUT_REVISION=69 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --library=qt -Icmake.output/tools/triage -Igui tools/triage/*.cpp cmake.output/tools/triage || ec=1
151151
exit $ec

.selfcheck_suppressions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ simplifyUsing:*/moc_*.cpp
1111
funcArgNamesDifferent:*/moc_*.cpp
1212
naming-varname:*/ui_*.h
1313
functionStatic:*/ui_fileview.h
14+
constVariablePointer:*/moc_test*.cpp
1415

1516
# --debug-warnings suppressions
1617
valueFlowBailout

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ Tommy Bergman
411411
Toralf Förster
412412
Troshin V.S.
413413
Tyson Nottingham
414+
Usman Majid
414415
Valentin Batz
415416
Valerii Lashmanov
416417
Vasily Maslyukov

Makefile

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ ifndef INCLUDE_FOR_CLI
176176
endif
177177

178178
ifndef INCLUDE_FOR_TEST
179-
INCLUDE_FOR_TEST=-Ilib -Ifrontend -Icli -isystem externals/simplecpp -isystem externals/tinyxml2
179+
INCLUDE_FOR_TEST=-Ilib -Ifrontend -Icli -isystem externals/picojson -isystem externals/simplecpp -isystem externals/tinyxml2
180180
endif
181181

182182
ifndef CFLAGS_FOR_TEST
@@ -249,6 +249,7 @@ LIBOBJ = $(libcppdir)/valueflow.o \
249249
$(libcppdir)/programmemory.o \
250250
$(libcppdir)/regex.o \
251251
$(libcppdir)/reverseanalyzer.o \
252+
$(libcppdir)/sarifreport.o \
252253
$(libcppdir)/settings.o \
253254
$(libcppdir)/standards.o \
254255
$(libcppdir)/summaries.o \
@@ -327,6 +328,7 @@ TESTOBJ = test/fixture.o \
327328
test/testprocessexecutor.o \
328329
test/testprogrammemory.o \
329330
test/testregex.o \
331+
test/testsarifreport.o \
330332
test/testsettings.o \
331333
test/testsimplifytemplate.o \
332334
test/testsimplifytokens.o \
@@ -638,6 +640,9 @@ $(libcppdir)/regex.o: lib/regex.cpp lib/config.h lib/regex.h
638640
$(libcppdir)/reverseanalyzer.o: lib/reverseanalyzer.cpp lib/addoninfo.h lib/analyzer.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/forwardanalyzer.h lib/library.h lib/mathlib.h lib/platform.h lib/reverseanalyzer.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h
639641
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/reverseanalyzer.cpp
640642

643+
$(libcppdir)/sarifreport.o: lib/sarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/utils.h
644+
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/sarifreport.cpp
645+
641646
$(libcppdir)/settings.o: lib/settings.cpp externals/picojson/picojson.h lib/addoninfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/summaries.h lib/suppressions.h lib/utils.h lib/vfvalue.h
642647
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/settings.cpp
643648

@@ -683,7 +688,7 @@ frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h l
683688
cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.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/regex.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h lib/xml.h
684689
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp
685690

686-
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.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/timer.h lib/utils.h
691+
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.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/sarifreport.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h
687692
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp
688693

689694
cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
@@ -854,6 +859,9 @@ test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h
854859
test/testregex.o: test/testregex.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/regex.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h
855860
$(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testregex.cpp
856861

862+
test/testsarifreport.o: test/testsarifreport.cpp externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/sarifreport.h lib/settings.h lib/standards.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h
863+
$(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsarifreport.cpp
864+
857865
test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h
858866
$(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsettings.cpp
859867

cli/cppcheckexecutor.cpp

Lines changed: 7 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "filesettings.h"
3535
#include "json.h"
3636
#include "path.h"
37+
#include "sarifreport.h"
3738
#include "settings.h"
3839
#include "singleexecutor.h"
3940
#include "suppressions.h"
@@ -80,156 +81,6 @@
8081
#endif
8182

8283
namespace {
83-
class SarifReport {
84-
public:
85-
void addFinding(ErrorMessage msg) {
86-
mFindings.push_back(std::move(msg));
87-
}
88-
89-
picojson::array serializeRules() const {
90-
picojson::array ret;
91-
std::set<std::string> ruleIds;
92-
for (const auto& finding : mFindings) {
93-
// github only supports findings with locations
94-
if (finding.callStack.empty())
95-
continue;
96-
if (ruleIds.insert(finding.id).second) {
97-
picojson::object rule;
98-
rule["id"] = picojson::value(finding.id);
99-
// rule.shortDescription.text
100-
picojson::object shortDescription;
101-
shortDescription["text"] = picojson::value(finding.shortMessage());
102-
rule["shortDescription"] = picojson::value(shortDescription);
103-
// rule.fullDescription.text
104-
picojson::object fullDescription;
105-
fullDescription["text"] = picojson::value(finding.verboseMessage());
106-
rule["fullDescription"] = picojson::value(fullDescription);
107-
// rule.help.text
108-
picojson::object help;
109-
help["text"] = picojson::value(finding.verboseMessage()); // FIXME provide proper help text
110-
rule["help"] = picojson::value(help);
111-
// rule.properties.precision, rule.properties.problem.severity
112-
picojson::object properties;
113-
properties["precision"] = picojson::value(sarifPrecision(finding));
114-
const char* securitySeverity = nullptr;
115-
if (finding.severity == Severity::error && !ErrorLogger::isCriticalErrorId(finding.id))
116-
securitySeverity = "9.9"; // We see undefined behavior
117-
//else if (finding.severity == Severity::warning)
118-
// securitySeverity = 5.1; // We see potential undefined behavior
119-
if (securitySeverity) {
120-
properties["security-severity"] = picojson::value(securitySeverity);
121-
const picojson::array tags{picojson::value("security")};
122-
properties["tags"] = picojson::value(tags);
123-
}
124-
rule["properties"] = picojson::value(properties);
125-
// rule.defaultConfiguration.level
126-
picojson::object defaultConfiguration;
127-
defaultConfiguration["level"] = picojson::value(sarifSeverity(finding));
128-
rule["defaultConfiguration"] = picojson::value(defaultConfiguration);
129-
130-
ret.emplace_back(rule);
131-
}
132-
}
133-
return ret;
134-
}
135-
136-
static picojson::array serializeLocations(const ErrorMessage& finding) {
137-
picojson::array ret;
138-
for (const auto& location : finding.callStack) {
139-
picojson::object physicalLocation;
140-
picojson::object artifactLocation;
141-
artifactLocation["uri"] = picojson::value(location.getfile(false));
142-
physicalLocation["artifactLocation"] = picojson::value(artifactLocation);
143-
picojson::object region;
144-
region["startLine"] = picojson::value(static_cast<int64_t>(location.line < 1 ? 1 : location.line));
145-
region["startColumn"] = picojson::value(static_cast<int64_t>(location.column < 1 ? 1 : location.column));
146-
region["endLine"] = region["startLine"];
147-
region["endColumn"] = region["startColumn"];
148-
physicalLocation["region"] = picojson::value(region);
149-
picojson::object loc;
150-
loc["physicalLocation"] = picojson::value(physicalLocation);
151-
ret.emplace_back(loc);
152-
}
153-
return ret;
154-
}
155-
156-
picojson::array serializeResults() const {
157-
picojson::array results;
158-
for (const auto& finding : mFindings) {
159-
// github only supports findings with locations
160-
if (finding.callStack.empty())
161-
continue;
162-
picojson::object res;
163-
res["level"] = picojson::value(sarifSeverity(finding));
164-
res["locations"] = picojson::value(serializeLocations(finding));
165-
picojson::object message;
166-
message["text"] = picojson::value(finding.shortMessage());
167-
res["message"] = picojson::value(message);
168-
res["ruleId"] = picojson::value(finding.id);
169-
results.emplace_back(res);
170-
}
171-
return results;
172-
}
173-
174-
picojson::value serializeRuns(const std::string& productName, const std::string& version) const {
175-
picojson::object driver;
176-
driver["name"] = picojson::value(productName);
177-
driver["semanticVersion"] = picojson::value(version);
178-
driver["informationUri"] = picojson::value("https://cppcheck.sourceforge.io");
179-
driver["rules"] = picojson::value(serializeRules());
180-
picojson::object tool;
181-
tool["driver"] = picojson::value(driver);
182-
picojson::object run;
183-
run["tool"] = picojson::value(tool);
184-
run["results"] = picojson::value(serializeResults());
185-
picojson::array runs{picojson::value(run)};
186-
return picojson::value(runs);
187-
}
188-
189-
std::string serialize(std::string productName) const {
190-
const auto nameAndVersion = Settings::getNameAndVersion(productName);
191-
productName = nameAndVersion.first.empty() ? "Cppcheck" : nameAndVersion.first;
192-
std::string version = nameAndVersion.first.empty() ? CppCheck::version() : nameAndVersion.second;
193-
if (version.find(' ') != std::string::npos)
194-
version.erase(version.find(' '), std::string::npos);
195-
196-
picojson::object doc;
197-
doc["version"] = picojson::value("2.1.0");
198-
doc["$schema"] = picojson::value("https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/schemas/sarif-schema-2.1.0.json");
199-
doc["runs"] = serializeRuns(productName, version);
200-
201-
return picojson::value(doc).serialize(true);
202-
}
203-
private:
204-
205-
static std::string sarifSeverity(const ErrorMessage& errmsg) {
206-
if (ErrorLogger::isCriticalErrorId(errmsg.id))
207-
return "error";
208-
switch (errmsg.severity) {
209-
case Severity::error:
210-
case Severity::warning:
211-
case Severity::style:
212-
case Severity::portability:
213-
case Severity::performance:
214-
return "warning";
215-
case Severity::information:
216-
case Severity::internal:
217-
case Severity::debug:
218-
case Severity::none:
219-
return "note";
220-
}
221-
return "note";
222-
}
223-
224-
static std::string sarifPrecision(const ErrorMessage& errmsg) {
225-
if (errmsg.certainty == Certainty::inconclusive)
226-
return "medium";
227-
return "high";
228-
}
229-
230-
std::vector<ErrorMessage> mFindings;
231-
};
232-
23384
class CmdLineLoggerStd : public CmdLineLogger
23485
{
23586
public:
@@ -717,18 +568,20 @@ void StdLogger::reportErr(const ErrorMessage &msg)
717568
msgCopy.classification = getClassification(msgCopy.guideline, mSettings.reportType);
718569

719570
// TODO: there should be no need for verbose and default messages here
720-
const std::string msgStr = msgCopy.toString(mSettings.verbose, mSettings.templateFormat, mSettings.templateLocation);
571+
const std::string msgStr =
572+
msgCopy.toString(mSettings.verbose, mSettings.templateFormat, mSettings.templateLocation);
721573

722574
// Alert only about unique errors
723575
if (!mSettings.emitDuplicates && !mShownErrors.insert(msgStr).second)
724576
return;
725577

726-
if (mSettings.outputFormat == Settings::OutputFormat::sarif)
578+
if (mSettings.outputFormat == Settings::OutputFormat::sarif) {
727579
mSarifReport.addFinding(std::move(msgCopy));
728-
else if (mSettings.outputFormat == Settings::OutputFormat::xml)
580+
} else if (mSettings.outputFormat == Settings::OutputFormat::xml) {
729581
reportErr(msgCopy.toXML());
730-
else
582+
} else {
731583
reportErr(msgStr);
584+
}
732585
}
733586

734587
/**

lib/astutils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2203,7 +2203,7 @@ static bool hasNoreturnFunction(const Token* tok, const Library& library, const
22032203
{
22042204
if (!tok)
22052205
return false;
2206-
const Token* ftok = tok->str() == "(" ? tok->previous() : nullptr;
2206+
const Token* ftok = (tok->str() == "(" && !tok->isCast()) ? tok->previous() : nullptr;
22072207
while (Token::simpleMatch(ftok, "("))
22082208
ftok = ftok->astOperand1();
22092209
if (ftok) {

0 commit comments

Comments
 (0)