lecture 23 compiler design · announcements • hw6: analysis & optimizations –alias...

79
COMPILER DESIGN Lecture 23 Zhendong Su Compiler Design

Upload: others

Post on 20-Jul-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

COMPILER DESIGNLecture 23

Zhendong Su Compiler Design

Page 2: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Announcements

• HW6: Analysis & Optimizations– Alias analysis, constant propagation, dead code elimination, register

allocation– Due: Tuesday, December 17th at 23:59– May submit by Thursday, December 19th at 23:59 with penalty

• Final Exam– Scheduled for Friday, January 31st, 9-11 AM

Compiler Design Zhendong Su

Page 3: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

COMPILER TESTING

Compiler Design Zhendong Su

Page 4: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

compilers

int main (){

// do something…return 0;

}

…call putsmovl $0, %eaxpopq %rbpret

Developers’ belief: Compilers are faithful translators

Page 5: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

How trustworthy are compilers?

How they impact security & reliability?

let’s reflect on this trust

Page 6: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

In 2014, GCC 4.9 miscompiled the Linux kernel!

“Ok, so I’m looking at the code generation and your compiler is pure and utter ****.……Adding Jakub to the cc, because gcc-4.9.0 seems

to be terminally broken.”

-- Linus Torvalds

Page 7: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Type #1 bugs

Page 8: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

llvm bug 14972

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

Page 9: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

developer comment

“... very, very concerning when I

got to the root cause, and very

annoying to fix …”

http://llvm.org/bugs/show_bug.cgi?id=14972

Page 10: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Type #2 “bugs”

Page 11: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

gcc “bug” 8537#include <string>using std::string;#include <memory>

// The specifics of this function are not important for // demonstrating this bug.const string getPasswordFromUser() const;

bool isPasswordCorrect() {bool isPasswordCorrect = false;string Password("password");

if(Password == getPasswordFromUser()) {isPasswordCorrect = true;

}

// Removed from the optimized code although it secures// the code by wiping the password from memorymemset(Password, 0, sizeof(Password));return isPasswordCorrect;

}

Page 12: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

debatable … From: "Joseph D. Wagner" <[email protected]>To: <[email protected]>, [email protected], <[email protected]>,

[email protected], [email protected],<[email protected]>Cc: Subject: RE: optimization/8537: Optimizer Removes Code Necessary for SecurityDate: Sun, 17 Nov 2002 08:59:53 -0600

Direct quote from:http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Bug-Criteria.html

"If the compiler produces valid assembly code that does not correctly execute the input source code, that is a compiler bug."

So to all you naysayers out there who claim this is a programming error or poor coding, YES, IT IS A BUG!

Page 13: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Type #3 “bugs”

Page 14: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

how about this one?char *buf = ...;char *buf_end = ...; unsigned int len = ...;

if (buf + len >= buf_end)return; // len too large

if (buf + len < buf)return; //overflow, buf+len wrapped around

// write to buf[0..len-1]...

Page 15: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

even more debatable …

qPointer overflow is undefined behavioruCompiler assumes code has no undefined behavior

uThus compiler assumes: buf + len cannot overflow

uThen compiler infers: if (buf + len < buf) ) if (0)

qBut this is a security threatuUse a large len to trigger buffer overflow

Page 16: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Type #1 bugs: EMI Testing

How to find 1,600+ GCC/LLVM bugs in 5 years?

real

Page 17: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Csmith [Yang et al. PLDI’11]

LLVM

Random test-case generation

8 other C compilers

79 bugs: 25 critical

202 bugs325 bugs in total

Source Programs

Page 18: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

vision

P ≡P1

P2 P3

PkPn

Page 19: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

key challenges

qGeneration u How to generate different, yet equivalent tests?

qValidationu How to check that tests are indeed equivalent?

qBoth are long-standing hard issues

Page 20: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

equiv. modulo inputs

qRelax equiv. wrt a given input iuMust: P(i) = Pk(i) on input i

uOkay: P(j) ≠ Pk(j) on all input j ≠ i

qExploit close interplay between uDynamic program execution on some input

uStatic compilation for all input

Page 21: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

profile

program P

output O

input I executedunexecuted

Page 22: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

mutate

…..

O

I

O

I

O

I

O

I

Page 23: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

mutate

…..

O

I

O

I

O

I

O

Iequivalent wrt I

Page 24: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

revisit challenges

qGeneration (easy) u How to generate different, yet equivalent tests?

qValidation (easy)u How to check that tests are indeed equivalent?

qBoth are long-standing hard issues

Page 25: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

llvm bug 14972

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

Page 26: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

seed file

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.out

Page 27: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

seed file

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.out

unexecuted

Page 28: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

transformed file

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

Page 29: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

reduced file

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

Page 30: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

llvm bug autopsy

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

GVN: load structusing 32-bit load

Page 31: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

llvm bug autopsy

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

GVN: load structusing 32-bit load

SRoA: read past the struct’s end

è

undefined behavior

Page 32: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

llvm bug autopsy

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

GVN: load structusing 32-bit load

remove

SRoA: read past the struct’s end

è

undefined behavior

Page 33: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

seed file

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.out

Page 34: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

transformed file

$ clang –m32 –O0 test.c ; ./a.out$ clang –m32 –O1 test.c ; ./a.outAborted (core dumped)

Page 35: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

gcc bug 58731

$ gcc –O0 test.c ; ./a.out$ gcc –O3 test.c ; ./a.out^C

Page 36: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

gcc bug autopsy

$ gcc –O0 test.c ; ./a.out$ gcc –O3 test.c ; ./a.out^C

PRE: loop invariant

Page 37: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

gcc bug autopsy

LIM

$ gcc –O0 test.c ; ./a.out$ gcc –O3 test.c ; ./a.out^C

Page 38: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

gcc bug autopsy

integer overflow

$ gcc –O0 test.c ; ./a.out$ gcc –O3 test.c ; ./a.out^C

Page 39: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

seed program

$ gcc –O0 test.c ; ./a.out$ gcc –O3 test.c ; ./a.out

no longer aloop invariant

Page 40: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

orion

qFirst and simplest EMI realization

qTargeting C compilers

uRandomly prune unexecuted code

uVery effective

Page 41: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

bug counts (till 03/2014)

GCC LLVM TOTALReported 111 84 195Marked Duplicate 28 7 35Confirmed 79 68 147Fixed 56 54 110

Page 42: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

bug types

GCC LLVM TOTALWrong code 46 49 95Crash 23 10 33Performance 10 9 19

Page 43: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

bug importance

qMost bugs have already been fixed

qMany were critical, release-blocking

qSome affected real-world projects

Page 44: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Athena (OOPSLA’15) Prune & inject dead code

Hermes (OOPSLA’16)Mutate live code

Orion (PLDI’14)Prune dead code

Page 45: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Athena: gcc bug 61383

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;

else if (h) break;}}int main () {fn1 ();return 0;}

$ gcc -O0 test.c ; ./a.out$ gcc –O2 test.c ; ./a.outFloating point exception (core dumped)

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;

else c = 1;}}int main () {fn1 ();return 0;}

Athena

Seed Program P Bug-triggering Variant

Page 46: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;else c = 1;

}}int main () {fn1 ();return 0;}

Current

Page 47: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;else;

}}int main () {fn1 ();return 0;}

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;else c = 1;

}}int main () {fn1 ();return 0;}

Current Proposal

Delete “c = 1”

Page 48: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;else if (h) break;

}}int main () {fn1 ();return 0;}

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;else;

}}int main () {fn1 ();return 0;}

Current Proposal

Insert the statement below

Context Statement1. Requires loop if (i)

break;2. int i;

Page 49: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

int a, c, d, e = 1, f;int fn1 () {int h;for (; d < 1; d = e) {h = (f == 0) ? 0 : 1 % f;if (f < 1) c = 0;else if (h) break;

}}int main () {fn1 ();return 0;}

Bug-triggering Variantint a, c, d, e = 1, f;int fn1 () {int h;

int g = 1 % f;for (; d < 1; d = e) {h = (f == 0) ? 0 : g;if (f < 1) c = 0;else if (h) break;

}}int main () {fn1 ();return 0;}

