Extendable Clang AST based c/c++ linter
Project description
EXCAL - Extendable Clang AST based Linter.
WARNING: This project is still in an early stage. Currently working Plugins may not be supported in future versions.
This is a simple project implementing a C/C++ linter based on the clang AST. The main porpoise is to create a tool which is easily extendable via plugins.
The focus of this project is to provide a tool for the implementation of custom C/C++ coding guidelines. There are no rules provided by the linter itself, rather a toolset to implement your own. (see Plugins)
Installation
In order to use excal you need to have clang installed on your system.
This tool is available on PyPI so you can install it via pip:
pip install excal
Usage
To Analyze a file or project the tool expects input files/directories. Additionally you should provide all includes. If no Includes are given Clang will still create an AST, however it will be incomplete and may cause false positives/negatives from the linter.
excal -f path/to/file_to_analyze.c -i path/to/includes/
A list of all supported options:
Command | arguments | Description |
---|---|---|
-a | List of compiler arguments | provide compiler arguments for Clang, may improve the AST |
–argfile | File | Compiler arguments may be provided in a File, seperated by newlines |
-i | List of files/directories | Include Files used by the compiler to build the AST |
-f (required) | List of files/directories | Files/Directories to analyze. |
-e | List of files/directories | Files/Directories within given directories, which should be ignored. |
-p | - | If this flag is provided the Linter will print the AST of all included files. This is useful for creating Plugins. |
-ptt | - | Same as above, but will also Print all Tokens under their corresponding AST Nodes. (will produce long output) |
-cpp | - | Libclang will analyze files based on their extension. If the extension is not cpp specific (eg. .h instead .hpp) this flag will force all files to be analyzed as c++ code. |
-ext | List of file extensions | If provided only files with the given extensions will be parsed. |
-c | Cache AST files. | AST files will be saved in a .excal directory of the project base. If the file content did not change, they will be reloaded. This will save time when reanalyzing Big projects with only a few files changing or If new rules are added. |
Config files
If a single directory is given as input, excal will scan its root for a setup.cfg file. Here some project parameters may be provided. At the moment only the options given in belows example are being used, additional ones will be added.
[EXCAL]
includes =
/opt/ros/foxy/include/
exclude_files =
file/to/exclude.c
files/to/exclude/
**/venv
force_cpp = True
Plugins
The Goal of this project is to provide an interface that allows it to easily implement linter rules based on an AST.
A Plugin will need to provide a register method in which it will register itself within the Project. The Plugin then can provide a class inherits from the NodeVisitor class. Here the visit_X functions can be overwritten. When parsing the AST, these functions will be called whenever a desired Node is reached. From there further operations may be done on the provided AstNode.
See the following example:
from visitor import NodeVisitor
from pluginManager import PluginManager
from astNode import AstNode
PLUGIN_NAME = "AutonomusReply"
class customVisitor(NodeVisitor):
def __init__(self) -> None:
super().__init__()
def visit_class_base(self, node: AstNode) -> None:
return
def register(pm: PluginManager):
pm.register(PLUGIN_NAME, customVisitor)
There are two ways to provide Plugins. The preferred one is to Create as a standalone python Package. See this example.
The other way is to put the Plugin in the plugins folder and register it in the plugins.json file.
{
"plugins": ["plugins.myPlugin"]
}
All possible functions can be seen in src/visitor.py. To see which function may be needed for your use-cases run the excal project using the -p flag. This will print an AST of the desired file.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file excal-0.0.19.tar.gz
.
File metadata
- Download URL: excal-0.0.19.tar.gz
- Upload date:
- Size: 25.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.63.0 importlib-metadata/4.11.3 keyring/18.0.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d54558a738e760a5cc01a40048ca39fcebf1e3058fc281ed7dac58995dede41e |
|
MD5 | 702ba227c71d602007c674498502874f |
|
BLAKE2b-256 | 5fe63380283df5ca5a74d8f2b0ab12fc222f2761ed54f1c900a880488e54f19f |
File details
Details for the file excal-0.0.19-py3-none-any.whl
.
File metadata
- Download URL: excal-0.0.19-py3-none-any.whl
- Upload date:
- Size: 25.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.63.0 importlib-metadata/4.11.3 keyring/18.0.1 rfc3986/2.0.0 colorama/0.4.4 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e56d0ac844a7f082d14961fe23f1b263da8a32d1c4db163f6e352b761f858fde |
|
MD5 | 263b5a070f2cdcb9b35b21b7e056b40a |
|
BLAKE2b-256 | ade080602d5db8fceece09eac2ec7745a6d8ef3ded454c42da20dd797b07ee7e |