All Projects → lyxell → logifix

lyxell / logifix

Licence: BSD-2-Clause license
Fixing static analysis violations in Java source code using Datalog

Programming Languages

C++
36643 projects - #6 most used programming language
CMake
9771 projects
shell
77523 projects
python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to logifix

GenPat
This is an automated transformation inference tool that leverages a big code corpus to guide the abstraction of transformation patterns.
Stars: ✭ 19 (+11.76%)
Mutual labels:  program-repair, program-transformation
sonar-css-plugin
SonarQube CSS / SCSS / Less Analyzer
Stars: ✭ 46 (+170.59%)
Mutual labels:  static-analysis
phantom-types
Phantom types for Python.
Stars: ✭ 120 (+605.88%)
Mutual labels:  static-analysis
php-codesniffer-sniffs
Custom sniffs for PHP_CodeSniffer
Stars: ✭ 16 (-5.88%)
Mutual labels:  static-analysis
dmn-check
A tool which performs static analyses on Decision Model Notation (DMN) files to detect bugs
Stars: ✭ 34 (+100%)
Mutual labels:  static-analysis
adelaide
The SECBIT Static Analysis Extension to Solidity Compiler
Stars: ✭ 16 (-5.88%)
Mutual labels:  static-analysis
cmake-init
The missing CMake project initializer
Stars: ✭ 1,071 (+6200%)
Mutual labels:  static-analysis
vim-phpstan
A Vim plugin for PHPStan - https://github.com/phpstan/phpstan. It calls `phpstan` to do static analysis of your PHP code and displays the errors in Vim's quickfix list.
Stars: ✭ 26 (+52.94%)
Mutual labels:  static-analysis
Scalpel
Scalpel: The Python Static Analysis Framework
Stars: ✭ 176 (+935.29%)
Mutual labels:  static-analysis
go-perfguard
CPU-guided performance analyzer for Go
Stars: ✭ 58 (+241.18%)
Mutual labels:  static-analysis
phpstan-wordpress
WordPress extensions for PHPStan ⛏️
Stars: ✭ 182 (+970.59%)
Mutual labels:  static-analysis
phpstan-phpspec
PhpSpec extension for PHPStan
Stars: ✭ 19 (+11.76%)
Mutual labels:  static-analysis
Fortran-Tools
Fortran compilers, preprocessors, static analyzers, transpilers, IDEs, build systems, etc.
Stars: ✭ 31 (+82.35%)
Mutual labels:  static-analysis
bismon
persistent monitor (for static source code analysis, GCC based)
Stars: ✭ 45 (+164.71%)
Mutual labels:  static-analysis
gqlanalysis
gqlanalysis makes easy to develop static analysis tools for GraphQL in Go.
Stars: ✭ 36 (+111.76%)
Mutual labels:  static-analysis
lints
Lint all your JavaScript, CSS, HTML, Markdown and Dockerfiles with a single command
Stars: ✭ 14 (-17.65%)
Mutual labels:  static-analysis
PHPDoctor
🏥 PHPDoctor: Check files, full directories or strings for missing or bad PHPDoc types.
Stars: ✭ 54 (+217.65%)
Mutual labels:  static-analysis
kcc
A Small C Compiler
Stars: ✭ 18 (+5.88%)
Mutual labels:  static-analysis
save-cloud
Cluster-based cloud mechanism for running SAVE framework
Stars: ✭ 30 (+76.47%)
Mutual labels:  static-analysis
nestif
Detect deeply nested if statements in Go source code
Stars: ✭ 30 (+76.47%)
Mutual labels:  static-analysis

Logifix

Logifix

Logifix is a Datalog-based tool for automatically fixing static analysis violations in Java source code. Logifix can be used to fix static analysis violations for static analyzers such as SonarQube, PMD or SpotBugs, but also to modernize legacy code or even to automatically enforce custom rules specific to your code base.

Demo

demo.mp4

Getting started

1. Install

Prebuilt and dependency-free binaries are provided for macOS and GNU-based Linux systems.

Ubuntu/Debian
curl -L https://github.com/lyxell/logifix/releases/latest/download/logifix-x86_64-linux-gnu.gz | gunzip -c - > /tmp/logifix
chmod +x /tmp/logifix
sudo mv /tmp/logifix /usr/local/bin
macOS
curl -L https://github.com/lyxell/logifix/releases/latest/download/logifix-x86_64-macos.gz | gunzip -c - > /tmp/logifix
chmod +x /tmp/logifix
sudo mv /tmp/logifix /usr/local/bin

2. Run

  • Run logifix path/to/your/project in your terminal, run logifix --help to get help

What is Logifix?

Logifix is an analysis-guided rewrite system for Java source code. This means that you define (or use predefined) analyses and transformations that all work together to improve your code. The analyses and transformations are written in the highly declarative logic-based language Datalog and are combined and chained automatically by the rewrite engine.

Features

Intelligent equational reasoning

Logifix is more than a search-and-replace system. It performs rewrites in multiple steps and can achieve intelligent equational reasoning by building articulation points in the rewrite graph.

Speed

Logifix is implemented in a high-performance Datalog dialect that is synthesized into multi-threaded C++ code. It is heavily parallelized even when working on a single file and usually analyzes large projects of thousands of files in a few seconds on modern hardware. If your project is slow to analyze it is considered a bug and you should file a bug report.

Mergeability

Logifix is engineered to produce human-like patches that are ready-to-merge by design without requiring manual modifications.

Examples

Here is a few examples of patches generated by Logifix.

Fix inefficient iteration over Map#keySet

  public static void sign(String token, Map<String, String> params) {
      List<String> list = new ArrayList();
      String tokenClientSlat = "";
-     for (String key : params.keySet()) {
+     for (Map.Entry<String, String> entry : params.entrySet()) {
+         String key = entry.getKey();
          if (key.equals("token_client_salt")) {
-             tokenClientSlat = params.get(key);
+             tokenClientSlat = entry.getValue();
          }
-         String paramString = key + "=" + params.get(key);
+         String paramString = key + "=" + entry.getValue();
          list.add(paramString);
      }
      Collections.sort(list);

Simplify code using try-with-resources

          continue;
      } 
-     try {
-         JarFile nextJarFile = new JarFile(absNextFile);
-         try {
-             Attributes attrs = getMainAttrs(nextJarFile);
-             Set<Extension> newExtensions = getReferencedExtensions(attrs);
-             result.addAll(newExtensions);
-             filesToProcess.addAll(extensionsToFiles(newExtensions));
-         } finally {
-             nextJarFile.close();
-         }
+     try (JarFile nextJarFile = new JarFile(absNextFile)) {
+         Attributes attrs = getMainAttrs(nextJarFile);
+         Set<Extension> newExtensions = getReferencedExtensions(attrs);
+         result.addAll(newExtensions);
+         filesToProcess.addAll(extensionsToFiles(newExtensions));
      } catch (Exception e) {
          invalidLibPaths.append(nextFile.getPath()).append(" ");
      }

Simplify code using Map::computeIfAbsent

  private final Map<Class<?>, String> requestQueueNameCache = new ConcurrentHashMap<>();
     
  public String getRequestQueueName(Class<?> remoteInterface) {
-     String str = requestQueueNameCache.get(remoteInterface);
-     if (str == null) {
-         str = "{" + name + ":" + remoteInterface.getName() + "}";
-         requestQueueNameCache.put(remoteInterface, str);
-     }
-     return str;
+     return requestQueueNameCache.computeIfAbsent(remoteInterface, k -> "{" + name + ":" + k.getName() + "}");
  }

Simplify code using streams

  @Override
  public List<SpoonFile> getAllJavaFiles() {
-     List<SpoonFile> result = new ArrayList<>();
-
-     for (SpoonFile f : getAllFiles()) {
-         if (f.isJava()) {
-             result.add(f);
-         }
-     }
-
-     return result;
+     return getAllFiles().stream().filter(SpoonFile::isJava).collect(Collectors.toList());
  } 

FAQ

Where can I find the predefined transformations?

See docs/predefined-transformations.md or the source code src/rules.

Can I create my own transformations?

Yes! See docs/creating-your-own-transformations.md.

How do I build from source?

See docs/building.md.

Related projects

If you find this project interesting, be sure to check out these as well:

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].