Betrachten Sie die folgende JUnit-Testklasse:
Code: Select all
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import java.lang.Integer;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
public class MyTest {
private void dummyTest() {
new Memory(1024 * 9);
}
@Test
public void find() {
List list = new ArrayList();
list.add(new Integer(1));
list.stream().map(arg -> {
Pointer ptr = new Memory(1024 * 1024);
return ptr;
}).toArray(Pointer[]::new);
}
@Test
public void test001() {
dummyTest();
}
// [91 more identical tests named test002...test092 follow]
Code: Select all
echo -e "leak:libjvm\nleak:libjli\nleak:libz\nleak:liblcms\nleak:liblcms2\nleak:libjavalcms\nleak:libawt\n" >> lsan.supp
export LD_PRELOAD="/usr/lib/llvm-17/lib/clang/17/lib/linux/libclang_rt.asan-x86_64.so"
export ASAN_OPTIONS="handle_segv=0"
export LSAN_OPTIONS="suppressions="$(pwd)"/lsan.supp:print_suppressions=0"
./gradlew clean test
Code: Select all
Direct leak of 1048576 byte(s) in 1 object(s) allocated from:
#0 0x759245cfb372 in malloc (/usr/lib/llvm-17/lib/clang/17/lib/linux/libclang_rt.asan-x86_64.so+0xfb372) (BuildId: 91f375f2a48c6b133a56d8cc059d017ae5de4982)
#1 0x7592316185e6 ()
#2 0x759231607bcf ()
#3 0x759231607bcf ()
#4 0x7592316080f5 ()
#5 0x759231607e3f ()
#6 0x75923197befb ()
SUMMARY: AddressSanitizer: 1048576 byte(s) leaked in 1 allocation(s).
- ArrayList, stream und toArray entfernen und Pointer[] ptrs = new direkt erstellen Zeiger[1]; ptrs[0] = new Memory(1024 * 1024); lässt den Leckbericht verschwinden
- Durch die Reduzierung der Anzahl der Dummy-Tests verschwindet der Leckbericht, abhängig von der genauen Anzahl
- Das Ändern der Namen der Tests kann dazu führen, dass der Leckbericht ebenfalls verschwindet
Es könnte auch mit der von JUnit festgelegten Reihenfolge der Tests zusammenhängen. Das ist die einzige Erklärung, die mir einfällt, warum Namen von Tests wichtig sind.
Ich habe ein vollständiges Repo erstellt, um diesen Fehler bequem zu reproduzieren, indem ich run.sh aufrufe. Alle relevanten Informationen und der Code werden in diese Frage kopiert.
Meine Frage hier ist: Was genau verursacht diesen speziellen Leckbericht?