Tools and Implementation Xiangyu Zhang. CS590F Software Reliability Outline  Dynamic analysis tools  Binary Decision Diagram  Tools for undeterministic.

Slides:



Advertisements
Similar presentations
Instrumentation of Linux Programs with Pin Robert Cohn & C-K Luk Platform Technology & Architecture Development Enterprise Platform Group Intel Corporation.
Advertisements

Software & Services Group PinPlay: A Framework for Deterministic Replay and Reproducible Analysis of Parallel Programs Harish Patil, Cristiano Pereira,
Dec 5, 2007University of Virginia1 Efficient Dynamic Tainting using Multiple Cores Yan Huang University of Virginia Dec
Program Representations. Representing programs Goals.
Bouncer securing software by blocking bad input Miguel Castro Manuel Costa, Lidong Zhou, Lintao Zhang, and Marcus Peinado Microsoft Research.
Enabling Efficient On-the-fly Microarchitecture Simulation Thierry Lafage September 2000.
Snick  snack A Working Computer Slides based on work by Bob Woodham and others.
Program Representations Xiangyu Zhang. CS590F Software Reliability Why Program Representations  Initial representations Source code (across languages).
August Code Compaction for UniCore on Link-Time Optimization Platform Zhang Jiyu Compilation Toolchain Group MPRC.
Representing programs Goals. Representing programs Primary goals –analysis is easy and effective just a few cases to handle directly link related things.
Chapter 16 Control Unit Operation No HW problems on this chapter. It is important to understand this material on the architecture of computer control units,
CS 104 Introduction to Computer Science and Graphics Problems
1 Lecture 1  Getting ready to program  Hardware Model  Software Model  Programming Languages  The C Language  Software Engineering  Programming.
CSCE 121, Sec 200, 507, 508 Fall 2010 Prof. Jennifer L. Welch.
Dynamic Tainting for Deployed Java Programs Du Li Advisor: Witawas Srisa-an University of Nebraska-Lincoln 1.
Program Representations Xiangyu Zhang. CS590Z Software Defect Analysis Program Representations  Static program representations Abstract syntax tree;
Chapter 16 Control Unit Implemntation. A Basic Computer Model.
Choice for the rest of the semester New Plan –assembler and machine language –Operating systems Process scheduling Memory management File system Optimization.
Chapter 15 IA 64 Architecture Review Predication Predication Registers Speculation Control Data Software Pipelining Prolog, Kernel, & Epilog phases Automatic.
State Machines Used to Design Sequential Circuits.
Dynamic Program Analysis Xiangyu Zhang. 2 CS510 S o f t w a r e E n g i n e e r i n g Introduction Dynamic program analysis is to solve problems regarding.
A. Frank - P. Weisberg Operating Systems Introduction to Cooperating Processes.
Efficient Instruction Set Randomization Using Software Dynamic Translation Michael Crane Wei Hu.
Lecture 7: Instruction Set Architecture CSE 30: Computer Organization and Systems Programming Winter 2014 Diba Mirza Dept. of Computer Science and Engineering.
1.3 Executing Programs. How is Computer Code Transformed into an Executable? Interpreters Compilers Hybrid systems.
Vulnerability-Specific Execution Filtering (VSEF) for Exploit Prevention on Commodity Software Authors: James Newsome, James Newsome, David Brumley, David.
A Portable Virtual Machine for Program Debugging and Directing Camil Demetrescu University of Rome “La Sapienza” Irene Finocchi University of Rome “Tor.
© Janice Regan, CMPT 128, Jan CMPT 128 Introduction to Computing Science for Engineering Students Creating a program.
University of Maryland Compiler-Assisted Binary Parsing Tugrul Ince PD Week – 27 March 2012.
IT253: Computer Organization Lecture 4: Instruction Set Architecture Tonga Institute of Higher Education.
Department of Computer Science A Static Program Analyzer to increase software reuse Ramakrishnan Venkitaraman and Gopal Gupta.
1 Instrumentation of Intel® Itanium® Linux* Programs with Pin download: Robert Cohn MMDC Intel * Other names and brands.
Transmeta and Dynamic Code Optimization Ashwin Bharambe Mahim Mishra Matthew Rosencrantz.
EKT 221/4 DIGITAL ELECTRONICS II  Registers, Micro-operations and Implementations - Part3.
Auther: Kevian A. Roudy and Barton P. Miller Speaker: Chun-Chih Wu Adviser: Pao, Hsing-Kuo.
CE Operating Systems Lecture 3 Overview of OS functions and structure.
Chapter 1 Introduction Chapter 1 Introduction 1 st Semester 2015 CSC 1101 Computer Programming-1.
© Janice Regan, CMPT 300, May CMPT 300 Introduction to Operating Systems Memory: Relocation.
Processes Introduction to Operating Systems: Module 3.
Introduction to Compilers. Related Area Programming languages Machine architecture Language theory Algorithms Data structures Operating systems Software.
1 Compiler Construction (CS-636) Muhammad Bilal Bashir UIIT, Rawalpindi.
Transmeta’s New Processor Another way to design CPU By Wu Cheng
Processor Structure and Function Chapter8:. CPU Structure  CPU must:  Fetch instructions –Read instruction from memory  Interpret instructions –Instruction.
1 Compiler & its Phases Krishan Kumar Asstt. Prof. (CSE) BPRCE, Gohana.
Exploiting Instruction Streams To Prevent Intrusion Milena Milenkovic.
G. Venkataramani, I. Doudalis, Y. Solihin, M. Prvulovic HPCA ’08 Reading Group Presentation 02/14/2008.
The Universal Machine (UM) Implementing the UM Noah Mendelsohn Tufts University Web:
Presented by : A best website designer company. Chapter 1 Introduction Prof Chung. 1.
Introduction to Computer Programming Concepts M. Uyguroğlu R. Uyguroğlu.
Some of the utilities associated with the development of programs. These program development tools allow users to write and construct programs that the.
1 Chapter 2: Operating-System Structures Services Interface provided to users & programmers –System calls (programmer access) –User level access to system.
R Byte Code Optimization Compiler (1) March
1 The user’s view  A user is a person employing the computer to do useful work  Examples of useful work include spreadsheets word processing developing.
Qin Zhao1, Joon Edward Sim2, WengFai Wong1,2 1SingaporeMIT Alliance 2Department of Computer Science National University of Singapore
The purpose of a CPU is to process data Custom written software is created for a user to meet exact purpose Off the shelf software is developed by a software.
Dynamic Instrumentation - Valgrind  Developed by Julian Seward at/around Cambridge University,UK  Google-O'Reilly Open Source Award for "Best Toolmaker"
Translation Lookaside Buffer
Introduction to Operating Systems
Chapter 1 Introduction.
Introduction to Compiler Construction
Olatunji Ruwase* Shimin Chen+ Phillip B. Gibbons+ Todd C. Mowry*
A Case of Dynamic Program Analysis
Chapter 1 Introduction.
Dynamic Instrumentation - Valgrind
Dynamic Program Analysis
MARIE: An Introduction to a Simple Computer
Case Study: Implement A Dynamic Information Flow System in Valgrind
CS5123 Software Validation and Quality Assurance
Computer Systems An Introducton.
Dynamic Binary Translators and Instrumenters
Presentation transcript:

Tools and Implementation Xiangyu Zhang

CS590F Software Reliability Outline  Dynamic analysis tools  Binary Decision Diagram  Tools for undeterministic executions  Static analysis tools

CS590F Software Reliability Dynamic Analysis Tools  Introduction Static instrumentation vs. dynamic instrumentation  How to implement a dynamic information flow

CS590F Software Reliability What Is Instrumentation Max = 0; for (p = head; p; p = p->next) { if (p->value > max) { max = p->value; } printf(“In loop\n”); printf(“True branch\n”); count[0]++; count[1]++;

CS590F Software Reliability What Can Instrumentation Do?  Profiler for compiler optimization: Basic-block count Value profile  Micro architectural study: Instrument branches to simulate branch predictors Generate traces  Bug checking: Find references to uninitialized, unallocated address  Software tools that use instrumentation: Valgrind, Pin, Purify, ATOM, EEL, Diablo, …

CS590F Software Reliability Binary Instrumentation Is Dominant  Libraries are a big pain for source code level instrumentation Proprietary libraries: communication (MPI, PVM), linear algebra (NGA), database query (SQL libraries).  Easily handle multi-lingual programs Source code level instrumentation is heavily language dependent.  More complicated semantics  Turning off compiler optimizations can maintain a almost perfect mapping from instructions to source code lines  Worms and viruses are rarely provided with source code  We will be talking about binary instrumentation only Static Dynamic

CS590F Software Reliability Static Instrumentation (Diablo) *.c*.S*.cpp gccg++asm *.o *.a ld a.out DIABLO b.out Read Object Format Disassemble Bundles Construct ICFG Analyses/Optimizations Serialize ICFG Assemble Bundles Write Object Format

CS590F Software Reliability Static Instrumentation Characteristics  Perform the instrumentation before the code is run New binary = original binary + instrumentation Raise binary to IR, transform IR, transfer back to binary  All libraries are usually statically linked The size of the binary is big  Program representations are usually built from the binary CFG Call graph PDG is hard to build from binary  Points-to analysis on binary is almost impossible  Simple DFA is possible  CDG is almost precise (PDG=CDG+DDG)

CS590F Software Reliability Dynamic Instrumentation - Valgrind  Developed by Julian Seward at/around Cambridge University,UK Google-O'Reilly Open Source Award for "Best Toolmaker" 2006 A merit (bronze) Open Source Award 2004  Open source works on x86, AMD64, PPC code  Easy to execute, e.g.: valgrind --tool=memcheck ls  It becomes very popular One of the two most popular dynamic instrumentation tools  Pin and Valgrind Very good usability, extendibility, robust  25MLOC Mozilla, MIT, CMU-security, Me, and many other places  Overhead is the problem 5-10X slowdown without any instrumentation

CS590F Software Reliability Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input pc BB New BB New pc state

CS590F Software Reliability Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input 1 1 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 5: s2; 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) OUTPUT:

