CLinters 1.3.5

Creator: codyrutscher

Last updated:

Add to Cart

Description:

CLinters 1.3.5

pre-commit hooks



This is a pre-commit hooks repo that
integrates two C/C++ code formatters:

clang-format,
uncrustify,

and five C/C++ static code analyzers:

clang-tidy,
oclint,
cppcheck,
cpplint,
include-what-you-use

This repo's hooks do more than passthrough arguments to provide these features:

Relay correct pass/fail to pre-commit, even when some commands exit 0 when they should not. Some versions of oclint, clang-tidy, and cppcheck have this behavior.
Honor -- arguments, which pre-commit has problems with
Optionally enforce a command version so your team gets code formatted/analyzed the same way
Formatters clang-format and uncrustify will error with diffs of what has changed

Example Usage
With this err.c
#include <stdio.h>
int main(){int i;return;}

and using this .pre-commit-config.yaml:
fail_fast: false
repos:
- repo: https://github.com/pocc/pre-commit-hooks
rev: master
hooks:
- id: clang-format
args: [--style=Google]
- id: clang-tidy
- id: oclint
- id: uncrustify
- id: cppcheck
- id: cpplint
- id: include-what-you-use

All seven linters should fail on commit with these messages.
Full text is at media/all_failed.txt.

clang-format error (indentation)
clang-format.............................................................Failed
- hook id: clang-format
- exit code: 1

err.c
====================
--- original

+++ formatted

@@ -1,3 +1,6 @@

#include <stdio.h>
-int main(){int i;return;}
+int main() {
+ int i;
+ return;
+}




clang-tidy error (non-void main should return a value)
clang-tidy...............................................................Failed
- hook id: clang-tidy
- exit code: 1

/tmp/temp/err.c:2:18: error: non-void function 'main' should return a value [clang-diagnostic-return-type]
int main(){int i;return;}
^
1 error generated.
Error while processing /tmp/temp/err.c.
Found compiler error(s).




oclint error (non-void main should return a value)
oclint...................................................................Failed
- hook id: oclint
- exit code: 6

Compiler Errors:
(please be aware that these errors will prevent OCLint from analyzing this source code)

/tmp/temp/err.c:2:18: non-void function 'main' should return a value

Clang Static Analyzer Results:

/tmp/temp/err.c:2:18: non-void function 'main' should return a value


OCLint Report

Summary: TotalFiles=0 FilesWithViolations=0 P1=0 P2=0 P3=0


