caarmen / network-monitor

A network monitor tool for Android that executes an http GET to google.com every x seconds and logs the results into a file.
74 stars 27 forks source link

external library may cause your capp crash. #108

Closed jay2013 closed 6 years ago

jay2013 commented 6 years ago

we notice that in your app codes, you use external library "net.sourceforge.streamsupport:streamsupport:1.5.6". In this library, method "long estimateSize()" in class "java8.util.DelegatingSpliterator" use "java.util.Spliterator" not "java8.util.Spliterator". However, "java.util.Spliterator" is added since level 24. So when your app run on level under 24 machine, it maybe crash.

there are several reachable path from your application to that method call. we list them below, please help to check.

all reachable paths: reachable path 1: --><ca.rmen.android.networkmonitor.app.service.NetMonService: void onDestroy()> --><java8.util.stream.ReferencePipeline$Head: void forEach(java8.util.function.Consumer)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOrderedTask: void (java8.util.stream.PipelineHelper,java8.util.Spliterator,java8.util.stream.Sink)> --><java8.util.DelegatingSpliterator: long estimateSize()> --> <java.util.Spliterator: long estimateSize()> reachable path 2: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.ReferencePipeline$Head: void forEach(java8.util.function.Consumer)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOrderedTask: void (java8.util.stream.PipelineHelper,java8.util.Spliterator,java8.util.stream.Sink)> --><java8.util.DelegatingSpliterator: long estimateSize()> --> <java.util.Spliterator: long estimateSize()> reachable path 3: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOrderedTask: void (java8.util.stream.PipelineHelper,java8.util.Spliterator,java8.util.stream.Sink)> --><java8.util.DelegatingSpliterator: long estimateSize()> --> <java.util.Spliterator: long estimateSize()> reachable path 4: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOrderedTask: void (java8.util.stream.PipelineHelper,java8.util.Spliterator,java8.util.stream.Sink)> --><java8.util.DelegatingSpliterator: long estimateSize()> --><java.util.Spliterator: long estimateSize()> reachable path 5: --><ca.rmen.android.networkmonitor.app.service.NetMonService: void onDestroy()> --><java8.util.stream.ReferencePipeline$Head: void forEach(java8.util.function.Consumer)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.concurrent.ForkJoinTask: java.lang.Object invoke()> --><java8.util.concurrent.ForkJoinTask: int doExec()> --><java8.util.concurrent.CountedCompleter: boolean exec()> --><java8.util.stream.ForEachOps$ForEachTask: void compute()> --><java8.util.DelegatingSpliterator: long estimateSize()> --><java.util.Spliterator: long estimateSize()> reachable path 6: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.ReferencePipeline$Head: void forEach(java8.util.function.Consumer)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.concurrent.ForkJoinTask: java.lang.Object invoke()> --><java8.util.concurrent.ForkJoinTask: int doExec()> --><java8.util.concurrent.CountedCompleter: boolean exec()> --><java8.util.stream.ForEachOps$ForEachTask: void compute()> --><java8.util.DelegatingSpliterator: long estimateSize()> --><java.util.Spliterator: long estimateSize()> reachable path 7: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.concurrent.ForkJoinTask: java.lang.Object invoke()> --><java8.util.concurrent.ForkJoinTask: int doExec()> --><java8.util.concurrent.CountedCompleter: boolean exec()> --><java8.util.stream.ForEachOps$ForEachTask: void compute()> --><java8.util.DelegatingSpliterator: long estimateSize()> --><java.util.Spliterator: long estimateSize()> reachable path 8: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ForEachOps$ForEachOp$OfRef: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.stream.ForEachOps$ForEachOp: java.lang.Void evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.concurrent.ForkJoinTask: java.lang.Object invoke()> --><java8.util.concurrent.ForkJoinTask: int doExec()> --><java8.util.concurrent.CountedCompleter: boolean exec()> --><java8.util.stream.ForEachOps$ForEachTask: void compute()> --><java8.util.DelegatingSpliterator: long estimateSize()> --><java.util.Spliterator: long estimateSize()> reachable path 9: --><ca.rmen.android.networkmonitor.app.service.NetMonService: void onDestroy()> --><java8.util.stream.ReferencePipeline$Head: void forEach(java8.util.function.Consumer)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ReduceOps$ReduceOp: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.concurrent.ForkJoinTask: java.lang.Object invoke()> --><java8.util.concurrent.ForkJoinTask: int doExec()> --><java8.util.concurrent.CountedCompleter: boolean exec()> --><java8.util.stream.ForEachOps$ForEachTask: void compute()> --><java8.util.DelegatingSpliterator: long estimateSize()> --><java.util.Spliterator: long estimateSize()> reachable path 10: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.ReferencePipeline$Head: void forEach(java8.util.function.Consumer)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ReduceOps$ReduceOp: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.concurrent.ForkJoinTask: java.lang.Object invoke()> --><java8.util.concurrent.ForkJoinTask: int doExec()> --><java8.util.concurrent.CountedCompleter: boolean exec()> --><java8.util.stream.ForEachOps$ForEachTask: void compute()> --><java8.util.DelegatingSpliterator: long estimateSize()> --><java.util.Spliterator: long estimateSize()> reachable path 11: --><ca.rmen.android.networkmonitor.provider.NetMonProvider: android.content.ContentProviderResult[] applyBatch(java.util.ArrayList)> --><java8.util.stream.ReferencePipeline: java.lang.Object collect(java8.util.stream.Collector)> --><java8.util.stream.ReferencePipeline: void forEach(java8.util.function.Consumer)> --><java8.util.stream.AbstractPipeline: java.lang.Object evaluate(java8.util.stream.TerminalOp)> --><java8.util.stream.ReduceOps$ReduceOp: java.lang.Object evaluateParallel(java8.util.stream.PipelineHelper,java8.util.Spliterator)> --><java8.util.concurrent.ForkJoinTask: java.lang.Object invoke()> --><java8.util.concurrent.ForkJoinTask: int doExec()> --><java8.util.concurrent.CountedCompleter: boolean exec()> --><java8.util.stream.ForEachOps$ForEachTask: void compute()> --><java8.util.DelegatingSpliterator: long estimateSize()> --> <java.util.Spliterator: long estimateSize()>

caarmen commented 6 years ago

Looks like they answered this in https://github.com/stefan-zobel/streamsupport/issues/1

jay2013 commented 6 years ago

Sorry for disturbing you. Our tool can only detect static bug and sometimes the reports are false positive.

caarmen commented 6 years ago

No worries. Good luck with the development of your tool :)