Skip to content

Commit 67b4065

Browse files
committed
Merge branch 'main' into chr_15021
2 parents 7ae3dd4 + 275f16a commit 67b4065

158 files changed

Lines changed: 9833 additions & 1127 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Automated code review of pull requests using Claude
2+
#
3+
# A member/owner/collaborator requests a review by writing a PR comment
4+
# containing "@claude review".
5+
#
6+
# pull_request_target is not used because the Claude GitHub App token exchange
7+
# rejects OIDC tokens from that event (401 "Invalid OIDC token").
8+
#
9+
# issue_comment runs the workflow file from the default branch with access to
10+
# secrets. The PR code is never checked out or executed.
11+
name: claude-review
12+
13+
on:
14+
issue_comment:
15+
types: [created]
16+
17+
jobs:
18+
review:
19+
if: |
20+
github.event.issue.pull_request &&
21+
contains(github.event.comment.body, '@claude review') &&
22+
contains(fromJSON('["OWNER","MEMBER","COLLABORATOR"]'), github.event.comment.author_association)
23+
24+
runs-on: ubuntu-24.04
25+
26+
permissions:
27+
contents: read
28+
pull-requests: write
29+
id-token: write
30+
31+
steps:
32+
# checks out the base branch, not the PR head
33+
- uses: actions/checkout@v7
34+
with:
35+
fetch-depth: 1
36+
37+
- name: Claude review
38+
uses: anthropics/claude-code-action@v1
39+
with:
40+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
41+
prompt: |
42+
REPO: ${{ github.repository }}
43+
PR NUMBER: ${{ github.event.issue.number }}
44+
45+
Review this pull request. Focus on correctness bugs, potential
46+
false positives/false negatives in checkers, performance problems
47+
and missing tests. Be concise and only report real issues.
48+
49+
Use `gh pr diff` to see the changes. Post specific issues as inline
50+
comments with `mcp__github_inline_comment__create_inline_comment`
51+
and post a short overall summary with `gh pr comment`.
52+
claude_args: |
53+
--allowedTools "mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)"

‎.github/workflows/cppcheck-premium.yml‎

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ jobs:
3333
run: |
3434
premium_version=${{ inputs.premium_version }}
3535
if [ -z $premium_version ]; then
36-
premium_version=26.3.0
36+
premium_version=26.9.0
3737
#wget https://files.cppchecksolutions.com/devdrop/cppcheckpremium-$premium_version-amd64.tar.gz -O cppcheckpremium.tar.gz
38-
wget https://files.cppchecksolutions.com/$premium_version/ubuntu-24.04/cppcheckpremium-$premium_version-amd64.tar.gz -O cppcheckpremium.tar.gz
38+
wget https://files.cppchecksolutions.com/release/2026/$premium_version/ubuntu-24.04/cppcheckpremium-$premium_version-amd64.tar.gz -O cppcheckpremium.tar.gz
3939
else
4040
wget https://files.cppchecksolutions.com/$premium_version/ubuntu-24.04/cppcheckpremium-$premium_version-amd64.tar.gz -O cppcheckpremium.tar.gz
4141
fi
@@ -44,16 +44,18 @@ jobs:
4444
4545
- name: Generate a license file
4646
run: |
47-
echo cppcheck > cppcheck.lic
48-
echo 261231 >> cppcheck.lic
49-
echo 80000 >> cppcheck.lic
50-
echo 4b64673f03fb6230 >> cppcheck.lic
51-
echo path:lib >> cppcheck.lic
47+
echo 1 > cppcheck-premium-git.lic
48+
echo 271231 >> cppcheck-premium-git.lic
49+
echo 70c84e8412a64e58 >> cppcheck-premium-git.lic
50+
echo fbb65b6bd40de73b >> cppcheck-premium-git.lic
51+
echo autosar:1 >> cppcheck-premium-git.lic
52+
echo cert:1 >> cppcheck-premium-git.lic
53+
echo misra:1 >> cppcheck-premium-git.lic
54+
echo licensed-to:Cppcheck CI >> cppcheck-premium-git.lic
5255
5356
- name: Check
5457
run: |
55-
cppcheckpremium/premiumaddon --check-loc-license cppcheck.lic > cppcheck-premium-loc
56-
cppcheckpremium/cppcheck --premium=safety-off -j$(nproc) -D__GNUC__ -D__CPPCHECK__ --suppressions-list=cppcheckpremium-suppressions --platform=unix64 --enable=style --premium=misra-c++-2023 --premium=cert-c++-2016 --inline-suppr lib --error-exitcode=0 --output-format=sarif 2> results.sarif
58+
cppcheckpremium/cppcheck --premium-license-file=cppcheck-premium-git.lic --premium=safety-off -j$(nproc) -D__GNUC__ -D__CPPCHECK__ --suppressions-list=cppcheckpremium-suppressions --platform=unix64 --enable=style --premium=misra-c++-2023 --premium=cert-c++-2016 --inline-suppr lib --error-exitcode=0 --output-format=sarif 2> results.sarif
5759
5860
- name: Cat results
5961
run: |