Miscompiled Executable

loop invariant

hoisted

Page 50: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Hermesq Profile and record variable values

q Synthesize code snippets

§ Ensure no undefined behavior

§ Ensure EMI property locallyoMaintain same program state at entry & exit

Page 51: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Hermes: llvm 26266char a;int b, c = 9, d, e;

void fn1() {unsigned f = 1;int g = 8, h = 5;for (; a != 6; a--) {

int *i = &h, *j;for (;;) {

// b=0,c=9,e=0,f=1,g=8,h=5if (d <= 8) break;*i = 0;for (; *j <= 0;);

}}

}int main() {fn1(); return 0;}

int backup_g = e, backup_f = ~1;if (g && h) {

backup_g = g;backup_f = f;f = -(~(c && b)|-~(e*~backup_f));if (c < f) abort();

}g = backup_g;f = backup_f;

Seed Program P EMI Variant

int *i = &h, *j;for (;;) {

// b=0,c=9,e=0,f=1,g=8,h=5

if (d <= 8) break;*i = 0;for (; *j <= 0;);

}

Page 52: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

int backup_g = e, backup_f = ~1;if (g && h) {

backup_g = g;backup_f = f;f = -(~(c && b)|-~(e*~backup_f));

if (c < f) abort();}g = backup_g;f = backup_f;

EMI Variant

int *i = &h, *j;for (;;) {

// b=0,c=9,e=0,f=1,g=8,h=5

if (d <= 8) break;*i = 0;for (; *j <= 0;);

}

$ clang -m32 -O0 test.c$ ./a.out$ clang -m32 -O1 test.c$ ./a.outAborted (core dumped)

Clang (mistakenly) deems this predicate always true

Page 53: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

if/while (P) { // P=false wrt profiled statesS // S any synthesized compilable code

}

if (P) { // P=true wrt profiled statesS // S is original code at this program point

}

int backup_v = valid-expressionif (true-predicate) {backup_v = vv = valid-expressionif/while(false-predicate) { print v }}v = backup_v

Page 54: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

~(c && b)|-~(e*~f)

worklist = [“b”, “c”, “e”, “f”]

env: b=0,c=9,e=0,f=1,g=8,h=5

Page 55: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

worklist = [“b”, “c”, “e”, “f”]

env: b=0,c=9,e=0,f=1,g=8,h=5

Operands: “b”, “e” Operator: / Validity: Invalid

~(c && b)|-~(e*~f)

Page 56: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

worklist = [“b”, “c”, “e”, “f”]

env: b=0,c=9,e=0,f=1,g=8,h=5

Operands: “c”, “b” Operator: && Validity: Valid

~(c && b)|-~(e*~f)

Page 57: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

worklist = [“b”, “c”, “e”, “f”]

env: b=0,c=9,e=0,f=1,g=8,h=5

worklist = [“c && b”, “e”, “f”]

~(c && b)|-~(e*~f)

Page 58: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

worklist = [“b”, “c”, “e”, “f”]

env: b=0,c=9,e=0,f=1,g=8,h=5

worklist = [“c && b”, “e”, “f”]

worklist = [“c && b”, “e”, “~f”]

~(c && b)|-~(e*~f)

worklist = [“~(c && b)|-~(e*~f)”]

……

Page 59: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

bug counts (till recently)

• ISSTA’15: Stress-testing link-time optimization• ICSE’16: Analyzing compilers’ diagnostic support • PLDI’17: Skeletal program enumeration

GCC LLVM TOTALReported 841 781 1,622Fixed 612 419 1,031

Page 60: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Q: How about verification?

A: Skeletal Program

Enumeration (SPE)

Page 61: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

program enumeration

qVision: Bounded compiler verification

qGoal: Program enumerationuExhaustive (all small test programs)

uPractical

q Idea: uContext-free grammar to token sequences

uToken sequences to programs (SPE)

Page 62: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

SPE (PLDI’17)

Page 63: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

example 1: wrong code

Page 64: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

example 2: gcc crash

Release blocking

Page 65: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

example 3: clang crash

Page 66: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

general, effective

qFound bugs in many compilersuScala, Rust, Go, …