[OCLint (https://oclint.org) v21.05]




uncrustify error (indentation)
uncrustify...............................................................Failed
- hook id: uncrustify
- exit code: 1

err.c
====================
--- original

+++ formatted

@@ -1,3 +1,5 @@

#include <stdio.h>
-int main(){int i;return;}
+int main(){
+ int i; return;
+}




cppcheck error (unused variable i)
cppcheck.................................................................Failed
- hook id: cppcheck
- exit code: 1

err.c:2:16: style: Unused variable: i [unusedVariable]
int main(){int i;return;}
^




cpplint error (no copyright message, bad whitespace)
cpplint..................................................................Failed
- hook id: cpplint
- exit code: 1

Done processing err.c
Total errors found: 4
err.c:0: No copyright message found. You should have a line: "Copyright [year] <Copyright Owner>" [legal/copyright] [5]
err.c:2: More than one command on the same line [whitespace/newline] [0]
err.c:2: Missing space after ; [whitespace/semicolon] [3]
err.c:2: Missing space before { [whitespace/braces] [5]




include-what-you-use error (remove unused #include )
include-what-you-use.....................................................Failed
- hook id: include-what-you-use
- exit code: 3

err.c:2:18: error: non-void function 'main' should return a value [-Wreturn-type]
int main(){int i;return;}
^

err.c should add these lines:

err.c should remove these lines:
- #include <stdio.h> // lines 1-1

The full include-list for err.c:
---



Note that for your config yaml, you can supply your own args or remove the args line entirely,
depending on your use case.
You can also clone this repo and then run the test_repo to see all of the linters at work to produce this output,
git clone https://github.com/pocc/pre-commit-hooks
cd pre-commit-hooks/tests/test_repo
git init
pre-commit install
pre-commit run

Using this repo
Special flags in this repo
There are 2 flags, --version and --no-diff that can be added to args: for a pre-commit hook.
They will be removed and not be passed on to the command.
Some linters change behavior between versions. To enforce a linter version
8.0.0, for example, add --version=8.0.0 to args: for that linter. Note that
this is a pre-commit hook arg and will be filtered before args are passed to the linter.
You can add --no-diff to the args: for clang-format and uncrustify
if you would like there to be no diff output for these commands.
Default Options
These options are automatically added to enable all errors or are required.

oclint: ["-enable-global-analysis", "-enable-clang-static-analyzer", "-max-priority-3", "0"]
uncrustify: ["-c", "defaults.cfg", "-q"] (options added, and a defaults.cfg generated, if -c is missing)
cppcheck: ["-q" , "--error-exitcode=1", "--enable=all", "--suppress=unmatchedSuppression", "--suppress=missingIncludeSystem", "--suppress=unusedFunction"] (See https://github.com/pocc/pre-commit-hooks/pull/30)
cpplint: ["--verbose=0"]

If any of these options are supplied in args:, they will override the above defaults (use -<flag>=<option> if possible when overriding).
Compilation Database
clang-tidy and oclint both expect a
compilation database.
Both of the hooks for them will ignore the error for not having one.
You can generate with one cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON <dir> if you
have a cmake-based project.
Information about the Commands
Python3.6+ is required to use these hooks as all 5 invoking scripts are written in it.
As this is also the minimum version of pre-commit, this should not be an issue.
Installation
You will need to install these utilities in order to use them. Your package
manager may already have them. Below are the package names for each package manager, if available:

apt install clang clang-format clang-tidy uncrustify cppcheck iwyu [1] [2]
yum install llvm uncrustify cppcheck iwyu [2]
brew install llvm oclint uncrustify cppcheck include-what-you-use [3]
choco install llvm uncrustify cppcheck inlcude-what-you-use [4]

cpplint can be installed everywhere with pip install cpplint.
[1]: clang is a required install for clang-format or clang-tidy to work.
[2]: oclint takes a couple hours to compile. I've compiled and tarred
oclint-v0.15
for those using linux who want to skip the wait (built on Ubuntu-18.04).
You can also download the older oclint-v0.13.1
for linux from oclint's github page (see releases).
[3]: Depending on your brew installation, you may need to install
oclint with brew cask install oclint.
[4]: oclint is not available on windows.
If your package manager is not listed here, it will have similar names for these tools.
You can build all of these from source.
Hook Info



Hook Info
Type
Languages




clang-format
Formatter
C, C++, ObjC, ObjC++, Java


clang-tidy
Static code analyzer
C, C++, ObjC


oclint
Static code analyzer
C, C++, ObjC


uncrustify
Formatter
C, C++, C#, ObjC, D, Java, Pawn, Vala


cppcheck
Static code analyzer
C, C++


cpplint
Style checker
C, C++


include-what-you-use
Static code analyzer
C, C++



Hook Option Comparison



Hook Options
Fix In Place
Enable all Checks
Set key/value




clang-format
-i




clang-tidy
--fix-errors [1]
-checks=* -warnings-as-errors=* [2]



oclint

-enable-global-analysis -enable-clang-static-analyzer -max-priority-3 0 [3]
-rc=<key>=<value>


uncrustify
--replace --no-backup [4]

--set key=value


cppcheck

-enable=all



cpplint

--verbose=0



include-what-you-use

--verbose=3




[1]: -fix will fail if there are compiler errors. -fix-errors will -fix
and fix compiler errors if it can, like missing semicolons.
[2]: Be careful with -checks=*. can have self-contradictory rules in newer versions of llvm (9+):
modernize wants to use trailing return type
but Fuchsia disallows it.
Thanks to @rambo.
[3]: The oclint pre-commit hook does the equivalent of -max-priority-3 0 by default, which returns an error code when any check fails.
See oclint error codes for more info on partially catching failed checks.
[4]: By definition, if you are using pre-commit, you are using version control.
Therefore, it is recommended to avoid needless backup creation by using --no-backup.
Development
See README_dev.md
Additional Resources
clang-format

Official Docs
clang-format
Guide -
a good overview and a great place to get started
clang-format Configurator - Website to
interactively design your config while
clang-format Options Explorer - Website to interactively
understand various options
Source Code

clang-tidy

Official Docs
clang-tidy
guide -
Good place to start
Example
usage -
Explanation of how to use clang-tidy by the creators of Kratos
Add your own
checks -
Function names must be awesome!
Source Code

oclint

Official Docs
Fastlane Integration
Source Code

uncrustify

Official Docs
Getting Started with Uncrustify
Source Code

cppcheck

Official Docs
Using Cppcheck
Source Code

cpplint

Google C++ style guide (basis of cpplint)
Source Code

include-what-you-use

Official Docs
Using include-what-you-use
Source Code

License
Apache 2.0

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.