‎AUTHORS‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ Cary Converse
8585
Cary R
8686
Caspar Kielwein
8787
Changkyoon Kim
88+
Chencheng Mao
8889
Chris Lalancette
8990
Christian Ehrlicher
9091
Christian Franke

‎Makefile‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@ $(libcppdir)/forwardanalyzer.o: lib/forwardanalyzer.cpp lib/analyzer.h lib/astut
615615
$(libcppdir)/fwdanalysis.o: lib/fwdanalysis.cpp lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/fwdanalysis.h lib/library.h lib/mathlib.h lib/platform.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/vfvalue.h
616616
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/fwdanalysis.cpp
617617

618-
$(libcppdir)/importproject.o: lib/importproject.cpp externals/picojson/picojson.h externals/tinyxml2/tinyxml2.h lib/checkers.h lib/config.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h
618+
$(libcppdir)/importproject.o: lib/importproject.cpp externals/picojson/picojson.h externals/tinyxml2/tinyxml2.h lib/checkers.h lib/config.h lib/filesettings.h lib/importproject.h lib/json.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/utils.h lib/xml.h
619619
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/importproject.cpp
620620

621621
$(libcppdir)/infer.o: lib/infer.cpp lib/calculate.h lib/config.h lib/errortypes.h lib/infer.h lib/mathlib.h lib/smallvector.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/valueptr.h lib/vfvalue.h
@@ -819,7 +819,7 @@ test/testfunctions.o: test/testfunctions.cpp lib/check.h lib/checkers.h lib/chec
819819
test/testgarbage.o: test/testgarbage.cpp lib/check.h lib/checkers.h lib/checks.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/smallvector.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h
820820
$(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testgarbage.cpp
821821

822-
test/testimportproject.o: test/testimportproject.cpp externals/tinyxml2/tinyxml2.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.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 lib/xml.h test/fixture.h test/redirect.h
822+
test/testimportproject.o: test/testimportproject.cpp lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.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 test/redirect.h
823823
$(CXX) ${INCLUDE_FOR_TEST} ${CFLAGS_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testimportproject.cpp
824824

825825
test/testincompletestatement.o: test/testincompletestatement.cpp lib/check.h lib/checkers.h lib/checkimpl.h lib/checkother.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/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h

‎cli/filelister.cpp‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,10 @@ std::string FileLister::addFiles(std::list<FileWithDetails> &files, const std::s
168168
if (path.empty())
169169
return "no path specified";
170170

171+
const std::string::size_type nulPos = path.find('\0');
172+
if (nulPos != std::string::npos)
173+
return "path '" + path.substr(0, nulPos) + "' contains a NUL character";
174+
171175
std::list<FileWithDetails> filesSorted;
172176

173177
std::string err = addFiles2(filesSorted, path, extra, recursive, ignored, debug);
@@ -285,6 +289,10 @@ std::string FileLister::addFiles(std::list<FileWithDetails> &files, const std::s
285289
if (path.empty())
286290
return "no path specified";
287291

292+
const std::string::size_type nulPos = path.find('\0');
293+
if (nulPos != std::string::npos)
294+
return "path '" + path.substr(0, nulPos) + "' contains a NUL character";
295+
288296
std::string corrected_path = path;
289297
if (endsWith(corrected_path, '/'))
290298
corrected_path.erase(corrected_path.end() - 1);

‎cppcheckpremium-suppressions‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11

22
# open source warnings are handled by the selfcheck.yml
3+
knownConditionTrueFalse
34
noExplicitConstructor
45
postfixOperator
56
shadowFunction
7+
uninitMemberVarNoCtor
68
useStlAlgorithm
79
normalCheckLevelMaxBranches
810

@@ -19,8 +21,20 @@ premium-cert-int36-c
1921

2022
# too picky
2123
premium-cert-arr30-c
24+
premium-cert-ctr50-cpp
25+
premium-cert-dcl06-c
26+
premium-cert-dcl51-cpp
27+
premium-cert-exp20-c
28+
premium-cert-exp34-c
29+
premium-cert-int13-c
30+
premium-cert-int30-c
31+
premium-cert-int31-c
2232
premium-cert-int32-c
33+
premium-cert-pre05-c
34+
premium-cert-pre12-c
2335
premium-cert-str34-c
36+
premium-cert-str53-cpp
37+
2438

2539
# we intentionally pass structs
2640
premium-cert-dcl39-c-*

‎lib/astutils.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1554,7 +1554,7 @@ bool isUsedAsBool(const Token* const tok, const Settings& settings)
15541554
return true;
15551555
if (parent->isCast())
15561556
return !Token::simpleMatch(parent->astOperand1(), "dynamic_cast") && isUsedAsBool(parent, settings);
1557-
if (Token::Match(parent, "==|!=") && tok->valueType() && tok->valueType()->pointer &&
1557+
if (Token::Match(parent, "==|!=") && ((tok->valueType() && tok->valueType()->pointer) || tok->function()) &&
15581558
tok->astSibling()->hasKnownIntValue() && tok->astSibling()->getKnownIntValue() == 0)
15591559
return true;
15601560
if (parent->str() == "(" && astIsRHS(tok) && Token::Match(parent->astOperand1(), "if|while"))

‎lib/checkclass.cpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1425,11 +1425,11 @@ void CheckClassImpl::privateFunctions()
14251425
}
14261426
}
14271427

1428-
void CheckClassImpl::unusedPrivateFunctionError(const Token* tok1, const Token *tok2, const std::string &classname, const std::string &funcname)
1428+
void CheckClassImpl::unusedPrivateFunctionError(const Token* tokImpl, const Token *tokDef, const std::string &classname, const std::string &funcname)
14291429
{
1430-
std::list<const Token *> toks{ tok1 };
1431-
if (tok2)
1432-
toks.push_front(tok2);
1430+
std::list<const Token *> toks{ tokDef };
1431+
if (tokDef != tokImpl)
1432+
toks.push_back(tokImpl);
14331433
reportError(toks, Severity::style, "unusedPrivateFunction", "$symbol:" + classname + "::" + funcname + "\nUnused private function: '$symbol'", CWE398, Certainty::normal);
14341434
}
14351435

‎lib/checkclass.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ class CPPCHECKLIB CheckClassImpl : public CheckImpl {
186186
void uninitVarError(const Token *tok, const std::string &classname, const std::string &varname);
187187
void missingMemberCopyError(const Token *tok, FunctionType functionType, const std::string& classname, const std::string& varname);
188188
void operatorEqVarError(const Token *tok, const std::string &classname, const std::string &varname, bool inconclusive);
189-
void unusedPrivateFunctionError(const Token *tok1, const Token *tok2, const std::string &classname, const std::string &funcname);
189+
void unusedPrivateFunctionError(const Token *tokImpl, const Token *tokDef, const std::string &classname, const std::string &funcname);
190190
void memsetError(const Token *tok, const std::string &memfunc, const std::string &classname, const std::string &type, bool isContainer = false);
191191
void memsetErrorReference(const Token *tok, const std::string &memfunc, const std::string &type);
192192
void memsetErrorFloat(const Token *tok, const std::string &type);

0 commit comments

Comments
 (0)