Permalink
Browse files

implement custom cppcheck rules

I recently noticed there were several invocations of `wcwidth()` that should
have been `fish_wcwidth()`. This adds custom cppcheck rules to detect that
mistake.
  • Loading branch information...
1 parent e6d4ac5 commit dc58edd521942c0a5a42541d5b5c39b09c226665 @krader1961 krader1961 committed Jun 18, 2016
Showing with 21 additions and 1 deletion.
  1. +18 −0 .cppcheck.rule
  2. +2 −0 CONTRIBUTING.md
  3. +1 −1 build_tools/lint.fish
View
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<rule version="1">
+ <pattern> wcwidth \(</pattern>
+ <message>
+ <id>wcwidthForbidden</id>
+ <severity>warning</severity>
+ <summary>Always use fish_wcwidth rather than wcwidth.</summary>
+ </message>
+</rule>
+
+<rule version="1">
+ <pattern> wcswidth \(</pattern>
+ <message>
+ <id>wcswidthForbidden</id>
+ <severity>warning</severity>
+ <summary>Always use fish_wcswidth rather than wcswidth.</summary>
+ </message>
+</rule>
View
@@ -30,6 +30,8 @@ Ultimately we want lint free code. However, at the moment a lot of cleanup is re
To make linting the code easy there are two make targets: `lint` and `lint-all`. The latter does just what the name implies. The former will lint any modified but not committed `*.cpp` files. If there is no uncommitted work it will lint the files in the most recent commit.
+Fish has custom cppcheck rules in the file `.cppcheck.rule`. These help catch mistakes such as using `wcwidth()` rather than `fish_wcwidth()`. Please add a new rule if you find similar mistakes being made.
+
### Dealing With Lint Warnings
You are strongly encouraged to address a lint warning by refactoring the code, changing variable names, or whatever action is implied by the warning.
@@ -92,7 +92,7 @@ if set -q c_files[1]
# The stderr to stdout redirection is because cppcheck, incorrectly IMHO, writes its
# diagnostic messages to stderr. Anyone running this who wants to capture its output will
# expect those messages to be written to stdout.
- cppcheck -q --verbose --std=posix --std=c11 --language=c++ --template "[{file}:{line}]: {severity} ({id}): {message}" --suppress=missingIncludeSystem --inline-suppr --enable=$cppchecks $cppcheck_args $c_files 2>&1
+ cppcheck -q --verbose --std=posix --std=c11 --language=c++ --template "[{file}:{line}]: {severity} ({id}): {message}" --suppress=missingIncludeSystem --inline-suppr --enable=$cppchecks --rule-file=.cppcheck.rule $cppcheck_args $c_files 2>&1
@floam
floam Jun 18, 2016 Member

Also, I believe --std=c11 is not necessary here (or we should also add --std=c++11?)

C++11 and C11 are the defaults. The only non-default --std we need to add is posix.

@krader1961
krader1961 Jun 18, 2016 Member

I don't now recall why I added --std=c11. I deliberately did not add --std=c++11 because the code isn't supposed to be using constructs legal in that standard but not earlier standards.

@floam
floam Jun 18, 2016 edited Member

Well, --std=c++11 is in effect unless you use --std=c++03 AFAICT. But given that we use some C++11 constructs/behavior and seem to be on our way to outing ourselves as C++11 officially, I'd say it's preferable that we are getting "forward looking" feedback.

end
if type -q oclint

3 comments on commit dc58edd

@floam
Member
floam commented on dc58edd Jun 18, 2016 edited

Why do we have two places with cppcheck commands in fish script? (d77c20b?)

@krader1961
Member

Good question. I hadn't noticed the cppcheck.sh script when I embarked on writing the more ambitious lint.fish script. I'd say remove it but since @ridiculousfish just updated it presumably he finds it useful.

@floam
Member
floam commented on dc58edd Jun 18, 2016 edited

I'd suggest if we don't remove it, we update that to use our preferences and call that from here. Could use argv to give it some further options specific to the Make usage - it may be useful for people integrating it with other tools. I know nothing is expecting our template or stderr getting bubkis.

Please sign in to comment.