qVery simple to apply

qNo need to reduce

Page 67: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

ongoing & future work

qExtend EMI to handle floating-point code

qAdapt EMI to other languages & settings

q Support bounded compiler verification

Page 68: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

how about CompCert?

$ ccomp test.c; ./a.out$ ccomp –interp test.cTime 21: program terminated (exit code = 0)$

// test.cint main () {

int a[2] = 0; return 0;

}

// test.light.cint main (void) {

int a[2]; *(a+0) = 0;*(a+1) = 0; return 0;

}

Page 69: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

how about CompCert?

$ ccomp-2.4 test.c; ./a.out$ -116 $ ccomp-2.0 test.c; ./a.out$ 140

// test.c#include <stdio.h>int main(){

int i = '\214';printf("%d\n", i);return 0;

}

Page 70: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

how about CompCert?

$ ccomp-2.6 test.cFatal error: exception File "ia32/Asmexpand.ml", line 191, ……$

// test.cvolatile long long a;unsigned b;int main () {

a = b;return 0;

}

Page 71: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

how about CompCert?

$ ccomp-2.6 –interp –quiet test.c00$ ccomp-2.7 –interp –quiet test.c02$

// test.c#include <stdio.h>int main () {

int t = printf ("0\n");printf ("%d\n", t);return 0;

}

Page 72: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

how about CompCert?

$ ccomp-2.7 test.c…Fatal error: exception File "backend/Regalloc.ml", line 741, ……$

// test.cint a, b, c, d, e, f, g;void fn1 () {

int h, i, j;if (g) {

g = 1;L1: if (1) ;}

short k = ~j;int l = 1 / (h & e & ~d + ((k & ~h) - ((1 | i) & (a | c)))), m = ~~j / (~h | d + a);j = l & m | h;if (j) ;j = k;int n = ~i | f, o = ~b - 1 / -n * ~i, p = f;goto L1;

}int main () { if (a) fn1 ();

return 0; }

Page 73: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

EMIq EMI is general and widely applicable

u Can test compilers, analysis and transformation tools

u Generates real-world tests

u Requires no reference compilers

q EMI realizations are very effectiveu Have uncovered 1622 bugs in GCC and LLVM

u Many were long latent and miscompilations

Page 74: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

conclusion

qCompilers are important & complex

qThey impact reliable & secure coding

qEMI offers powerful compiler testing

qMuch more work is needed

Page 75: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

char *buf = ...;char *buf_end = ...; unsigned int len = ...;if (buf + len >= buf_end)

return; // len too large

if (buf + len < buf)return;//overflow, buf+len wrapped

// write to buf[0..len-1]

#include <string>using std::string;#include <memory>const string getPasswordFromUser() const;bool isPasswordCorrect() {

bool isPasswordCorrect = false;string Password("password");if(Password == getPasswordFromUser()) {

isPasswordCorrect = true;}memset(Password, 0, sizeof(Password));return isPasswordCorrect;

}

EMI Testing: Finding 1000+ Bugs in GCC and LLVM

GCC LLVM TOTAL

Reported 841 781 1,622Fixed 612 419 1,031

Page 76: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

LLVM 3.9 & 4.0 Release Notes “… thanks to Zhendong Su and his teamwhose fuzz testing prevented many bugs

going into the release …”

Page 77: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

GCC’s list of contributors

“Zhendong Su … for reporting numerous bugs”“Chengnian Sun … for reporting numerous bugs”

“Qirun Zhang … for reporting numerous bugs”

https://gcc.gnu.org/onlinedocs//gcc/Contributors.html

Page 78: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

Relationship to MT

qInstance of metamorphic testing (MT) uGiven input i

uConstructed input j

uProperty P holds on i, j

qEMI is the most successful MT instance

Page 79: Lecture 23 COMPILER DESIGN · Announcements • HW6: Analysis & Optimizations –Alias analysis, constant propagation, dead code elimination, register allocation –Due: Tuesday,

a few key problems

q How to select good seed inputs?

q How to decide where & how to mutate?

q How to generate inputs that satisfy a property P?

q How to find missed optimization opportunities?

q How to synthesize optimizations?