sparrow an industrial-strength static bug-finder for cropas.snu.ac.kr › ~kwang › pl2401 › talk...

45
Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract Interpretation + Impure Catalysts) Kwangkeun(Kwang) Yi Programming Research Laboratory Seoul National University ropas.snu.ac.kr/~kwang 12/05/2008 @ Korea Univ. of Technology and Education Kwangkeun(Kwang) Yi The Sparrow System

Upload: others

Post on 26-Jun-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrowan Industrial-Strength Static Bug-Finder for C

(Abstract Interpretation + Impure Catalysts)

Kwangkeun(Kwang) Yi

Programming Research LaboratorySeoul National Universityropas.snu.ac.kr/~kwang

12/05/2008 @ Korea Univ. of Technology and Education

Kwangkeun(Kwang) Yi The Sparrow System

Page 2: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow system

static analyzer based on abstract interpretation

fully automatic and scalable

detects common bugs

buffer overrun, memory leak, null dereference, uninitializedaccess, divide by zero, etc.

for non domain-specific C code

From the elusive three (deep property, scalability, automation)

– deep property

+ domain-independence

Kwangkeun(Kwang) Yi The Sparrow System

Page 3: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Our motivation

to prove that static analysis is “useful in real world”

curious about “extra miles” from academia to industry

Of course, the reality

has been challenging us a lot, and

we’ve been struggling to respond to.

Kwangkeun(Kwang) Yi The Sparrow System

Page 4: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

spa-arrow.com

Kwangkeun(Kwang) Yi The Sparrow System

Page 5: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Performance Numbers (1/3)Memory leak detection (SPEC2000 and open sources) (as of01/04/2008)

Programs Size Time True FalseKLOC (sec) Alarms Alarms

art 1.2 0.68 1 0equake 1.5 1.03 0 0mcf 1.9 2.77 0 0bzip2 4.6 1.52 1 0gzip 7.7 1.56 1 4parser 10.9 15.93 0 0ammp 13.2 9.68 20 0vpr 16.9 7.85 0 9crafty 19.4 84.32 0 0twolf 19.7 68.80 5 0mesa 50.2 43.15 9 0vortex 52.6 34.79 0 1gap 59.4 31.03 0 0gcc 205.8 1330.33 44 1

gnuchess-5.07 17.8 9.44 4 0tcl8.4.14 17.9 266.09 4 4hanterm-3.1.6 25.6 13.66 0 0sed-4.0.8 26.8 13.68 29 31tar-1.13 28.3 13.88 5 3grep-2.5.1a 31.5 22.19 2 3openssh-3.5p1 36.7 10.75 18 4bison-2.3 48.4 48.60 4 1openssh-4.3p2 77.3 177.31 1 7fftw-3.1.2 184.0 15.20 0 0httpd-2.2.2 316.4 102.72 6 1net-snmp-5.4 358.0 201.49 40 20binutils-2.13.1 909.4 712.09 228 25

Kwangkeun(Kwang) Yi The Sparrow System

Page 6: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Performance Numbers (2/3)In comparison with other published memory leak detectors

Number of bugs: Sparrow finds consistently more bugs thanothersAnalysis speed: 785LOC/sec, next to the fastest FastCheck.False-alarm ratio: 20%Efficacy: Sparrow the biggest

TrueAlarms/KLOC

FalseAlarmRatio

Tool C size Speed True False Alarm EfficacyKLOC LOC/s Alarms Ratio(%)

Saturn ’05 (Stanford) 6,822 50 455 10% 1/150Clouseau ’03 (Stanford) 1,086 500 409 64% 1/170FastCheck ’07 (Cornell) 671 37,900 63 14% 1/149Contradiction ’06 (Cornell) 321 300 26 56% 1/691

Sparrow 1,777 785 332 12% 1/66

Table: Overall comparison

C program Tool True False AlarmAlarms Count

SPEC2000 Sparrow 81 15benchmark FastCheck ’07 (Cornell) 59 8

binutils-2.13.1 Sparrow 246 29& Saturn ’05 (Stanford) 165 5

openssh-3.5.p1 Clouseau ’03 (Stanford) 84 269

Table: Comparison for the same C programs

Kwangkeun(Kwang) Yi The Sparrow System

Page 7: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Performance Numbers (3/3)Buffer overrun detection (SPEC2000 and open sources) (as of03/18/2008)

