prg-titech / mutexunlock

Check sync.Mutex.Unlock is called before exit from a function
MIT License
0 stars 0 forks source link

Towards Interprocedural #10

Open Qs-F opened 2 years ago

Qs-F commented 2 years ago

まずは単純な例で考えてみる

一貫しているか? → どういうパスを通っても必ずlockされている → 他の関数呼び出しで追いかける必要がなくなる

Qs-F commented 2 years ago

Example

package main

import "sync"

type T1 struct {
  mu sync.Mutex
  n int
}

type T2 struct {
  mu sync.Mutex
  value float64
}

type T struct {
  t1 *T1
  t2 *T2
}

func (t *T) Lock() {
  t.t1.Lock()
  t.t2.Lock()
}

func (t *T) Unlock() {
  t.t2.Unlock()
  t.t1.Unlock()
}

func (t *T) DoCritical() {
  t.Lock()
  t.t1.n++
  t.t2.value *= 0.2
  t.Unlock()
}

func (t *T) DoCritical2(n int ) {
  t.Lock()
  if n == 0 {
    // t.t2.Unlock()
    return // missing unlock
  }
  t.t1.n = n
  t.t2.Unlock()

  if n == 0 {
    t.t1.Unlock()
    return
  }
  t.t1.Unlock()
}
Qs-F commented 2 years ago

goroutine 1つ1つについて見ていく

高階関数があると、難しくなる CHA? → 変数が値がとり得る値の集合 callgraph 相互依存

fという変数が具体的に取る値、どの関数になるか?を解析 ← これにはcallgraph goroutineの呼び出し時に関数がどのくらい渡されているか?

goroutineの使われ方を調べる

  1. 名前が同じなら呼ばれる可能性があるものとして扱う mutexだけの検査ならあまり気にすることではないかもという仮説