CS590F Software Reliability Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 5: s2; 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) OUTPUT:

CS590F Software Reliability Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 5: s2; 1: do { print(“1”) 2: i=i+1; 3: s1; 4: } while (i<2) 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) OUTPUT:

CS590F Software Reliability Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 5: s2; 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) OUTPUT: 1: do { print(“1”) i=i+1; s1; } while (i<2) 1 1 1

CS590F Software Reliability Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 5: s2; OUTPUT: 1: do { print(“1”) i=i+1; s1; } while (i<2) : s2;

CS590F Software Reliability Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 5: s2; 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) OUTPUT: 1: do { print(“1”) i=i+1; s1; } while (i<2) 11 5: print (“5”); s2;

CS590F Software Reliability 5: print (“5”); s2; Valgrind Infrastructure Binary Code VALGRIND CORE Dispatcher BB Decoder BB Compiler Trampoline Tool 1 Tool 2 Runtime Instrumenter Tool n …… Input 1: do { 2: i=i+1; 3: s1; 4: } while (i<2) 5: s2; OUTPUT: 1: do { print(“1”) i=i+1; s1; } while (i<2) 11 5

CS590F Software Reliability Dynamic Instrumentation Characteristics  A trampoline is required.  Does not require recompiling or relinking Saves time: compile and link times are significant in real systems. Can instrument without linking (relinking is not always possible).  Dynamically turn on/off, change instrumentation From t1-t2, I want to execute F’, t3-t4, I want F’’  Can be done by invalidating the mapping in the dispatcher.  Can instrument running programs (such as Web or database servers) Production systems.  Can instrument self-mutating code. Obfuscation can be easily get around.