Programs Size Time True FalseKLOC (sec) Alarms Alarms

art 1.2 1.48 0 0equake 1.5 4.73 0 0mcf 1.9 11.61 0 0bzip2 4.6 28.96 19 0gzip 7.7 31.07 18 4parser 10.9 284.63 2 1twolf 19.7 317.50 1 0ammp 13.2 31.49 1 1vpr 16.9 28.42 0 0crafty 19.4 692.49 1 0mesa 50.2 113.91 2 3vortex 52.6 204.95 0 0gap 59.4 115.47 0 2

gzip-1.2.4 9.1 23.56 0 4gnuchess-5.07 17.8 431.87 1 5tcl8.4.14/unix 17.9 498.15 1 7hanterm-3.1.6 25.6 51.59 36 0sed-4.0.8 26.8 93.63 5 7tar-1.13 28.3 60.62 1 6grep-2.5.1a 31.5 44.49 0 0bison-2.3 48.4 256.03 0 13openssh-4.3p2 77.3 100.63 1 6fftw-3.1.2 184.0 57.55 19 0httpd-2.2.2 316.4 341.61 0 3net-snmp-5.4 358.0 935.96 2 13

Kwangkeun(Kwang) Yi The Sparrow System

Page 8: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow’s Positioning

(in a “sales” pitch)

Kwangkeun(Kwang) Yi The Sparrow System

Page 9: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Steps of Sparrow

Sparrow is a one-button solution with four steps:

understanding the code genetics

parsing and distilling the code

analyzing the code’s run time behaviors

reporting detected bugs

Kwangkeun(Kwang) Yi The Sparrow System

Page 10: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

User Interface: Scored Alarms + Navigating Explanation

Kwangkeun(Kwang) Yi The Sparrow System

Page 11: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Customers under negotiation

Domestic market at the moment

Samsung, LG, etc.: personal devices’ sw developersnetwork switching system sw developersother embedded sw developersbank system sw developersetc.

Complementing others (such as Coverity, GrammaTech,Klockworks, Polyspace).

BMT at a site (a network device OS, ∼ 700KLOC):

Kwangkeun(Kwang) Yi The Sparrow System

Page 12: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Outline for the rest

1. Sparrow’s Examples

2. Our Approach: a bird’s eye view

3. Memory Leak Detection: some details

4. Conclusion & an Issue

Kwangkeun(Kwang) Yi The Sparrow System

Page 13: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow’s Examples

Kwangkeun(Kwang) Yi The Sparrow System

Page 14: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Note

Some bugs may look simple (only after a posteriori slicing)

But non-trivial to locate themonly few bug paths

among the exponential jungle of paths

must beat all the paths

no prior knowledge possible

such prior knowledge possible? should be very rough,otherwise a catch-22 situation

Pattern-based approach?

not tolerant to variations of “patterns”variations should be ample in real codea collection of patterns will always fall short

Kwangkeun(Kwang) Yi The Sparrow System

Page 15: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Note

Some bugs may look simple (only after a posteriori slicing)

But non-trivial to locate themonly few bug paths

among the exponential jungle of paths

must beat all the paths

no prior knowledge possible

such prior knowledge possible? should be very rough,otherwise a catch-22 situation

Pattern-based approach?

not tolerant to variations of “patterns”variations should be ample in real codea collection of patterns will always fall short

Kwangkeun(Kwang) Yi The Sparrow System

Page 16: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Overrun Errors (1/3)

in Linux Kernel 2.6.4625 for (minor = 0; minor < 32 && acm_table[minor]; minor++);

... ...

713 acm_table[minor] = acm;

in a proprietary codeif (length >= NET_MAX_LEN)

return API_SET_ERR_NET_INVALID_LENGTH;

...

buff[length] |= (num << 4);

in a proprietary codeindex = memmgr_get_bucket_index(block_size);

...

mem_stats.pool_ptr[index] = prt

in a proprietary codeimi_send_to_daemon(PM_EAP, CONFIG_MODE, set_str, sizeof(set_str));

...

imi_send_to_daemon(int module, int mode, char *cmd, int len)

