From 6352c3cf4871cc5dc2b063995b114b09a4b39ffb Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Tue, 14 Aug 2018 14:47:19 +0200 Subject: [PATCH 1/4] style-check/vera++: add RIOT vera++ files --- dist/tools/vera++/exclude | 0 dist/tools/vera++/profiles/riot | 7 ++ dist/tools/vera++/profiles/riot_force | 47 +++++++++ .../vera++/profiles/riot_force_params.txt | 2 + dist/tools/vera++/profiles/riot_params.txt | 1 + dist/tools/vera++/scripts/CMakeLists.txt | 2 + .../tools/vera++/scripts/rules/CMakeLists.txt | 3 + dist/tools/vera++/scripts/rules/DUMP.tcl | 13 +++ dist/tools/vera++/scripts/rules/F001.tcl | 22 +++++ dist/tools/vera++/scripts/rules/F002.tcl | 56 +++++++++++ dist/tools/vera++/scripts/rules/L001.tcl | 20 ++++ dist/tools/vera++/scripts/rules/L002.tcl | 14 +++ dist/tools/vera++/scripts/rules/L003.tcl | 17 ++++ dist/tools/vera++/scripts/rules/L004.tcl | 14 +++ dist/tools/vera++/scripts/rules/L005.tcl | 23 +++++ dist/tools/vera++/scripts/rules/L006.tcl | 11 +++ dist/tools/vera++/scripts/rules/T001.tcl | 13 +++ dist/tools/vera++/scripts/rules/T002.tcl | 99 +++++++++++++++++++ dist/tools/vera++/scripts/rules/T003.tcl | 48 +++++++++ dist/tools/vera++/scripts/rules/T004.tcl | 51 ++++++++++ dist/tools/vera++/scripts/rules/T005.tcl | 19 ++++ dist/tools/vera++/scripts/rules/T006.tcl | 21 ++++ dist/tools/vera++/scripts/rules/T007.tcl | 22 +++++ dist/tools/vera++/scripts/rules/T008.tcl | 18 ++++ dist/tools/vera++/scripts/rules/T009.tcl | 26 +++++ dist/tools/vera++/scripts/rules/T010.tcl | 11 +++ dist/tools/vera++/scripts/rules/T011.tcl | 51 ++++++++++ dist/tools/vera++/scripts/rules/T012.tcl | 12 +++ dist/tools/vera++/scripts/rules/T013.tcl | 16 +++ dist/tools/vera++/scripts/rules/T014.tcl | 16 +++ dist/tools/vera++/scripts/rules/T015.tcl | 49 +++++++++ dist/tools/vera++/scripts/rules/T016.tcl | 17 ++++ dist/tools/vera++/scripts/rules/T017.tcl | 23 +++++ dist/tools/vera++/scripts/rules/T018.tcl | 23 +++++ dist/tools/vera++/scripts/rules/T019.tcl | 39 ++++++++ .../scripts/transformations/CMakeLists.txt | 3 + .../scripts/transformations/move_includes.tcl | 24 +++++ .../scripts/transformations/move_macros.tcl | 22 +++++ .../transformations/move_namespace.tcl | 19 ++++ .../scripts/transformations/to_lower.tcl | 54 ++++++++++ .../vera++/scripts/transformations/to_xml.tcl | 26 +++++ .../scripts/transformations/to_xml2.tcl | 26 +++++ .../scripts/transformations/trim_right.tcl | 12 +++ 43 files changed, 1012 insertions(+) create mode 100644 dist/tools/vera++/exclude create mode 100644 dist/tools/vera++/profiles/riot create mode 100644 dist/tools/vera++/profiles/riot_force create mode 100644 dist/tools/vera++/profiles/riot_force_params.txt create mode 100644 dist/tools/vera++/profiles/riot_params.txt create mode 100644 dist/tools/vera++/scripts/CMakeLists.txt create mode 100644 dist/tools/vera++/scripts/rules/CMakeLists.txt create mode 100755 dist/tools/vera++/scripts/rules/DUMP.tcl create mode 100755 dist/tools/vera++/scripts/rules/F001.tcl create mode 100755 dist/tools/vera++/scripts/rules/F002.tcl create mode 100755 dist/tools/vera++/scripts/rules/L001.tcl create mode 100755 dist/tools/vera++/scripts/rules/L002.tcl create mode 100755 dist/tools/vera++/scripts/rules/L003.tcl create mode 100755 dist/tools/vera++/scripts/rules/L004.tcl create mode 100755 dist/tools/vera++/scripts/rules/L005.tcl create mode 100755 dist/tools/vera++/scripts/rules/L006.tcl create mode 100755 dist/tools/vera++/scripts/rules/T001.tcl create mode 100755 dist/tools/vera++/scripts/rules/T002.tcl create mode 100755 dist/tools/vera++/scripts/rules/T003.tcl create mode 100755 dist/tools/vera++/scripts/rules/T004.tcl create mode 100755 dist/tools/vera++/scripts/rules/T005.tcl create mode 100755 dist/tools/vera++/scripts/rules/T006.tcl create mode 100755 dist/tools/vera++/scripts/rules/T007.tcl create mode 100755 dist/tools/vera++/scripts/rules/T008.tcl create mode 100755 dist/tools/vera++/scripts/rules/T009.tcl create mode 100755 dist/tools/vera++/scripts/rules/T010.tcl create mode 100755 dist/tools/vera++/scripts/rules/T011.tcl create mode 100755 dist/tools/vera++/scripts/rules/T012.tcl create mode 100755 dist/tools/vera++/scripts/rules/T013.tcl create mode 100755 dist/tools/vera++/scripts/rules/T014.tcl create mode 100755 dist/tools/vera++/scripts/rules/T015.tcl create mode 100755 dist/tools/vera++/scripts/rules/T016.tcl create mode 100755 dist/tools/vera++/scripts/rules/T017.tcl create mode 100755 dist/tools/vera++/scripts/rules/T018.tcl create mode 100755 dist/tools/vera++/scripts/rules/T019.tcl create mode 100644 dist/tools/vera++/scripts/transformations/CMakeLists.txt create mode 100755 dist/tools/vera++/scripts/transformations/move_includes.tcl create mode 100755 dist/tools/vera++/scripts/transformations/move_macros.tcl create mode 100755 dist/tools/vera++/scripts/transformations/move_namespace.tcl create mode 100755 dist/tools/vera++/scripts/transformations/to_lower.tcl create mode 100755 dist/tools/vera++/scripts/transformations/to_xml.tcl create mode 100755 dist/tools/vera++/scripts/transformations/to_xml2.tcl create mode 100755 dist/tools/vera++/scripts/transformations/trim_right.tcl diff --git a/dist/tools/vera++/exclude b/dist/tools/vera++/exclude new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dist/tools/vera++/profiles/riot b/dist/tools/vera++/profiles/riot new file mode 100644 index 0000000000..1d8a2d5287 --- /dev/null +++ b/dist/tools/vera++/profiles/riot @@ -0,0 +1,7 @@ +#!/usr/bin/tclsh + +# L004: Line cannot be too long + +set rules { + L004 +} diff --git a/dist/tools/vera++/profiles/riot_force b/dist/tools/vera++/profiles/riot_force new file mode 100644 index 0000000000..b6b5d7834d --- /dev/null +++ b/dist/tools/vera++/profiles/riot_force @@ -0,0 +1,47 @@ +#!/usr/bin/tclsh + +# F001: Source files should not use the '\r' (CR) character +# L001: No trailing whitespace +# L002: Don't use tab characters +# L003: No leading and no trailing empty lines +# L004: Line cannot be too long +# L005: There should not be too many consecutive empty lines +# L006: Source file should not be too long +# T001: One-line comments should not have forced continuation +# T003: Some keywords should be followed by a single space +# T004: Some keywords should be immediately followed by a colon +# T005: Keywords break and continue should be immediately followed by a semicolon +# T006: Keywords return and throw should be immediately followed by a semicolon or a single space +# T007: Semicolons should not be isolated by spaces or comments from the rest of the code +# T008: Keywords catch, for, if and while should be followed by a single space +# T009: Comma should not be preceded by whitespace, but should be followed by one +# T010: Identifiers should not be composed of 'l' and 'O' characters only +# T013: Source files should contain the copyright notice +# T015: HTML links in comments and string literals should be correct +# T017: Unnamed namespaces are not allowed in header files +# T018: using namespace are not allowed in header files +# T019: control structures should have complete curly-braced block of code + +set rules { + F001 + L001 + L002 + L003 + L004 + L005 + L006 + T001 + T003 + T004 + T005 + T006 + T007 + T008 + T009 + T010 + T013 + T015 + T017 + T018 + T019 +} diff --git a/dist/tools/vera++/profiles/riot_force_params.txt b/dist/tools/vera++/profiles/riot_force_params.txt new file mode 100644 index 0000000000..d811c357f4 --- /dev/null +++ b/dist/tools/vera++/profiles/riot_force_params.txt @@ -0,0 +1,2 @@ +max-line-length=100 +max-consecutive-empty-lines=1 diff --git a/dist/tools/vera++/profiles/riot_params.txt b/dist/tools/vera++/profiles/riot_params.txt new file mode 100644 index 0000000000..94657145c9 --- /dev/null +++ b/dist/tools/vera++/profiles/riot_params.txt @@ -0,0 +1 @@ +max-line-length=80 diff --git a/dist/tools/vera++/scripts/CMakeLists.txt b/dist/tools/vera++/scripts/CMakeLists.txt new file mode 100644 index 0000000000..936ca417a6 --- /dev/null +++ b/dist/tools/vera++/scripts/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(rules) +add_subdirectory(transformations) diff --git a/dist/tools/vera++/scripts/rules/CMakeLists.txt b/dist/tools/vera++/scripts/rules/CMakeLists.txt new file mode 100644 index 0000000000..6e0aafacf2 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/CMakeLists.txt @@ -0,0 +1,3 @@ +file(GLOB_RECURSE srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *) +list(REMOVE_ITEM srcs CMakeLists.txt) +install(FILES ${srcs} DESTINATION lib/vera++/scripts/rules) diff --git a/dist/tools/vera++/scripts/rules/DUMP.tcl b/dist/tools/vera++/scripts/rules/DUMP.tcl new file mode 100755 index 0000000000..5047074e42 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/DUMP.tcl @@ -0,0 +1,13 @@ +#!/usr/bin/tclsh +foreach f [getSourceFileNames] { + puts "Tokens in file ${f}:" + foreach t [getTokens $f 1 0 -1 -1 {}] { + set value [lindex $t 0] + set line [lindex $t 1] + set column [lindex $t 2] + set name [lindex $t 3] + + puts "${line}/${column}\t${name}\t${value}" + } + puts "" +} diff --git a/dist/tools/vera++/scripts/rules/F001.tcl b/dist/tools/vera++/scripts/rules/F001.tcl new file mode 100755 index 0000000000..444dd22938 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/F001.tcl @@ -0,0 +1,22 @@ +#!/usr/bin/tclsh +# Source files should not use the '\r' (CR) character + +foreach fileName [getSourceFileNames] { + if { $fileName == "-" } { + # can't check the content from stdin + continue + } + set file [open $fileName "r"] + fconfigure $file -translation lf + set line [gets $file] + set lineCounter 1 + while {![eof $file]} { + set pos [string first "\r" $line] + if {$pos != -1 && $pos != [expr [string length $line] - 1]} { + report $fileName $lineCounter "\\r (CR) detected in isolation at position ${pos}" + } + set line [gets $file] + incr lineCounter + } + close $file +} diff --git a/dist/tools/vera++/scripts/rules/F002.tcl b/dist/tools/vera++/scripts/rules/F002.tcl new file mode 100755 index 0000000000..42f4cc2f5a --- /dev/null +++ b/dist/tools/vera++/scripts/rules/F002.tcl @@ -0,0 +1,56 @@ +#!/usr/bin/tclsh +# File names should be well-formed + +set maxDirectoryDepth [getParameter "max-directory-depth" 8] +set maxDirnameLength [getParameter "max-dirname-length" 31] +set maxFilenameLength [getParameter "max-filename-length" 31] +set maxPathLength [getParameter "max-path-length" 100] + +foreach fileName [getSourceFileNames] { + if {[string length $fileName] > $maxPathLength} { + report $fileName 1 "path name too long" + } + + set dirDepth 0 + foreach dir [file split [file dirname $fileName]] { + if {$dir == "/" || $dir == "." || $dir == ".."} { + continue + } + + incr dirDepth + + if {[string length $dir] > $maxDirnameLength} { + report $fileName 1 "directory name component too long" + break + } + + set first [string index $dir 0] + if {[string is alpha $first] == 0 && $first != "_"} { + report $fileName 1 "directory name should start with alphabetic character or underscore" + break + } + + if {[string first "." $dir] != -1} { + report $fileName 1 "directory name should not contain the dot" + break + } + } + + if {$dirDepth >= $maxDirectoryDepth} { + report $fileName 1 "directory structure too deep" + } + + set leafName [file tail $fileName] + if {[string length $leafName] > $maxFilenameLength} { + report $fileName 1 "file name too long" + } + + set first [string index $leafName 0] + if {[string is alpha $first] == 0 && $first != "_"} { + report $fileName 1 "file name should start with alphabetic character or underscore" + } + + if {[llength [split $leafName .]] > 2} { + report $fileName 1 "file name should not contain more than one dot" + } +} diff --git a/dist/tools/vera++/scripts/rules/L001.tcl b/dist/tools/vera++/scripts/rules/L001.tcl new file mode 100755 index 0000000000..43fe7baa96 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/L001.tcl @@ -0,0 +1,20 @@ +#!/usr/bin/tclsh +# No trailing whitespace + +set strictMode [getParameter "strict-trailing-space" 0] + +foreach f [getSourceFileNames] { + set lineNumber 1 + set previousIndent "" + foreach line [getAllLines $f] { + + if [regexp {^.*[[:space:]]+$} $line] { + if {$strictMode || [string trim $line] != "" || $line != $previousIndent} { + report $f $lineNumber "trailing whitespace" + } + } + + regexp {^([[:space:]]*).*$} $line dummy previousIndent + incr lineNumber + } +} diff --git a/dist/tools/vera++/scripts/rules/L002.tcl b/dist/tools/vera++/scripts/rules/L002.tcl new file mode 100755 index 0000000000..a5914cd70e --- /dev/null +++ b/dist/tools/vera++/scripts/rules/L002.tcl @@ -0,0 +1,14 @@ +#!/usr/bin/tclsh +# Don't use tab characters + +foreach f [getSourceFileNames] { + set lineNumber 1 + foreach line [getAllLines $f] { + + if [regexp {\t} $line] { + report $f $lineNumber "horizontal tab used" + } + + incr lineNumber + } +} diff --git a/dist/tools/vera++/scripts/rules/L003.tcl b/dist/tools/vera++/scripts/rules/L003.tcl new file mode 100755 index 0000000000..a38267dc8b --- /dev/null +++ b/dist/tools/vera++/scripts/rules/L003.tcl @@ -0,0 +1,17 @@ +#!/usr/bin/tclsh +# No leading and no trailing empty lines + +foreach f [getSourceFileNames] { + set lineCount [getLineCount $f] + if {$lineCount > 0} { + set firstLine [getLine $f 1] + if {[string trim $firstLine] == ""} { + report $f 1 "leading empty line(s)" + } + + set lastLine [getLine $f $lineCount] + if {[string trim $lastLine] == ""} { + report $f $lineCount "trailing empty line(s)" + } + } +} diff --git a/dist/tools/vera++/scripts/rules/L004.tcl b/dist/tools/vera++/scripts/rules/L004.tcl new file mode 100755 index 0000000000..fd5da0d4e0 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/L004.tcl @@ -0,0 +1,14 @@ +#!/usr/bin/tclsh +# Line cannot be too long + +set maxLength [getParameter "max-line-length" 100] + +foreach f [getSourceFileNames] { + set lineNumber 1 + foreach line [getAllLines $f] { + if {[string length $line] > $maxLength} { + report $f $lineNumber "line is longer than ${maxLength} characters" + } + incr lineNumber + } +} diff --git a/dist/tools/vera++/scripts/rules/L005.tcl b/dist/tools/vera++/scripts/rules/L005.tcl new file mode 100755 index 0000000000..2eeb4db20f --- /dev/null +++ b/dist/tools/vera++/scripts/rules/L005.tcl @@ -0,0 +1,23 @@ +#!/usr/bin/tclsh +# There should not be too many consecutive empty lines + +set maxEmptyLines [getParameter "max-consecutive-empty-lines" 2] + +foreach f [getSourceFileNames] { + set lineNumber 1 + set emptyCount 0 + set reported false + foreach line [getAllLines $f] { + if {[string trim $line] == ""} { + incr emptyCount + if {$emptyCount > $maxEmptyLines && $reported == "false"} { + report $f $lineNumber "too many consecutive empty lines" + set reported true + } + } else { + set emptyCount 0 + set reported false + } + incr lineNumber + } +} diff --git a/dist/tools/vera++/scripts/rules/L006.tcl b/dist/tools/vera++/scripts/rules/L006.tcl new file mode 100755 index 0000000000..e217dcc3b6 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/L006.tcl @@ -0,0 +1,11 @@ +#!/usr/bin/tclsh +# Source file should not be too long + +set maxLines [getParameter "max-file-length" 2000] + +foreach f [getSourceFileNames] { + set length [getLineCount $f] + if {$length > $maxLines} { + report $f $length "source file is too long" + } +} diff --git a/dist/tools/vera++/scripts/rules/T001.tcl b/dist/tools/vera++/scripts/rules/T001.tcl new file mode 100755 index 0000000000..7c594e701d --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T001.tcl @@ -0,0 +1,13 @@ +#!/usr/bin/tclsh +# One-line comments should not have forced continuation + +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {cppcomment}] { + set lineNumber [lindex $t 1] + set wholeLine [getLine $f $lineNumber] + + if {[string index $wholeLine end] == "\\"} { + report $f $lineNumber "line-continuation in one-line comment" + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T002.tcl b/dist/tools/vera++/scripts/rules/T002.tcl new file mode 100755 index 0000000000..ab6049404e --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T002.tcl @@ -0,0 +1,99 @@ +#!/usr/bin/tclsh +# Reserved names should not be used for preprocessor macros + +set keywords { + asm + auto + bool + break + case + catch + char + class + const + const_cast + continue + default + delete + goto + do + double + dynamic_cast + else + enum + explicit + export + extern + false + float + for + friend + if + inline + int + long + mutable + namespace + new + operator + private + protected + public + register + reinterpret_cast + return + short + signed + sizeof + static + static_cast + struct + switch + template + this + throw + true + try + typedef + typeid + typename + union + unsigned + using + virtual + void + volatile + wchar_t + while + + and + and_eq + bitand + bitor + compl + not + not_eq + or + or_eq + xor + xor_eq +} + +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {pp_define}] { + set lineNumber [lindex $t 1] + + set line [getLine $f $lineNumber] + set rest [string trimleft [string range $line \ + [expr [lindex $t 2] + [string length [lindex $t 0]]] end]] + set macroName [string range $rest 0 [expr [string wordend $rest 0] - 1]] + + if {([regexp {^_} $macroName] && [string is upper -strict [string index $macroName 1]]) || + [string first "__" $macroName] != -1} { + report $f $lineNumber "reserved name used for macro (incorrect use of underscore)" + } + if {[lsearch $keywords $macroName] != -1} { + report $f $lineNumber "reserved name used for macro (keyword or alternative token redefined)" + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T003.tcl b/dist/tools/vera++/scripts/rules/T003.tcl new file mode 100755 index 0000000000..fc258e7494 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T003.tcl @@ -0,0 +1,48 @@ +#!/usr/bin/tclsh +# Some keywords should be followed by a single space + +set keywords { + case + class + delete + enum + explicit + extern + goto + new + struct + union + using +} + +proc isKeyword {s} { + global keywords + return [expr [lsearch $keywords $s] != -1] +} + +set state "other" +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {}] { + set tokenValue [lindex $t 0] + set tokenName [lindex $t 3] + if {$state == "keyword"} { + if {$tokenName == "space" && $tokenValue == " "} { + set state "space" + } else { + report $f $lineNumber "keyword \'${keywordValue}\' not followed by a single space" + set state "other" + } + } elseif {$state == "space"} { + if {$tokenName == "newline"} { + report $f $lineNumber "keyword \'${keywordValue}\' not followed by a single space" + } + set state "other" + } else { + if [isKeyword $tokenName] { + set state "keyword" + set lineNumber [lindex $t 1] + set keywordValue [lindex $t 0] + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T004.tcl b/dist/tools/vera++/scripts/rules/T004.tcl new file mode 100755 index 0000000000..b70f5533f7 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T004.tcl @@ -0,0 +1,51 @@ +#!/usr/bin/tclsh +# Some keywords should be immediately followed by a colon + +set keywords { + default + private + protected + public +} + +proc isKeyword {s} { + global keywords + return [expr [lsearch $keywords $s] != -1] +} + +foreach f [getSourceFileNames] { + set lastKeywordLine 0 + set lastKeywordColumn 0 + set lastKeywordValue "" + set last "" + foreach t [getTokens $f 1 0 -1 -1 [concat $keywords colon]] { + set tokenValue [lindex $t 0] + set tokenName [lindex $t 3] + if {$tokenName == "colon"} { + if {$last == "keyword" && $lastKeywordLine != 0} { + set line [lindex $t 1] + set column [lindex $t 2] + if {$line != $lastKeywordLine || + $column != [expr $lastKeywordColumn + [string length $lastKeywordValue]]} { + set nonWhiteFound "false" + foreach tb [getTokens $f $lastKeywordLine [expr $lastKeywordColumn + 1] $line $column {}] { + set tbName [lindex $tb 3] + if {[lsearch {space newline ccomment cppcomment} $tbName] == -1} { + set nonWhiteFound "true" + break + } + } + if {$nonWhiteFound == "false"} { + report $f $line "colon not immediately after the \'$lastKeywordValue\' keyword" + } + } + } + set last "colon" + } else { + set lastKeywordLine [lindex $t 1] + set lastKeywordColumn [lindex $t 2] + set lastKeywordValue $tokenValue + set last "keyword" + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T005.tcl b/dist/tools/vera++/scripts/rules/T005.tcl new file mode 100755 index 0000000000..4112a6ec91 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T005.tcl @@ -0,0 +1,19 @@ +#!/usr/bin/tclsh +# Keywords break and continue should be immediately followed by a semicolon + +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {break continue}] { + set keyword [lindex $t 0] + set line [lindex $t 1] + set column [lindex $t 2] + set semicolons [getTokens $f $line [expr $column + [string length $keyword]] [expr $line + 1] 0 {semicolon}] + if {$semicolons == {}} { + report $f $line "keyword '${keyword}' not immediately followed by a semicolon" + } else { + set semColumn [lindex [lindex $semicolons 0] 2] + if {$semColumn != $column + [string length $keyword]} { + report $f $line "keyword '${keyword}' not immediately followed by a semicolon" + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T006.tcl b/dist/tools/vera++/scripts/rules/T006.tcl new file mode 100755 index 0000000000..b250c680e9 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T006.tcl @@ -0,0 +1,21 @@ +#!/usr/bin/tclsh +# Keywords return and throw should be immediately followed by a semicolon or a single space + +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {return throw}] { + set keyword [lindex $t 0] + set line [lindex $t 1] + set column [lindex $t 2] + set followingTokens [getTokens $f $line [expr $column + [string length $keyword]] [expr $line + 1] 0 {}] + if {$followingTokens == {}} { + report $f $line "keyword '${keyword}' not immediately followed by a semicolon or a single space" + } else { + set first [lindex [lindex $followingTokens 0] 0] + if {$first != ";" && $first != " "} { + if {!([llength $followingTokens] >= 2 && $keyword == "throw" && $first == "(" && [lindex [lindex $followingTokens 1] 0] == ")")} { + report $f $line "keyword '${keyword}' not immediately followed by a semicolon or a single space" + } + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T007.tcl b/dist/tools/vera++/scripts/rules/T007.tcl new file mode 100755 index 0000000000..25a542b71b --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T007.tcl @@ -0,0 +1,22 @@ +#!/usr/bin/tclsh +# Semicolons should not be isolated by spaces or comments from the rest of the code + +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {semicolon}] { + set line [lindex $t 1] + set column [lindex $t 2] + set previousTokens [getTokens $f $line 0 $line $column {}] + if {$previousTokens == {}} { + report $f $line "semicolon is isolated from other tokens" + } else { + set lastToken [lindex $previousTokens end] + set lastName [lindex $lastToken 3] + if {[lsearch {space ccomment} $lastName] != -1} { + set forTokens [getTokens $f $line 0 $line $column {for leftparen}] + if {[list [lindex [lindex $forTokens 0] 3] [lindex [lindex $forTokens 1] 3]] != {for leftparen}} { + report $f $line "semicolon is isolated from other tokens" + } + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T008.tcl b/dist/tools/vera++/scripts/rules/T008.tcl new file mode 100755 index 0000000000..cae63e6885 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T008.tcl @@ -0,0 +1,18 @@ +#!/usr/bin/tclsh +# Keywords catch, for, if and while should be followed by a single space + +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {catch for if switch while}] { + set keyword [lindex $t 0] + set line [lindex $t 1] + set column [lindex $t 2] + set followingTokens [getTokens $f $line [expr $column + [string length $keyword]] [expr $line + 1] -1 {}] + if {[llength $followingTokens] < 2} { + report $f $line "keyword '${keyword}' not followed by a single space" + } else { + if {[list [lindex [lindex $followingTokens 0] 0] [lindex [lindex $followingTokens 1] 0]] != [list " " "("]} { + report $f $line "keyword '${keyword}' not followed by a single space" + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T009.tcl b/dist/tools/vera++/scripts/rules/T009.tcl new file mode 100755 index 0000000000..cade4fd78b --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T009.tcl @@ -0,0 +1,26 @@ +#!/usr/bin/tclsh +# Comma should not be preceded by whitespace, but should be followed by one + +foreach f [getSourceFileNames] { + foreach t [getTokens $f 1 0 -1 -1 {comma}] { + set line [lindex $t 1] + set column [lindex $t 2] + set preceding [getTokens $f $line 0 $line $column {}] + if {$preceding == {}} { + report $f $line "comma should not be preceded by whitespace" + } else { + set lastPreceding [lindex [lindex $preceding end] 3] + if {$lastPreceding == "space"} { + report $f $line "comma should not be preceded by whitespace" + } + } + set following [getTokens $f $line [expr $column + 1] [expr $line + 1] -1 {}] + if {$following != {}} { + set firstFollowing [lindex [lindex $following 0] 3] + if {$firstFollowing != "space" && $firstFollowing != "newline" && + !($lastPreceding == "operator" && $firstFollowing == "leftparen")} { + report $f $line "comma should be followed by whitespace" + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T010.tcl b/dist/tools/vera++/scripts/rules/T010.tcl new file mode 100755 index 0000000000..05a0b44230 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T010.tcl @@ -0,0 +1,11 @@ +#!/usr/bin/tclsh +# Identifiers should not be composed of 'l' and 'O' characters only + +foreach file [getSourceFileNames] { + foreach t [getTokens $file 1 0 -1 -1 {identifier}] { + set value [lindex $t 0] + if [regexp {^(l|O)+$} $value] { + report $file [lindex $t 1] "identifier should not be composed of only 'l' and 'O'" + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T011.tcl b/dist/tools/vera++/scripts/rules/T011.tcl new file mode 100755 index 0000000000..4ff9e131b8 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T011.tcl @@ -0,0 +1,51 @@ +#!/usr/bin/tclsh +# Curly brackets from the same pair should be either in the same line or in the same column + +proc acceptPairs {} { + global file parens index end + + while {$index != $end} { + set nextToken [lindex $parens $index] + set tokenValue [lindex $nextToken 0] + + if {$tokenValue == "\{"} { + incr index + set leftParenLine [lindex $nextToken 1] + set leftParenColumn [lindex $nextToken 2] + + acceptPairs + + if {$index == $end} { + report $file $leftParenLine "opening curly bracket is not closed" + return + } + + set nextToken [lindex $parens $index] + incr index + set tokenValue [lindex $nextToken 0] + set rightParenLine [lindex $nextToken 1] + set rightParenColumn [lindex $nextToken 2] + + if {($leftParenLine != $rightParenLine) && ($leftParenColumn != $rightParenColumn)} { + # make an exception for line continuation + set leftLine [getLine $file $leftParenLine] + set rightLine [getLine $file $rightParenLine] + if {[string index $leftLine end] != "\\" && [string index $rightLine end] != "\\"} { + report $file $rightParenLine "closing curly bracket not in the same line or column" + } + } + } else { + return + } + } +} + +foreach file [getSourceFileNames] { + set parens [getTokens $file 1 0 -1 -1 {leftbrace rightbrace}] + set index 0 + set end [llength $parens] + acceptPairs + if {$index != $end} { + report $file [lindex [lindex $parens $index] 1] "excessive closing bracket?" + } +} diff --git a/dist/tools/vera++/scripts/rules/T012.tcl b/dist/tools/vera++/scripts/rules/T012.tcl new file mode 100755 index 0000000000..515102b8b0 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T012.tcl @@ -0,0 +1,12 @@ +#!/usr/bin/tclsh +# Negation operator should not be used in its short form + +foreach file [getSourceFileNames] { + foreach negation [getTokens $file 1 0 -1 -1 {not}] { + set value [lindex $negation 0] + if {$value == "!"} { + set lineNumber [lindex $negation 1] + report $file $lineNumber "negation operator used in its short form" + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T013.tcl b/dist/tools/vera++/scripts/rules/T013.tcl new file mode 100755 index 0000000000..6016e12ff4 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T013.tcl @@ -0,0 +1,16 @@ +#!/usr/bin/tclsh +# Source files should contain the copyright notice + +foreach file [getSourceFileNames] { + set found false + foreach comment [getTokens $file 1 0 -1 -1 {ccomment cppcomment}] { + set value [lindex $comment 0] + if {[string first "copyright" [string tolower $value]] != -1} { + set found true + break + } + } + if {$found == false} { + report $file 1 "no copyright notice found" + } +} diff --git a/dist/tools/vera++/scripts/rules/T014.tcl b/dist/tools/vera++/scripts/rules/T014.tcl new file mode 100755 index 0000000000..6b2a02dd18 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T014.tcl @@ -0,0 +1,16 @@ +#!/usr/bin/tclsh +# Source files should refer the Boost Software License + +foreach file [getSourceFileNames] { + set found false + foreach comment [getTokens $file 1 0 -1 -1 {ccomment cppcomment}] { + set value [lindex $comment 0] + if {[string first "Boost Software License" $value] != -1} { + set found true + break + } + } + if {$found == false} { + report $file 1 "no reference to the Boost Software License found" + } +} diff --git a/dist/tools/vera++/scripts/rules/T015.tcl b/dist/tools/vera++/scripts/rules/T015.tcl new file mode 100755 index 0000000000..cb484cedbb --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T015.tcl @@ -0,0 +1,49 @@ +#!/usr/bin/tclsh +# HTML links in comments and string literals should be correct + +set urlRe {<[[:space:]]*[^>]*[[:space:]]+(?:HREF|SRC)[[:space:]]*=[[:space:]]*\"([^\"]*)\"} + +foreach file [getSourceFileNames] { + foreach token [getTokens $file 1 0 -1 -1 {ccomment cppcomment stringlit}] { + set tokenValue [lindex $token 0] + if {[regexp -nocase $urlRe $tokenValue dummy link] == 1} { + + if {[string index $link 0] == "\#" || + [string first "mailto:" $link] == 0 || + [string first "http:" $link] == 0 || + [string first "https:" $link] == 0 || + [string first "ftp:" $link] == 0 || + [string first "news:" $link] == 0 || + [string first "javascript:" $link] == 0} { + continue + } + + set lineNumber [lindex $token 1] + + if {[string first "file:" $link] == 0} { + report $file $lineNumber "URL links to files are not allowed" + continue + } + + if {[regexp {[ \<\>\'\{\}\|\\\^\[\]]} $link] == 1} { + report $file $lineNumber "URL link contains illegal character(s)" + continue + } + + set plainLink $link + set pos [string first "\#" $link] + if {$pos != -1} { + set plainLink [string range $link 0 [expr $pos - 1]] + } + + if {[string first "\#" $link [expr $pos + 1]] != -1} { + report $file $lineNumber "URL link contains invalid bookmark" + } + + set completeLink [file join [file dirname $file] $plainLink] + if {[file isfile $completeLink] == 0} { + report $file $lineNumber "URL points to non-existing file" + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T016.tcl b/dist/tools/vera++/scripts/rules/T016.tcl new file mode 100755 index 0000000000..7103f69f19 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T016.tcl @@ -0,0 +1,17 @@ +#!/usr/bin/tclsh +# Calls to min/max should be protected against accidental macro substitution + +foreach file [getSourceFileNames] { + foreach identifier [getTokens $file 1 0 -1 -1 {identifier}] { + set value [lindex $identifier 0] + if {$value == "min" || $value == "max"} { + set lineNumber [lindex $identifier 1] + set columnNumber [expr [lindex $identifier 2] + [string length $value]] + set restOfLine [string range [getLine $file $lineNumber] $columnNumber end] + + if {[regexp {^[[:space:]]*\(} $restOfLine] == 1} { + report $file $lineNumber "min/max potential macro substitution problem" + } + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T017.tcl b/dist/tools/vera++/scripts/rules/T017.tcl new file mode 100755 index 0000000000..a45ed056e2 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T017.tcl @@ -0,0 +1,23 @@ +#!/usr/bin/tclsh +# Unnamed namespaces are not allowed in header files + +foreach fileName [getSourceFileNames] { + set extension [file extension $fileName] + if {[lsearch {.h .hh .hpp .hxx .ipp} $extension] != -1} { + + set state "start" + foreach token [getTokens $fileName 1 0 -1 -1 {namespace identifier leftbrace}] { + set type [lindex $token 3] + + if {$state == "namespace" && $type == "leftbrace"} { + report $fileName $namespaceLine "unnamed namespace not allowed in header file" + } + + if {$type == "namespace"} { + set namespaceLine [lindex $token 1] + } + + set state $type + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T018.tcl b/dist/tools/vera++/scripts/rules/T018.tcl new file mode 100755 index 0000000000..e706c6bd67 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T018.tcl @@ -0,0 +1,23 @@ +#!/usr/bin/tclsh +# using namespace are not allowed in header files + +foreach fileName [getSourceFileNames] { + set extension [file extension $fileName] + if {[lsearch {.h .hh .hpp .hxx .ipp} $extension] != -1} { + + set state "start" + foreach token [getTokens $fileName 1 0 -1 -1 {using namespace identifier}] { + set type [lindex $token 3] + + if {$state == "using" && $type == "namespace"} { + report $fileName $usingLine "using namespace not allowed in header file" + } + + if {$type == "using"} { + set usingLine [lindex $token 1] + } + + set state $type + } + } +} diff --git a/dist/tools/vera++/scripts/rules/T019.tcl b/dist/tools/vera++/scripts/rules/T019.tcl new file mode 100755 index 0000000000..7c87f076d7 --- /dev/null +++ b/dist/tools/vera++/scripts/rules/T019.tcl @@ -0,0 +1,39 @@ +#!/usr/bin/tclsh +# control structures should have complete curly-braced block of code + +foreach fileName [getSourceFileNames] { + + set state "start" + set prev "" + foreach token [getTokens $fileName 1 0 -1 -1 {for if while do leftparen rightparen leftbrace rightbrace semicolon}] { + set type [lindex $token 3] + + if {$state == "control"} { + if {$type == "leftparen"} { + incr parenCount + } elseif {$type == "rightparen"} { + incr parenCount -1 + if {$parenCount == 0} { + set state "expectedblock" + } + } + } elseif {$state == "expectedblock"} { + if {$type != "leftbrace"} { + set line [lindex $token 1] + report $fileName $line "full block {} expected in the control structure" + } + set state "block" + } + + if {$type == "for" || $type == "if"} { + set parenCount 0 + set state "control" + } elseif {$type == "do"} { + set state "expectedblock" + } elseif {$type == "while" && $prev != "rightbrace"} { + set parenCount 0 + set state "control" + } + set prev $type + } +} diff --git a/dist/tools/vera++/scripts/transformations/CMakeLists.txt b/dist/tools/vera++/scripts/transformations/CMakeLists.txt new file mode 100644 index 0000000000..f78a9c5d6d --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/CMakeLists.txt @@ -0,0 +1,3 @@ +file(GLOB_RECURSE srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *) +list(REMOVE_ITEM srcs CMakeLists.txt) +install(FILES ${srcs} DESTINATION lib/vera++/scripts/transformations) diff --git a/dist/tools/vera++/scripts/transformations/move_includes.tcl b/dist/tools/vera++/scripts/transformations/move_includes.tcl new file mode 100755 index 0000000000..7ff3df687d --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/move_includes.tcl @@ -0,0 +1,24 @@ +#!/usr/bin/tclsh +# change prefix of #include paths + +set oldPrefix "\"boost/" +set newPrefix "\"boom/" + +set oldPrefixLength [string length $oldPrefix] + +foreach fileName [getSourceFileNames] { + set tokens [getTokens $fileName 1 0 -1 -1 {}] + set newFile [open $fileName "w"] + foreach token $tokens { + set tokenValue [lindex $token 0] + set tokenType [lindex $token 3] + if {$tokenType == "pp_qheader"} { + set index [string first $oldPrefix $tokenValue] + if {$index != -1} { + set tokenValue [string replace $tokenValue $index [expr $index + $oldPrefixLength - 1] $newPrefix] + } + } + puts -nonewline $newFile $tokenValue + } + close $newFile +} diff --git a/dist/tools/vera++/scripts/transformations/move_macros.tcl b/dist/tools/vera++/scripts/transformations/move_macros.tcl new file mode 100755 index 0000000000..8598e28463 --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/move_macros.tcl @@ -0,0 +1,22 @@ +#!/usr/bin/tclsh +# change the prefix in all macros + +set oldPrefix "BOOST" +set newPrefix "BOOM" + +set oldPrefixLength [string length $oldPrefix] + +foreach fileName [getSourceFileNames] { + set tokens [getTokens $fileName 1 0 -1 -1 {}] + set newFile [open $fileName "w"] + foreach token $tokens { + set tokenValue [lindex $token 0] + set tokenType [lindex $token 3] + if {$tokenType == "identifier" && \ + [string compare -length $oldPrefixLength $oldPrefix $tokenValue] == 0} { + set tokenValue [string replace $tokenValue 0 [expr $oldPrefixLength - 1] $newPrefix] + } + puts -nonewline $newFile $tokenValue + } + close $newFile +} diff --git a/dist/tools/vera++/scripts/transformations/move_namespace.tcl b/dist/tools/vera++/scripts/transformations/move_namespace.tcl new file mode 100755 index 0000000000..1df18db51f --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/move_namespace.tcl @@ -0,0 +1,19 @@ +#!/usr/bin/tclsh +# change the namespace of all source files + +set oldNamespace "boost" +set newNamespace "boom" + +foreach fileName [getSourceFileNames] { + set tokens [getTokens $fileName 1 0 -1 -1 {}] + set newFile [open $fileName "w"] + foreach token $tokens { + set tokenValue [lindex $token 0] + set tokenType [lindex $token 3] + if {$tokenType == "identifier" && $tokenValue == $oldNamespace} { + set tokenValue $newNamespace + } + puts -nonewline $newFile $tokenValue + } + close $newFile +} diff --git a/dist/tools/vera++/scripts/transformations/to_lower.tcl b/dist/tools/vera++/scripts/transformations/to_lower.tcl new file mode 100755 index 0000000000..62cca0f3ea --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/to_lower.tcl @@ -0,0 +1,54 @@ +#!/usr/bin/tclsh +# transform indentifier names from CamelCase to standard_lower_case + +# this list contains exceptional mappings as pairs ?original new? + +set exceptions {SOMESpecialName some_special_name SOMEOTHER some_other} + +proc transformIdentifier {old} { + global exceptions + + if [string is lower $old] { + set new $old + } else { + set e [lsearch $exceptions $old] + if {$e != -1} { + set new [lindex $exceptions [expr $e + 1]] + } else { + set state "upper" + set new "" + for {set i 0} {$i != [string length $old]} {incr i} { + set c [string index $old $i] + if [string is upper $c] { + if {$state == "upper"} { + set new ${new}[string tolower $c] + } else { + set new ${new}_[string tolower $c] + set state "upper" + } + } else { + set new ${new}${c} + set state "lower" + } + } + } + } + + return $new +} + +foreach fileName [getSourceFileNames] { + set tokens [getTokens $fileName 1 0 -1 -1 {}] + set newFile [open $fileName "w"] + foreach t $tokens { + set tokenValue [lindex $t 0] + set tokenType [lindex $t 3] + if {$tokenType == "identifier"} { + set newToken [transformIdentifier $tokenValue] + } else { + set newToken $tokenValue + } + puts -nonewline $newFile $newToken + } + close $newFile +} diff --git a/dist/tools/vera++/scripts/transformations/to_xml.tcl b/dist/tools/vera++/scripts/transformations/to_xml.tcl new file mode 100755 index 0000000000..6aa7959fee --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/to_xml.tcl @@ -0,0 +1,26 @@ +#!/usr/bin/tclsh +# transform the source file into XML file + +foreach f [getSourceFileNames] { + set outFileName "${f}.xml" + set outFile [open $outFileName "w"] + puts $outFile "" + puts $outFile "" + foreach t [getTokens $f 1 0 -1 -1 {}] { + set value [lindex $t 0] + set line [lindex $t 1] + set column [lindex $t 2] + set name [lindex $t 3] + + if {$value == "\n"} { + set value "!\[CDATA\[\n\]]" + } else { + set value [regsub -all "&" $value {\&}] + set value [regsub -all "<" $value {\<}] + set value [regsub -all ">" $value {\>}] + } + puts $outFile " ${value}" + } + puts $outFile "" + close $outFile +} diff --git a/dist/tools/vera++/scripts/transformations/to_xml2.tcl b/dist/tools/vera++/scripts/transformations/to_xml2.tcl new file mode 100755 index 0000000000..19faa27ead --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/to_xml2.tcl @@ -0,0 +1,26 @@ +#!/usr/bin/tclsh +# transform the source file into XML file (another variant) + +foreach f [getSourceFileNames] { + set outFileName "${f}.xml" + set outFile [open $outFileName "w"] + puts $outFile "" + puts $outFile "" + foreach t [getTokens $f 1 0 -1 -1 {}] { + set value [lindex $t 0] + set line [lindex $t 1] + set column [lindex $t 2] + set name [lindex $t 3] + + if {$value == "\n"} { + set value "!\[CDATA\[\n\]]" + } else { + set value [regsub -all "&" $value {\&}] + set value [regsub -all "<" $value {\<}] + set value [regsub -all ">" $value {\>}] + } + puts $outFile " <${name} line=\"${line}\" column=\"${column}\">${value}" + } + puts $outFile "" + close $outFile +} diff --git a/dist/tools/vera++/scripts/transformations/trim_right.tcl b/dist/tools/vera++/scripts/transformations/trim_right.tcl new file mode 100755 index 0000000000..63f3825199 --- /dev/null +++ b/dist/tools/vera++/scripts/transformations/trim_right.tcl @@ -0,0 +1,12 @@ +#!/usr/bin/tclsh +# trim each line by removing trailing whitespace + +foreach fileName [getSourceFileNames] { + set lines [getAllLines $fileName] + set newFile [open $fileName "w"] + foreach line $lines { + set newLine [string trimright $line] + puts $newFile $newLine + } + close $newFile +} From 6057d1fba91b8d214c571a447b8dc65f81ec2791 Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Tue, 14 Aug 2018 15:53:28 +0200 Subject: [PATCH 2/4] vera++: add check.sh script --- dist/tools/vera++/check.sh | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 dist/tools/vera++/check.sh diff --git a/dist/tools/vera++/check.sh b/dist/tools/vera++/check.sh new file mode 100755 index 0000000000..ff1e830dfd --- /dev/null +++ b/dist/tools/vera++/check.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Copyright 2018 Jose Ignacio Alamos +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. + +RIOTBASE=$(git rev-parse --show-toplevel) +CURDIR=$(cd "$(dirname "$0")" && pwd) +: "${QUIET:=0}" +: "${WARNING:=1}" + +. "$RIOTBASE"/dist/tools/ci/changed_files.sh +FILEREGEX='\.([CcHh]|[ch]pp)$' +EXCLUDE='^(.+/vendor/)' +FILES=$(FILEREGEX=${FILEREGEX} EXCLUDE=${EXCLUDE} changed_files) + +if [ -z "${FILES}" ]; then + exit 0 +fi + +PARAMS="" +if [ $QUIET -eq 1 ]; then + _QUIET="--quiet" +fi + +VERA_CMD="vera++ --root $CURDIR --exclusions $CURDIR/exclude $_QUIET" + +if [ $WARNING -ne 0 ]; then + echo "$FILES" | $VERA_CMD --profile riot \ + --parameters $CURDIR/profiles/riot_params.txt | sed 's/^/warning: /g' +fi + +echo "$FILES" | $VERA_CMD --profile riot_force \ + --parameters $CURDIR/profiles/riot_force_params.txt --error From c455efba36203096ef52fc7e2ab258db89383dbd Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Tue, 14 Aug 2018 15:53:42 +0200 Subject: [PATCH 3/4] vera++: add README file --- dist/tools/vera++/README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 dist/tools/vera++/README.md diff --git a/dist/tools/vera++/README.md b/dist/tools/vera++/README.md new file mode 100644 index 0000000000..2455dd3315 --- /dev/null +++ b/dist/tools/vera++/README.md @@ -0,0 +1,30 @@ +## Overview + +Vera++ is a programmable tool for verification, analysis and transformation of +C++ source code. Vera++ is mainly an engine that parses C++ source files and +presents the result of this parsing to scripts in the form of various +collections - the scripts are actually performing the requested tasks. + +## Rules + +Rules can be added in the `rules` folder. The default rules from Vera++ were +added. However, it's possible to implement new rules in TCL. See +https://bitbucket.org/verateam/vera/wiki/Rules for information about the +available rules. + +# Profiles + +A `riot_force` profile was made for describing the set of applied rules as well as +special parameters. A `riot` profile includes all rules that should be treated as +warnings. In case new rules are added, they can be updated for both profiles under +`profiles` folder. + +## Example usage +Check style for all changed files changed in current branch: + check.sh + +Check all changed files and don't display the results (only exit code): + QUIET=1 check.sh + +Don't display the warnings + WARNING=0 check.sh From d0b13281d8539dda242b75a52036811be05d9b02 Mon Sep 17 00:00:00 2001 From: Jose Alamos Date: Tue, 4 Sep 2018 11:33:13 +0200 Subject: [PATCH 4/4] ci: invoke vera++ from CI --- dist/tools/ci/build_and_test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/tools/ci/build_and_test.sh b/dist/tools/ci/build_and_test.sh index a4c3f18b35..633e880c3f 100755 --- a/dist/tools/ci/build_and_test.sh +++ b/dist/tools/ci/build_and_test.sh @@ -89,6 +89,7 @@ then run ./dist/tools/doccheck/check.sh run ./dist/tools/externc/check.sh run ./dist/tools/cppcheck/check.sh + run ./dist/tools/vera++/check.sh run ./dist/tools/pr_check/pr_check.sh ${CI_BASE_BRANCH} run ./dist/tools/coccinelle/check.sh run ./dist/tools/flake8/check.sh