CONTEXT-SENSITIVE CORRELATION ANALYSIS FOR DETECTING RACES
Polyvios Pratikakis Jeff Foster Michael Hicks University of Maryland, College Park
Context-sensitive Correlation Analysis for Detecting Races – p.1/??
Data Races are Bad Race: two threads access memory without - - PowerPoint PPT Presentation
C ONTEXT - SENSITIVE C ORRELATION A NALYSIS FOR D ETECTING R ACES Polyvios Pratikakis Jeff Foster Michael Hicks University of Maryland, College Park Context-sensitive Correlation Analysis for Detecting Races p.1/ ?? Data Races are Bad
Context-sensitive Correlation Analysis for Detecting Races – p.1/??
Context-sensitive Correlation Analysis for Detecting Races – p.2/??
Context-sensitive Correlation Analysis for Detecting Races – p.3/??
Context-sensitive Correlation Analysis for Detecting Races – p.4/??
Context-sensitive Correlation Analysis for Detecting Races – p.5/??
Context-sensitive Correlation Analysis for Detecting Races – p.6/??
pthread mutex t L1 = ...; int x; // &x: int* void munge(pthread mutex t *l, int * p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x);
Context-sensitive Correlation Analysis for Detecting Races – p.7/??
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x);
munge
Context-sensitive Correlation Analysis for Detecting Races – p.8/??
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x);
munge
Context-sensitive Correlation Analysis for Detecting Races – p.8/??
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x);
munge
Context-sensitive Correlation Analysis for Detecting Races – p.8/??
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x);
munge ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.8/??
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x);
munge ⊲ ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.8/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x); munge(&L2, &y); munge(&L2, &z);
munge ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x); munge(&L2, &y); munge(&L2, &z);
munge ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x); munge(&L2, &y); munge(&L2, &z);
munge ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge(&L1, &x); munge(&L2, &y); munge(&L2, &z);
munge ⊲ ⊲ ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge1(&L1, &x); munge2(&L2, &y); munge3(&L2, &z);
munge ⊲ (1 (1)1 (1 (1)1
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge1(&L1, &x); munge2(&L2, &y); munge3(&L2, &z);
munge ⊲ (1 (1)1 ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge1(&L1, &x); munge2(&L2, &y); munge3(&L2, &z);
munge ⊲ (2 (2)2 (2 (2)2
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge1(&L1, &x); munge2(&L2, &y); munge3(&L2, &z);
munge ⊲ (2 (2)2 ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge1(&L1, &x); munge2(&L2, &y); munge3(&L2, &z);
munge ⊲ (3 (3)3 (3 (3)3
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge1(&L1, &x); munge2(&L2, &y); munge3(&L2, &z);
munge ⊲ (3 (3)3 ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
pthread mutex tℓ1 L1 = ..., ℓ2 L2 = ...; int x, y, z; // ρx,
void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... munge1(&L1, &x); munge2(&L2, &y); munge3(&L2, &z);
munge ⊲ ⊲ ⊲ ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.9/??
Context-sensitive Correlation Analysis for Detecting Races – p.10/??
struct fooℓ,ρ s; if(...)
s.lock = &L1; s.data = &x;
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...)
s.lock = &L1; s.data = &x;
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...)
s.lock = &L1; s.data = &x;
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...)
s.lock = &L1; s.data = &x;
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲ ⊲ ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...) pack1(s)
s.lock = &L1; s.data = &x;
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲ (1)1 (1
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...) pack1(s)
s.lock = &L1; s.data = &x;
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲ (1)1 (1 ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...) pack1(s)
s.lock = &L1; s.data = &x;
pack2(s)
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲ (2)2 (2
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...) pack1(s)
s.lock = &L1; s.data = &x;
pack2(s)
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲ (2)2 (2 ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
struct fooℓ,ρ s; if(...) pack1(s)
s.lock = &L1; s.data = &x;
pack2(s)
s.lock = &L2; s.data = &y;
pthread mutex lock(s.lock); *(s.data) = 3; pthread mutex unlock(s.lock);
⊲ ⊲ ⊲
Context-sensitive Correlation Analysis for Detecting Races – p.11/??
Context-sensitive Correlation Analysis for Detecting Races – p.12/??
Context-sensitive Correlation Analysis for Detecting Races – p.13/??
pthread mutex t L1ℓ1, L2ℓ2, *lℓ; int x; // &x: int*ρx pthread mutex init(&L1); pthread mutex init(&L2); if(...) l = &L1; else l = &L2; pthread mutex lock(&l); x = 3; pthread mutex unlock(&l);
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.14/??
pthread mutex t L1ℓ1, L2ℓ2, *lℓ; int x; // &x: int*ρx pthread mutex init(&L1); pthread mutex init(&L2); if(...) l = &L1; else l = &L2; pthread mutex lock(&l); x = 3; pthread mutex unlock(&l);
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.14/??
pthread mutex t L1ℓ1, L2ℓ2, *lℓ; int x; // &x: int*ρx pthread mutex init(&L1); pthread mutex init(&L2); if(...) l = &L1; else l = &L2; pthread mutex lock(&l); x = 3; pthread mutex unlock(&l);
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.14/??
pthread mutex t L1ℓ1, L2ℓ2, *lℓ; int x; // &x: int*ρx pthread mutex init(&L1); {ℓ1} pthread mutex init(&L2); {ℓ2} if(...) l = &L1; / else l = &L2; / pthread mutex lock(&l); / x = 3; pthread mutex unlock(&l); /
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.14/??
pthread mutex t L1ℓ1, L2ℓ2, *lℓ; int x; // &x: int*ρx pthread mutex init(&L1); {ℓ1} pthread mutex init(&L2); {ℓ2} if(...) l = &L1; / else l = &L2; / pthread mutex lock(&l); / x = 3; pthread mutex unlock(&l); /
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.14/??
pthread mutex t L1ℓ1, L2ℓ2, *lℓ; int x; // &x: int*ρx pthread mutex init(&L1); {ℓ1} pthread mutex init(&L2); {ℓ2} if(...) l = &L1; / else l = &L2; / pthread mutex lock(&l); / x = 3; pthread mutex unlock(&l); /
⊲
Context-sensitive Correlation Analysis for Detecting Races – p.14/??
(i
)i
Context-sensitive Correlation Analysis for Detecting Races – p.15/??
(i
)i
Context-sensitive Correlation Analysis for Detecting Races – p.16/??
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... mungei(&L1, &x);
munge (i)i (i
Context-sensitive Correlation Analysis for Detecting Races – p.17/??
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... mungei(&L1, &x);
munge (i)i (i
Context-sensitive Correlation Analysis for Detecting Races – p.17/??
(i )i
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... mungei(&L1, &x);
munge (i)i (i
Context-sensitive Correlation Analysis for Detecting Races – p.17/??
(i )i
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... mungei(&L1, &x);
munge (i)i (i
Context-sensitive Correlation Analysis for Detecting Races – p.17/??
(i )i
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... mungei(&L1, &x);
munge (i)i (i
A c q u i r e d
Context-sensitive Correlation Analysis for Detecting Races – p.17/??
(i )i
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... mungei(&L1, &x);
munge (i)i (i
Dereferenced
Context-sensitive Correlation Analysis for Detecting Races – p.17/??
(i )i
pthread mutex tℓ1 L1 = ...; int x; // &x: int*ρx void munge(pthread mutex tℓ *l, int *ρ p) { pthread mutex lock(l); *p = 3; pthread mutex unlock(l);
... mungei(&L1, &x);
munge (i)i (i
Released
Context-sensitive Correlation Analysis for Detecting Races – p.17/??
(i )i (i)i (i Acq Rel Dere f
Context-sensitive Correlation Analysis for Detecting Races – p.18/??
(i )i (i)i (i Acq Rel Dere f Rel
Context-sensitive Correlation Analysis for Detecting Races – p.18/??
(i )i (i)i (i Acq Rel Dere f Rel
Context-sensitive Correlation Analysis for Detecting Races – p.18/??
(i )i (i)i (i Acq Rel Dere f Rel Rel (i)i )i
Context-sensitive Correlation Analysis for Detecting Races – p.18/??
(i )i (i)i (i Acq Rel Dere f Rel Rel
Context-sensitive Correlation Analysis for Detecting Races – p.18/??
Context-sensitive Correlation Analysis for Detecting Races – p.19/??
Context-sensitive Correlation Analysis for Detecting Races – p.20/??
Context-sensitive Correlation Analysis for Detecting Races – p.21/??
int* shared; /* shared global pointer */ f() { int* x = (int *) malloc(sizeof(int)); *x = 2; /* x is not yet shared */ shared = x; /* x becomes shared */
Context-sensitive Correlation Analysis for Detecting Races – p.22/??
Benchmark Size Time Warn. Unguarded Races (KLOC) aget 1.6 2s 7 2 2 knot 1.4 5s 8 8 8 ctrace 1.4 6s 3 3 1 freshclam 55 51m 11 esp 16.2 91s 19 1 1 plip 18.2 60s 1 synclink 23.6 16m 2 consolemap 14.1 1s 1 serial_core 15.2 26s ide-disk 18.9 7s
Context-sensitive Correlation Analysis for Detecting Races – p.23/??
Benchmark All off Unique
void*
Exists aget 9 9 7 — knot 31 26 22 8 ctrace 4 4 3 — freshclam 37 21 19 11 esp 37 21 19 — plip 1 1 1 — synclink 2 2 2 — consolemap 1 1 1 — serial_core — ide-disk —
Context-sensitive Correlation Analysis for Detecting Races – p.24/??
Contribution: Formalized correlation inference system with universal and existential context sensitivity Proof of soundness Implementation for C Future work: Apply correlation inference to other relations: pointers correlated with allocation regions arrays correlated with integer lengths Infer synchronization for programs with atomic regions
Context-sensitive Correlation Analysis for Detecting Races – p.25/??
Context-sensitive Correlation Analysis for Detecting Races – p.26/??
p ρ′ | ε i χ
Context-sensitive Correlation Analysis for Detecting Races – p.27/??
[Lam] C;Γ,x : τ ⊢ e : τ′;ε
[App]
[Newlock]
Context-sensitive Correlation Analysis for Detecting Races – p.28/??
[Ref] C;Γ ⊢ e : τ;ε
[Deref]
[Assign]
Context-sensitive Correlation Analysis for Detecting Races – p.29/??
[Let]
[Inst] C ⊢ τ i
+ τ′
±
Context-sensitive Correlation Analysis for Detecting Races – p.30/??
[Fix]
+ τ′′
±
[Down]
Context-sensitive Correlation Analysis for Detecting Races – p.31/??
[Inst-Ref]
p ρ′
± τ′
p ref ρ′ τ′
[Inst-Fun]
¯ p τ2
1 i p τ′ 2
1 i p τ2 →ε2 τ′ 2
Context-sensitive Correlation Analysis for Detecting Races – p.32/??
[Sub-Lock]
[Sub-Ref]
[Sub-Fun]
1 ≤ τ′ 2
1 ≤ τ2 →ε2 τ′ 2
Context-sensitive Correlation Analysis for Detecting Races – p.33/??
− ρ0}∪{ρ1 ≤ ρ2}∪{ρ2 i + ρ3}
p ρ′}∪{ρ⊲ℓ}∪{ℓ i ℓ′}
Context-sensitive Correlation Analysis for Detecting Races – p.34/??
Context-sensitive Correlation Analysis for Detecting Races – p.35/??
Context-sensitive Correlation Analysis for Detecting Races – p.36/??
if C ⊢ escapes(ℓ,
Context-sensitive Correlation Analysis for Detecting Races – p.37/??
Benchmark Total Empty Single Type Multiple Types aget 148 56 78 14 knot 181 87 80 14 ctrace 115 57 58 freshclam 5745 1025 2365 2355 esp 754 476 188 90 plip 1310 1187 106 17 synclink 1100 701 151 248 consolemap 110 18 37 55 serial_core 1206 1001 77 128 ide-disk 447 252 97 98
Context-sensitive Correlation Analysis for Detecting Races – p.38/??
Benchmark Total Structs Total Fields Used Fields aget 159 1955 252 knot 210 1418 619 ctrace 162 1113 389 freshclam 6982 65582 32822 esp 2439 37286 16462 plip 4119 89343 17706 synclink 7721 197872 111368 consolemap 145 3819 301 serial_core 7463 114149 29238 ide-disk 2352 72923 11011
Context-sensitive Correlation Analysis for Detecting Races – p.39/??