Reports runBlocking builders that can be reached from coroutines.

Coroutines share threads for execution. When a runBlocking builder is called from a coroutine it blocks the underlying thread and prevents other coroutines from using this resource. This can result in performance issues and in bad cases thread starvation.

It provides a potential callstack from coroutine primitive (suspend function or builder) to runBlocking builder.

Example:


  suspend fun main() {
      foo() 
   }

  fun foo() {
      runBlocking { suspendFunction() }
  }

Potential solution:


  suspend fun main() {
      foo() 
   }

  suspend fun foo() {
      suspendFunction()
  }

Use the explore functions with overrides option to configure analysis for virtual functions: