Logifix เป็นเครื่องมือที่ใช้ดาต้าล็อกสำหรับการแก้ไขการละเมิดการวิเคราะห์แบบคงที่โดยอัตโนมัติในซอร์สโค้ด Java Logifix สามารถใช้เพื่อแก้ไขการละเมิดการวิเคราะห์แบบคงที่สำหรับเครื่องวิเคราะห์แบบคงที่เช่น SonarQube, PMD หรือ SpotBugs แต่ยังเพื่อปรับปรุงรหัสมรดกหรือแม้กระทั่งเพื่อบังคับใช้กฎที่กำหนดเองโดยอัตโนมัติกับฐานรหัสของคุณ
มีการจัดเตรียมไบนารีที่สร้างไว้ล่วงหน้าและไม่มีการพึ่งพาสำหรับระบบ Linux ที่ใช้ MACOS และ GNU
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 ในเทอร์มินัลของคุณให้เรียกใช้ logifix --help เพื่อรับความช่วยเหลือ Logifix เป็นระบบการเขียนซ้ำสำหรับการวิเคราะห์สำหรับซอร์สโค้ด Java ซึ่งหมายความว่าคุณกำหนด (หรือใช้การวิเคราะห์ที่กำหนดไว้ล่วงหน้า) และการแปลงที่ทำงานร่วมกันเพื่อปรับปรุงรหัสของคุณ การวิเคราะห์และการแปลงถูกเขียนขึ้นใน Datalog ภาษาที่ใช้ตรรกะที่มีการเปิดเผยอย่างสูงและรวมกันและถูกล่ามโซ่โดยอัตโนมัติโดยเอ็นจิ้นการเขียนใหม่
Logifix เป็นมากกว่าระบบการค้นหาและแทนที่ มันดำเนินการเขียนซ้ำในหลายขั้นตอนและสามารถบรรลุการให้เหตุผลเชิงอนุรักษ์อัจฉริยะโดยการสร้างจุดที่เปล่งออกมาในกราฟการเขียนซ้ำ
Logifix ถูกนำไปใช้ในภาษาดาต้าล็อกประสิทธิภาพสูงที่สังเคราะห์เป็นรหัส C ++ แบบมัลติเธรด มันขนานกันอย่างหนักแม้ว่าจะทำงานกับไฟล์เดียวและมักจะวิเคราะห์โครงการขนาดใหญ่หลายพันไฟล์ในไม่กี่วินาทีในฮาร์ดแวร์ที่ทันสมัย หากโครงการของคุณช้าในการวิเคราะห์ถือว่าเป็นข้อผิดพลาดและคุณควรยื่นรายงานข้อผิดพลาด
Logifix ได้รับการออกแบบทางวิศวกรรมเพื่อผลิตแพตช์เหมือนมนุษย์ที่พร้อมใช้งานโดยการออกแบบโดยไม่ต้องมีการดัดแปลงด้วยตนเอง
นี่คือตัวอย่างบางส่วนของแพตช์ที่สร้างขึ้นโดย Logifix
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());
} ดูเอกสาร/การเปลี่ยนรูปแบบที่กำหนดไว้ล่วงหน้า MD หรือซอร์สโค้ด SRC/กฎ
ใช่! ดูเอกสาร/การสร้างการเปลี่ยนแปลงของคุณเอง
ดู docs/building.md
หากคุณพบว่าโครงการนี้น่าสนใจโปรดตรวจสอบสิ่งเหล่านี้ด้วย: