Logifix ist ein datalog-basiertes Tool zum automatischen Fixieren der statischen Analyseverstöße im Java-Quellcode. Logifix kann verwendet werden, um statische Analyseverstöße für statische Analysegeräte wie Sonarqube, PMD oder Spotbugs zu beheben, aber auch um den Legacy -Code zu modernisieren oder automatisch benutzerdefinierte Regeln durchzusetzen, die für Ihre Codebasis spezifisch sind.
Für MacOS- und GNU-basierte Linux-Systeme werden vorgebaute und abhängig freie Binärdateien bereitgestellt.
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/bincurl -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/binlogifix path/to/your/project in Ihrem Terminal aus, führen Sie logifix --help aus, um Hilfe zu erhalten Logifix ist ein analyse geführtes Umschreibungssystem für Java-Quellcode. Dies bedeutet, dass Sie vordefinierte Analysen und Transformationen definieren (oder verwenden), die alle zusammenarbeiten, um Ihren Code zu verbessern. Die Analysen und Transformationen werden im hoch deklarativen logikbasierten Sprachdatalog geschrieben und automatisch von der Umschreiben-Engine kombiniert und verkettet.
Logifix ist mehr als ein Such- und Replace-System. Es führt Umschreiber in mehreren Schritten durch und kann intelligentes Gleichungsingeniezen durch Erstellen von Artikulationspunkten in der Umschreiben -Grafik erreichen.
Logifix wird in einem Hochleistungs-Datalog-Dialekt implementiert, der in Multi-Threaded-C ++-Code synthetisiert wird. Es ist stark parallelisiert, auch wenn es an einer einzelnen Datei arbeitet, und analysiert normalerweise große Projekte von Tausenden von Dateien in wenigen Sekunden auf moderne Hardware. Wenn Ihr Projekt nur langsam analysiert, wird es als Fehler angesehen und Sie sollten einen Fehlerbericht einreichen.
Logifix ist so konstruiert, dass sie menschlichähnliche Patches produzieren, die durch Design bereit sind, ohne manuelle Änderungen zu erfordern.
Hier sind einige Beispiele für Patches, die von Logifix erzeugt werden.
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); 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(" ");
} 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() + "}");
} @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());
} Siehe DOCs/Vordefinierte Transformationen.MD oder den Quellcode SRC/Regeln.
Ja! Siehe DOCS/CREATE-Your-Own-Transformations.md.
Siehe Docs/Building.md.
Wenn Sie dieses Projekt interessant finden, schauen Sie sich diese auch an: