Logifix는 Java 소스 코드에서 정적 분석 위반을 자동으로 수정하기위한 Datalog 기반 도구입니다. Logifix는 Sonarqube, PMD 또는 SpotBugs와 같은 정적 분석기의 정적 분석 위반을 수정하는 데 사용될 수 있지만 레거시 코드를 현대화하거나 코드 기반에 맞는 사용자 정의 규칙을 자동으로 시행하는 데 사용할 수 있습니다.
MACOS 및 GNU 기반 Linux 시스템에는 미리 빌드 및 종속성이 바이너리가 제공됩니다.
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 소스 코드를위한 분석 유도 재 작성 시스템입니다. 즉, 코드를 개선하기 위해 모두 함께 작동하는 분석 및 변환을 정의 (또는 사전 정의 된) 분석 및 사용한다는 것을 의미합니다. 분석 및 변환은 고도로 선언적인 논리 기반 언어 데이터 로그로 작성되며 재 작성 엔진에 의해 자동으로 결합되고 묶여 있습니다.
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());
} DOCS/PRECTERED-TRANSFORMATION.MD 또는 소스 코드 SRC/RULE을 참조하십시오.
예! 문서/생성-트랜스 포맷 .md를 참조하십시오.
문서/building.md를 참조하십시오.
이 프로젝트가 흥미로워지면이 프로젝트도 확인하십시오.