RoLint is designed to be a robust and strict linter for robotics / embedded systems. It was originally developed for the Humanoid Robot Project at Worcester Polytechnic Institute. This Linter is designed with MISRA-C, MISRA-C++, PEP8, and The Power Of 10 Standards in mind. Below is how to install and use RoLint, as well as an overview of the rules for the linter.
RoLint is registtered on PyPi, and you can install it with
pip install rolint
This will install the RoLint linter. Additionally, you can install by cloning the github for the project at https://github.com/MaceTheWindu66/RoLint
rolint check [OPTIONS] [PATH] <-- Runs the linter on file[s] in specified path. rolint set-config [OPTIONS] <-- Changes configuration as specified in options. rolint show-config <-- Shows current configuration.
For C/C++, RoLint is to be ran on an uncompiled C/C++ file. RoLint is not built to run off of C/C++ binaries, however their text files. RoLint should be used in conjunction with a compiler for most effective results. The rules for common compilers and this linter have overlap, but cover slightly different areas.
When linting a specific file using the check command, options must be defined. These options define the language and output.
--lang c | cpp | python <-- Specifies language --output | json <-- Changes output format
--output-path -p | [PATH] <-- Overrides output path if output specified.rolint check --output json -p results.json main.c
RoLint comes with an override feature built in for all 3 languages.
" rolint: ignore" <-- Ignores the next line
" rolint: ignore-block" <-- Ignores a code block
For example, RoLint will ignore a for loop, and all of the code inside of the for loop, if rolint: ignore-block is commented immediately before the loop.
"// rolint: ignore"
"// rolint: ignore-block"
"# rolint: ignore"
"# rolint: ignore-block"
There are a lot of rules spanning over the 3 separate languages used for the original project that ROLINT was created for. These rules are primarily based on MIRSA C/C++, The Power of 10, and PEP8 Standards.
- Certain unsafe standard library functions are banned to ensure safe memory operations. The current list is:
gets, printf, fprintf, sprintf, vsprintf, strcpy, strncpy, strcat, strncat, scanf, sscanf, fscanf, strtok, atoi, atol, atof, atoll, setjmp, longjmp, malloc, calloc, free, realloc
- Only one variable can be declared per line.
- Variables must be initialized when declared.
int x; <-- NOT ALLOWED
int x = 5; <-- ALLOWED
- Variables MUST be used if declared.
- No global variables
- Side effects are not permitted inside function calls
EXAMPLE: printf(x++) <-- NOT ALLOWED
- No function-like macro definitions.
- No implicit conversions in variable declarations or assignments
int x = 3.14 <-- NOT ALLOWED
- No narrowing casts
Casting floats to ints, ints to shorts, etc.
- No casting between pointer and arithmetic types
- No recursion.
- No break/continue statements in a switch statement (unless in a for loop).
- Switch statements must have a default case.
- No goto calls or unchecked jumps.
- Header files must be guarded with an #ifndef statement.
- Object definitions in header files are not permitted.
- Unsafe standard library functions are banned, similar to C. Here is a list of the banned functions for C++:
malloc, calloc, realloc, free, printf, sprintf, scanf, gets, fgets, rand, srand, time, clock, gettimeofday, system, fork, exec, exit, va_start, va_arg, va_end, cin, cout, cerr, delete, new
- Switch statements cannot have implicit fallthroughs (use break or [[fallthrough]])
- Switch statements must have default statements
- No continue statements
- No uncontrolled jump statements, including goto
- No function like macros
- Code must follow PEP8 standards (flake8 used for PEP8 compliance checking).
- All variables must be declared with static type hints.
x : int = 5
- All functions must have a return annotation.
def func() -> int:
- All function parameters must have static type hints.
def func(x:int) -> int:
- Certain inherently unsafe python functions (with regards to external code execution) are banned. The current list is:
eval, exec, pickles
- Threads used from python threading module must be joined.
- Subprocesses must have a termination, wait, or communicate call to prevent zombie processes.