{

...

strncpy(cmd, reply.str, len);

cmd[len] = 0;

Kwangkeun(Kwang) Yi The Sparrow System

Page 17: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Overrun Errors (1/3)

in Linux Kernel 2.6.4625 for (minor = 0; minor < 32 && acm_table[minor]; minor++);

... ...

713 acm_table[minor] = acm;

in a proprietary codeif (length >= NET_MAX_LEN)

return API_SET_ERR_NET_INVALID_LENGTH;

...

buff[length] |= (num << 4);

in a proprietary codeindex = memmgr_get_bucket_index(block_size);

...

mem_stats.pool_ptr[index] = prt

in a proprietary codeimi_send_to_daemon(PM_EAP, CONFIG_MODE, set_str, sizeof(set_str));

...

imi_send_to_daemon(int module, int mode, char *cmd, int len)

{

...

strncpy(cmd, reply.str, len);

cmd[len] = 0;

Kwangkeun(Kwang) Yi The Sparrow System

Page 18: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Overrun Errors (1/3)

in Linux Kernel 2.6.4625 for (minor = 0; minor < 32 && acm_table[minor]; minor++);

... ...

713 acm_table[minor] = acm;

in a proprietary codeif (length >= NET_MAX_LEN)

return API_SET_ERR_NET_INVALID_LENGTH;

...

buff[length] |= (num << 4);

in a proprietary codeindex = memmgr_get_bucket_index(block_size);

...

mem_stats.pool_ptr[index] = prt

in a proprietary codeimi_send_to_daemon(PM_EAP, CONFIG_MODE, set_str, sizeof(set_str));

...

imi_send_to_daemon(int module, int mode, char *cmd, int len)

{

...

strncpy(cmd, reply.str, len);

cmd[len] = 0;

Kwangkeun(Kwang) Yi The Sparrow System

Page 19: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Overrun Errors (1/3)

in Linux Kernel 2.6.4625 for (minor = 0; minor < 32 && acm_table[minor]; minor++);

... ...

713 acm_table[minor] = acm;

in a proprietary codeif (length >= NET_MAX_LEN)

return API_SET_ERR_NET_INVALID_LENGTH;

...

buff[length] |= (num << 4);

in a proprietary codeindex = memmgr_get_bucket_index(block_size);

...

mem_stats.pool_ptr[index] = prt

in a proprietary codeimi_send_to_daemon(PM_EAP, CONFIG_MODE, set_str, sizeof(set_str));

...

imi_send_to_daemon(int module, int mode, char *cmd, int len)

{

...

strncpy(cmd, reply.str, len);

cmd[len] = 0;

Kwangkeun(Kwang) Yi The Sparrow System

Page 20: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Overrun Errors (1/3)

in Linux Kernel 2.6.4625 for (minor = 0; minor < 32 && acm_table[minor]; minor++);

... ...

713 acm_table[minor] = acm;

in a proprietary codeif (length >= NET_MAX_LEN)

return API_SET_ERR_NET_INVALID_LENGTH;

...

buff[length] |= (num << 4);

in a proprietary codeindex = memmgr_get_bucket_index(block_size);

...

mem_stats.pool_ptr[index] = prt

in a proprietary codeimi_send_to_daemon(PM_EAP, CONFIG_MODE, set_str, sizeof(set_str));

...

imi_send_to_daemon(int module, int mode, char *cmd, int len)

{

...

strncpy(cmd, reply.str, len);

cmd[len] = 0;

Kwangkeun(Kwang) Yi The Sparrow System

Page 21: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Leak Errors (2/3)

in sed-4.0.8/regexp internal.c948: new_nexts = re_realloc (dfa->nexts, int, dfa->nodes_alloc);

949: new_indices = re_realloc (dfa->org_indices, int, dfa->nodes_alloc);

950: new_edests = re_realloc (dfa->edests, re_node_set, dfa->nodes_alloc);

951: new_eclosures = re_realloc (dfa->eclosures, re_node_set,

952: dfa->nodes_alloc);

953: new_inveclosures = re_realloc (dfa->inveclosures, re_node_set,

954: dfa->nodes_alloc);

955: if (BE (new_nexts == NULL || new_indices == NULL

956: || new_edests == NULL || new_eclosures == NULL

957: || new_inveclosures == NULL, 0))

958: return -1;

in proprietary codeline = read_config_read_data(ASN_INTEGER, line,

&StorageTmp->traceRouteProbeHistoryHAddrType,

&tmpint);

...

line = read_config_read_data(ASN_OCTET_STR, line,

&StorageTmp->traceRouteProbeHistoryHAddr,

&StorageTmp->traceRouteProbeHistoryHAddrLen);

...

if (StorageTmp->traceRouteProbeHistoryHAddr == NULL) {

config_perror

(‘‘invalid specification for traceRouteProbeHistoryHAddr’’);

return SNMPERR_GENERR;

}

Kwangkeun(Kwang) Yi The Sparrow System

Page 22: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Leak Errors (2/3)

in sed-4.0.8/regexp internal.c948: new_nexts = re_realloc (dfa->nexts, int, dfa->nodes_alloc);

949: new_indices = re_realloc (dfa->org_indices, int, dfa->nodes_alloc);

950: new_edests = re_realloc (dfa->edests, re_node_set, dfa->nodes_alloc);

951: new_eclosures = re_realloc (dfa->eclosures, re_node_set,

952: dfa->nodes_alloc);

953: new_inveclosures = re_realloc (dfa->inveclosures, re_node_set,

954: dfa->nodes_alloc);

955: if (BE (new_nexts == NULL || new_indices == NULL

956: || new_edests == NULL || new_eclosures == NULL

957: || new_inveclosures == NULL, 0))

958: return -1;

in proprietary codeline = read_config_read_data(ASN_INTEGER, line,

&StorageTmp->traceRouteProbeHistoryHAddrType,

&tmpint);

...

line = read_config_read_data(ASN_OCTET_STR, line,

&StorageTmp->traceRouteProbeHistoryHAddr,

&StorageTmp->traceRouteProbeHistoryHAddrLen);

...

if (StorageTmp->traceRouteProbeHistoryHAddr == NULL) {

config_perror

(‘‘invalid specification for traceRouteProbeHistoryHAddr’’);

return SNMPERR_GENERR;

}

Kwangkeun(Kwang) Yi The Sparrow System

Page 23: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Leak Errors (2/3)

in sed-4.0.8/regexp internal.c948: new_nexts = re_realloc (dfa->nexts, int, dfa->nodes_alloc);

949: new_indices = re_realloc (dfa->org_indices, int, dfa->nodes_alloc);

950: new_edests = re_realloc (dfa->edests, re_node_set, dfa->nodes_alloc);

951: new_eclosures = re_realloc (dfa->eclosures, re_node_set,

952: dfa->nodes_alloc);

953: new_inveclosures = re_realloc (dfa->inveclosures, re_node_set,

954: dfa->nodes_alloc);

955: if (BE (new_nexts == NULL || new_indices == NULL

956: || new_edests == NULL || new_eclosures == NULL

957: || new_inveclosures == NULL, 0))

958: return -1;

in proprietary codeline = read_config_read_data(ASN_INTEGER, line,

&StorageTmp->traceRouteProbeHistoryHAddrType,

&tmpint);

...

line = read_config_read_data(ASN_OCTET_STR, line,

&StorageTmp->traceRouteProbeHistoryHAddr,

&StorageTmp->traceRouteProbeHistoryHAddrLen);

...

if (StorageTmp->traceRouteProbeHistoryHAddr == NULL) {

config_perror

(‘‘invalid specification for traceRouteProbeHistoryHAddr’’);

return SNMPERR_GENERR;

}

Kwangkeun(Kwang) Yi The Sparrow System

Page 24: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Sparrow-detected Leak Errors (3/3)

in mesa/osmesa.c(in SPEC 2000)

276: osmesa->gl_ctx = gl_create_context( osmesa->gl_visual );

...

287: gl_destroy_context( osmesa->gl_ctx );

------------------

1164: GLcontext *gl_create_context( GLvisual *visual,

GLcontext *share_list,

void *driver_ctx ) {

...

1183: ctx = (GLcontext *) calloc( 1, sizeof(GLcontext) );

...

1211: ctx->Shared = alloc_shared_state();

---------------------

476: static struct gl_shared_state *alloc_shared_state( void )

477: {

...

489: ss->Default1D = gl_alloc_texture_object(ss, 0, 1);

490: ss->Default2D = gl_alloc_texture_object(ss, 0, 2);

491: ss->Default3D = gl_alloc_texture_object(ss, 0, 3);

----------------------

1257: void gl_destroy_context( GLcontext *ctx )

1258: {

...

1274: free_shared_state( ctx, ctx->Shared );

Kwangkeun(Kwang) Yi The Sparrow System

Page 25: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Our Approach: a bird’s eye view

Kwangkeun(Kwang) Yi The Sparrow System

Page 26: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Pure Soup + Impure Catalysts

pure soup: simple & “sound” abstract interpreter

impure catalysts: unorthodox & unsound techniques to refinethe bug-finding performance

Rationale:(A + B)3 versus A3 + βθ(A)

(cf. (x + y)3 = x3 + y3 + 3x2y + 3xy2)

sound analysis components: A and B

their costly composition: (A + B)3

economical by separate, impure catalysts: A3 + βθ(A)

pragmatic approach to find prevalent true caseslose rare true cases, reduce many false alarms

Kwangkeun(Kwang) Yi The Sparrow System

Page 27: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Pure Soup + Impure Catalysts

pure soup: simple & “sound” abstract interpreter

impure catalysts: unorthodox & unsound techniques to refinethe bug-finding performance

Rationale:(A + B)3 versus A3 + βθ(A)

(cf. (x + y)3 = x3 + y3 + 3x2y + 3xy2)

sound analysis components: A and B

their costly composition: (A + B)3

economical by separate, impure catalysts: A3 + βθ(A)

pragmatic approach to find prevalent true caseslose rare true cases, reduce many false alarms

Kwangkeun(Kwang) Yi The Sparrow System

Page 28: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Unsoundness: Necessary Evil

no complete source, C’s flat/linear memory, unknown libraries,dialect extensions, embedded assembly code

naive soundness ⇒ too many alarms of little relevance

accurate soundness ⇐global analysis (impossible), orsound separate analyser and linker (unknown), ordomain-dependency (not wanted)

Kwangkeun(Kwang) Yi The Sparrow System

Page 29: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

The Pure, Underpinning Engine A3

A “sound” abstract interpreter

non-relational, state transition, program-point fixpointanalysis

with the interval domain for 2Z

with the lexical abstractions (malloc, access expr) for locations

lots of engineering: worklist order, economical wideningpoints, partial join, enlarged program point, context pruning,state localization, inlining, and etc.

What aboutrelational analysis, context sensitivity, path sensitivity?

Kwangkeun(Kwang) Yi The Sparrow System

Page 30: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

The Pure, Underpinning Engine A3

A “sound” abstract interpreter

non-relational, state transition, program-point fixpointanalysis

with the interval domain for 2Z

with the lexical abstractions (malloc, access expr) for locations

lots of engineering: worklist order, economical wideningpoints, partial join, enlarged program point, context pruning,state localization, inlining, and etc.

What aboutrelational analysis, context sensitivity, path sensitivity?

Kwangkeun(Kwang) Yi The Sparrow System

Page 31: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

The Impure Catalysts βθ(A)

To reduce false alarms and to find more bugs,

relationality by loop unrolling

loop unrolling, bounded by θ(A): unsound

〈ai, bj〉 v 〈ai+1, bj+1〉 whenever ai v ai+1

path sensitivity for effect-paths only: unsounde.g. paths with malloc/free effects dominates

context sensitivity by parameterized proceduralsummarization: parameter = procedure’s input memory statee.g. λ〈α1, α2〉.〈malloc(α1->y), free(α2->x)〉

Kwangkeun(Kwang) Yi The Sparrow System

Page 32: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

The Impure Catalysts βθ(A)

To reduce false alarms and to find more bugs,

relationality by loop unrolling

loop unrolling, bounded by θ(A): unsound

〈ai, bj〉 v 〈ai+1, bj+1〉 whenever ai v ai+1

path sensitivity for effect-paths only: unsounde.g. paths with malloc/free effects dominates

context sensitivity by parameterized proceduralsummarization: parameter = procedure’s input memory statee.g. λ〈α1, α2〉.〈malloc(α1->y), free(α2->x)〉

Kwangkeun(Kwang) Yi The Sparrow System

Page 33: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

The Impure Catalysts βθ(A)

To reduce false alarms and to find more bugs,

relationality by loop unrolling

loop unrolling, bounded by θ(A): unsound

〈ai, bj〉 v 〈ai+1, bj+1〉 whenever ai v ai+1

path sensitivity for effect-paths only: unsounde.g. paths with malloc/free effects dominates

context sensitivity by parameterized proceduralsummarization: parameter = procedure’s input memory statee.g. λ〈α1, α2〉.〈malloc(α1->y), free(α2->x)〉

Kwangkeun(Kwang) Yi The Sparrow System

Page 34: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

The Impure Catalysts βθ(A)

To reduce false alarms and to find more bugs,

relationality by loop unrolling

loop unrolling, bounded by θ(A): unsound

〈ai, bj〉 v 〈ai+1, bj+1〉 whenever ai v ai+1

path sensitivity for effect-paths only: unsounde.g. paths with malloc/free effects dominates

context sensitivity by parameterized proceduralsummarization: parameter = procedure’s input memory statee.g. λ〈α1, α2〉.〈malloc(α1->y), free(α2->x)〉

Kwangkeun(Kwang) Yi The Sparrow System

Page 35: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Our Memory Leak Detection Analysis

Kwangkeun(Kwang) Yi The Sparrow System

Page 36: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Memory Leak

A procedure leaks a heap memory whenever

the memory is allocated while the procedure is active

the memory is neither recycled nor visible to the outside

Detecting memory leak needs three information

allocations

deallocations

aliases

Kwangkeun(Kwang) Yi The Sparrow System

Page 37: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Steps

Overall:

For each procedure, we estimate the three memory effects intoa procedural summary.

Summary is instantiated at its call site: context sensitiveanalysis

In reverse topological order of the call graph,

estimate the three memory effects of each procedure: by ai

summarize each procedure’s effect from the memory effects

call cycles? the underlying ai estimates the memory effectsspanning the cycles

Kwangkeun(Kwang) Yi The Sparrow System

Page 38: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

How to Summarize Procedure’s Memory Effects (1/3)

How to derive procedure’s memory effects without knowingthe input memory state (call context)?

Have to parameterize the memory effects by the inputmemory state. How?

Observation: accessed input locations are visible as “accessexpressions” in the procedure text

Use such expressions as the addresses of the input memory

Kwangkeun(Kwang) Yi The Sparrow System

Page 39: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

How to Summarize Procedure’s Memory Effects (2/3)

int *f(List *p) {if (n) return malloc(4);else {

p->next = malloc(10);return 0;

}}

The estimated memory states at the two exit points:

n [−∞,∞]ret `1

n [0, 0]p α

α.next `2

ret nullNote

summary parameters: α, `1, `2

access paths as abstract locations: α.next

interval analysis for integers

Kwangkeun(Kwang) Yi The Sparrow System

Page 40: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

How to Summarize Procedure’s Memory Effects (3/3)

Summarize which locations

can be allocated and visible to the outside

can be freed: recycled or visible to the outside

can be aliased and visible to the outside

From

n [−∞,∞]ret `1

n [0, 0]p αα.next `2ret null

to

Kwangkeun(Kwang) Yi The Sparrow System

Page 41: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Instantiating Summaries

f(List *x, List *y) { g() {free(y->next); List *a = malloc(10);free(x); List *b = a;

} a->next = malloc(10);f(a,b);

}

Kwangkeun(Kwang) Yi The Sparrow System

Page 42: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

In conclusion

Kwangkeun(Kwang) Yi The Sparrow System

Page 43: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Conclusion (1/2)

Sparrow, a static bug-finder for C: scalable, automatic,non-domain-specific, “useful”

combination of abstract interpretation and unsound catalystsadvantages of abstract interpretation

not to fear the source language’s “wild” constructsnot to fear their infinitely varied compositions in programs

disadvantages made up for by unsound catalysts

context sensitivity by procedural summarization andinstantiationrelational analysis by loop unrollingpath sensitivity by effect-path-domination

Kwangkeun(Kwang) Yi The Sparrow System

Page 44: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Conclusion (an issue) (2/2)

From Sparrow we learned that

unsound things are necessary evils in reality.

are they just implementation issues, independent of thetheory?

don’t search for order in the world of direct experience?

can there be a theoretical framework to reason about thedegree of unsoundness?

can there be a systematic way to lessen the unsoundness?

Thank you.

Kwangkeun(Kwang) Yi The Sparrow System

Page 45: Sparrow an Industrial-Strength Static Bug-Finder for Cropas.snu.ac.kr › ~kwang › pl2401 › talk › kut08.pdf · Sparrow an Industrial-Strength Static Bug-Finder for C (Abstract

Conclusion (an issue) (2/2)

From Sparrow we learned that

unsound things are necessary evils in reality.

are they just implementation issues, independent of thetheory?

don’t search for order in the world of direct experience?

can there be a theoretical framework to reason about thedegree of unsoundness?

can there be a systematic way to lessen the unsoundness?

Thank you.

Kwangkeun(Kwang) Yi The Sparrow System