CS590F Software Reliability Dynamic Instrumentation Characteristics  Overhead is high Dispatching, indexing; Dynamic instrumentation  Usually does not provide program representations at run time Hard to acquire Unacceptable runtime overhead Simple representations such as BB are provided GET AROUND: combine with static tools  Diablo + valgrind

CS590F Software Reliability Case Study: Implement A Dynamic Information Flow System in Valgrind

CS590F Software Reliability Information Flow System  IFS is important Confidentiality at runtime = IFS Tainted analysis = IFS Memory reference errors detection = IFS Data lineage system = IFS Dynamic slicing is partly an IFS  Essence of an IFS A runtime abstract interpretation engine  Driven by the executed program path  Implementation on Valgrind is surprisingly easy Will see

CS590F Software Reliability Language and Abstract Model  Our binary (RISC) ADD r1 / #Imm, r2 LOAD [r1 / #Imm], r2 STORE r1, [r2 / #Imm] MOV r1 / #Imm, r2 CALL r1 SYS_READ r1, r2  r1 is the starting address of the buffer, r2 is the size  Abstract state One bit, the security bit (tainted bit) Prevent call at tainted value.

CS590F Software Reliability Implement A New Tool In Valgrind  Use a template The tool lackey is good candidate Two parts to fill in  Instrumenter  Runtime  Instrumenter Initialization Instrumentation Finalization System calls interception  Runtime Transfer functions Memory management for abstract state Runtime Instrumenter Tool n

CS590F Software Reliability How to Store Abstract State  Shadow memory We need a mapping  Addr  Abstract State  Register  Abstract State Virtual SpaceShadow Space [addr] valabs typedef struct { UChar abits[65536]; } SecMap; static SecMap* primary_map[65536]; static SecMap default_map;

CS590F Software Reliability How to Store Abstract State Virtual SpaceShadow Space [addr] valabs typedef struct { UChar abits[65536]; } SecMap; static SecMap* primary_map[65536]; static SecMap default_map; static void init_shadow_memory ( void ) { for (i = 0; i < 65536; i++) default_map.abits[i] = 0; for (i = 0; i < 65536; i++) primary_map[i] = &default_map; }

CS590F Software Reliability How to Store Abstract State Virtual SpaceShadow Space [addr] valabs typedef struct { UChar abits[65536]; } SecMap; static SecMap* primary_map[65536]; static SecMap default_map; static void init_shadow_memory ( void ) { for (i = 0; i < 65536; i++) default_map.abits[i] = 0; for (i = 0; i < 65536; i++) primary_map[i] = &default_map; } static SecMap* alloc_secondary_map () { map =VG_(shadow_alloc)(sizeof(SecMap)); for (i = 0; i < 65536; i++) map->abits[i] = 0; return map; }

CS590F Software Reliability How to Store Abstract State Virtual SpaceShadow Space [addr] valabs typedef struct { UChar abits[65536]; } SecMap; static SecMap* primary_map[65536]; static SecMap default_map; static void init_shadow_memory ( void ) { for (i = 0; i < 65536; i++) default_map.abits[i] = 0; for (i = 0; i < 65536; i++) primary_map[i] = &default_map; } static SecMap* alloc_secondary_map () { map =VG_(shadow_alloc)(sizeof(SecMap)); for (i = 0; i < 65536; i++) map->abits[i] = 0; return map; } void Accessible (addr) { if (primary_map[(addr) >> 16] == default_map) primary_map[(addr) >> 16] = alloc_secondary_map(caller); }

