На днях Facebook выпустил новую утилиту для статического анализа кода на Java/C.
Не смог пройти мимо, решил натравить его на ServerAccess .
В целом, делается это довольно тривиально: качаем, запускаем…
ahitrin@ahitrin:~/projects/ServerAccess$ ./gradlew clean
:clean
BUILD SUCCESSFUL
Total time : 2.756 secs
Если не сделать clean
, то ленивый Gradle ничего не будет компилировать, и Infer не найдёт никаких ошибок.
А после очистки сразу что-то нашёл!
ahitrin@ahitrin:~/projects/ServerAccess$ ~/opt/infer-linux64-v0.1.0/infer/infer/bin/infer -- ./gradlew build
Starting analysis ( Infer version v0.1.0)
Analysis done
77 files analyzed
/home/ahitrin/projects/ServerAccess/src/main/java/ru/naumen/servacc/HTTPProxy.java:96: error: RESOURCE_LEAK
resource acquired by call to accept() at line 95 is not released after line 96
/home/ahitrin/projects/ServerAccess/src/main/java/ru/naumen/servacc/HTTPProxy.java:99: error: RESOURCE_LEAK
resource acquired by call to ServerSocket( ...) at line 92 is not released after line 99
/home/ahitrin/projects/ServerAccess/src/main/java/ru/naumen/servacc/settings/PropertiesFile.java:56: error: RESOURCE_LEAK
resource acquired by call to FileOutputStream( ...) at line 52 is not released after line 56
/home/ahitrin/projects/ServerAccess/src/main/java/ru/naumen/servacc/settings/PropertiesFile.java:60: error: RESOURCE_LEAK
resource acquired by call to FileOutputStream( ...) at line 52 is not released after line 60
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:34: error: RESOURCE_LEAK
resource acquired by call to FileWriter( ...) at line 32 is not released after line 34
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:46: error: RESOURCE_LEAK
resource acquired by call to FileReader( ...) at line 40 is not released after line 46
Завёл баг , буду на досуге копаться.
Что бы ещё теперь проверить?
UDP : а вот ещё что обнаружилось…
Оказывается, что, в отличие от других средств анализа (FindBugs, PMD,..) у infer есть интересный режим работы: показ целого трейса, где происходит утечка.
Это что-то новенькое!
ahitrin@ahitrin:~/projects/ServerAccess$ ~/opt/infer-linux64-v0.1.0/infer/infer/bin/inferTraceBugs --select 4 --max-level max
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:34: error: RESOURCE_LEAK
resource acquired by call to FileWriter( ...) at line 32 is not released after line 34
Showing all 5 steps of the trace
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:29: start of procedure write( ...)
27 public class FileUtils
28 {
29 > public static void write( File file, String contents) throws IOException
30 {
31 file.createNewFile() ;
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:31:
29 public static void write( File file, String contents) throws IOException
30 {
31 > file.createNewFile() ;
32 PrintWriter writer = new PrintWriter( new FileWriter( file)) ;
33 writer.print( contents) ;
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:32:
30 {
31 file.createNewFile() ;
32 > PrintWriter writer = new PrintWriter( new FileWriter( file)) ;
33 writer.print( contents) ;
34 writer.flush() ;
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:33:
31 file.createNewFile() ;
32 PrintWriter writer = new PrintWriter( new FileWriter( file)) ;
33 > writer.print( contents) ;
34 writer.flush() ;
35 }
/home/ahitrin/projects/ServerAccess/src/test/java/ru/naumen/servacc/test/settings/FileUtils.java:34:
32 PrintWriter writer = new PrintWriter( new FileWriter( file)) ;
33 writer.print( contents) ;
34 > writer.flush() ;
35 }
36
Безусловно, проект ещё сырой (на большом рабочем проекте он позорно помер), но приёмчики работы у него интересные.
Глядишь, что-то полезное и вырастет в итоге.