CS590F Software Reliability Initialization void SK_(pre_clo_init)(void) { VG_(details_name) (“CS590F IFS"); … init_shadow_memory(); … VG_(needs_shadow_memory) (); VG_(needs_shadow_regs) (); … VG_(register_noncompact_helper)((Addr) & RT_load); VG_(register_noncompact_helper)((Addr) & …); … }

CS590F Software Reliability Finalization  EMPTY void SK_(fini)(Int exitcode) { }

CS590F Software Reliability Instrumentation & Runtime UCodeBlock* SK_(instrument)(UCodeBlock* cb_in, …) { … UCodeBlock cb = VG_(setup_UCodeBlock)(…); … for (i = 0; i < VG_(get_num_instrs)(cb_in); i++) { u = VG_(get_instr)(cb_in, i); switch (u->opcode) { case LD: … case ST: … case MOV: … case ADD: … case CALL: … return cb; }

CS590F Software Reliability Instrumentation & Runtime - LOAD switch (u->opcode) { case LD: } VG_(ccall_RR_R) (cb, (Addr) RT_load, u-> r1, SHADOW (u->r1), SHADOW(U->r2) UChar RT_load (Addr r1, UChar sr1) { UChar s_bit=primary_map[a >> 16][a && 0xffff]; return (s_bit | sr1); } LD [r1], r2 SHADOW(r2)=SM(r1) | SHADOW (r1)

CS590F Software Reliability Instrumentation & Runtime - STORE switch (u->opcode) { case ST: } VG_(ccall_RRR_0) (cb, (Addr) RT_store, u->r2, SHADOW (u->r1), SHADOW(u->r2); void RT_store (Addr a, UChar sr1, UChar sr2) { UChar s_bit= sr1 | sr2; Accessible(a); primary_map[a >> 16][a && 0xffff]=s_bit; } ST r1, [r2] SM(r2)=SHADOW(r1) | SHADOW (r2)

CS590F Software Reliability Instrumentation & Runtime - MOV switch (u->opcode) { case MOV: } uInstr2(cb, MOV,…, SHADOW(u->r1), … SHADOW(u->r2) MOV r1, r2 SHADOW(r2) = SHADOW (r1)

CS590F Software Reliability Instrumentation & Runtime - ADD switch (u->opcode) { case ST: } VG_(ccall_RR_R) (cb, (Addr) RT_add, SHADOW(u->r1), SHADOW (u->r2), SHADOW(u->r2); UChar RT_add (UChar sr1, UChar sr2) { return sr1 | sr2; } ADD r1, r2 SHADOW(r2) = SHADOW (r1) | SHADOW (r2)

CS590F Software Reliability Instrumentation & Runtime - CALL switch (u->opcode) { case ST: } VG_(ccall_R_0) (cb, (Addr) RT_call, SHADOW(u->r1)); UChar RT_call (UChar sr1) { if (sr1) VG_(printf) (“Please call CS590F\n”); } CALL r1 if (SHADOW(r1)) printf (“Pleae call CS590F”)

CS590F Software Reliability Instrumentation & Runtime – SYS_READ void * SK_(pre_syscall) (… UInt syscallno…) { … if (syscallno==SYSCALL_READ) { get_syscall_params (…, &r1, &r2,…); for (i=0;i<r2;i++) { a= &r1[i]; Accessible(a); primary_map[a >> 16][a && 0xffff]=1; } … } SYS_READ r1, r2 SM (r1[0-r2])=1

CS590F Software Reliability Done!  Let us run it through a buffer overflow exploit void (* F) (); char A[2];... read(B, 256); i=2; A[i]=B[i];... (*F) ();

CS590F Software Reliability... MOV &B, r1 MOV 256, r2 SYS_Read r1, r2... MOV 2, r1 ST r1, [&i]... LD [&i], r1 MOV &B, r2 ADD r1, r2 LD [r2], r2 MOV &A, r3 ADD r1, r3 ST r2, [r3]... MOV F, r1 CALL r1 void (* F) (); char A[2];... read(B, 256);... i=2;... A[i]=B[i];... (*F) (); Virtual SpaceShadow Space F A[1] A[0] B r1 r2 r3 SM (r1[0-r2])=1 11…111…1 i SM(&i)=SHADOW(r1)

CS590F Software Reliability... MOV &B, r1 MOV 256, r2 SYS_Read r1, r2... MOV 2, r1 ST r1, [&i]... LD [&i], r1 MOV &B, r2 ADD r1, r2 LD [r2], r2 MOV &A, r3 ADD r1, r3 ST r2, [r3]... MOV F, r1 CALL r1 void (* F) (); char A[2];... read(B, 256);... i=2;... A[i]=B[i];... (*F) (); Virtual SpaceShadow Space F A[1] A[0] B r1 r2 r3 11…111…1 i SHADOW(r2)=SM(r2) | SHADOW (r2) r2=&B[2]; 1 SM (r3)=SHADOW(r2) | SHADOW (r3) r3=&A[2] 1

CS590F Software Reliability... MOV &B, r1 MOV 256, r2 SYS_Read r1, r2... MOV 2, r1 ST r1, [&i]... LD [&i], r1 MOV &B, r2 ADD r1, r2 LD [r2], r2 MOV &A, r3 ADD r1, r3 ST r2, [r3]... MOV F, r1 CALL r1 void (* F) (); char A[2];... read(B, 256);... i=2;... A[i]=B[i];... (*F) (); Virtual SpaceShadow Space F A[1] A[0] B r1 r2 r3 11…111…1 i 1 1 SHADOW(r1)=SM(F); 1 if (SHADOW(r1)) printf (“Call …”);

CS590F Software Reliability What Is Not Covered  Information flow through control dependence Valgrind is not able to handle Valgrind + diablo p=getpassword( ); … if (p==“zhang”) { send (m); }

CS590F Software Reliability Outline  Dynamic analysis tools  Binary Decision Diagram  Tools for undeterministic executions  Static analysis tools

CS590F Software Reliability Why BDD?  It is an efficient representation for boolean functions What can be represented by boolean functions?  Sets, relations, … What is program analysis about (both static and dynamic)  Manipulating sets  Existing applications In PA  Points-to analysis  Dynamic slicing  Data lineage  Test prioritization (??) Others  Circuit optimization

CS590F Software Reliability Points-to Analysis Using BDD Unification based flow-insensitive analysis

CS590F Software Reliability BDD representation  A BDD is a compact representation of a boolean function  The points-to relations can be encoded into a boolean function

CS590F Software Reliability BDD representation

CS590F Software Reliability BDD Representation

CS590F Software Reliability BDD Representation

CS590F Software Reliability BDD Representation

CS590F Software Reliability BDD Representation

CS590F Software Reliability Final Reduced BDD

CS590F Software Reliability BDD Operations  Set operations Union, intersection,…  Relational product  Cost of the operations is proportional to the number of nodes, not the elements in the set (relation)

CS590F Software Reliability Mapping Points-to Transfer Functions to BDD Operations (b,a) Y=(V,H) X=(V,V) b=a; (b,X) Relational product rule

CS590F Software Reliability BDD in Dynamic Analysis (Data Lineage)  What is Data Lineage Given a value during the execution, the lineage of the value is the set of input that contributes to computation of the value.  BDD is the perfect choice for lineage sets Z=X+Y  L(Z) = L(X) U L(Y)  BDD in dynamic slicing  BDD in …  Tool BuDDy

CS590F Software Reliability Outline  Dynamic analysis tools  Binary Decision Diagram  Tools for undeterministic executions  Static analysis tools

CS590F Software Reliability Jockey  Execution record/replay tool (OPEN SOURCE) X86 binaries Used as a user-space library Handle multi-threading programs Checkpointing  How it works Use code pattern matching to identify all the system calls and replace them Record phase Replay phase

CS590F Software Reliability Simics-A Simulator  full system simulation technology (NOT FULLY OPEN SOURCE) the software cannot detect the difference between real production hardware and Simics' virtual environment. Have the full control over the entire execution context  Application code  OS code  Driver code Fast  Widely used in multi-core related research

CS590F Software Reliability Outline  Dynamic analysis tools  Binary Decision Diagram  Tools for undeterministic executions  Static analysis tools

CS590F Software Reliability Static Analysis Tool  Previously SUIF TRIMARAN  Currently CodeSurfer CIL