Java への変換による 安全な C 言語の実装

  • Upload
    rusti

  • View
    41

  • Download
    1

Embed Size (px)

DESCRIPTION

Java への変換による 安全な C 言語の実装. 上嶋 祐紀  住井 英二郎 (東北大学 大学院 情報科学研究科). 背景. C 言語ではメモリ安全性が保証されていない 予期せぬ動作やセキュリティーホールの原因 Java 言語はメモリ安全とされている. 目的. C 言語のプログラムを Java 言語のプログラム に変換 (そのためのトランスレータを実装). C プログラムのメモリ安全性を保証 ( Java 処理系のメモリ安全性を仮定すれば). + C プログラムを Java バイトコードで配布したり、  ブラウザ上でアプレットとして動かすことも可能に. - PowerPoint PPT Presentation

Citation preview

  • JavaC

  • C

    Java

  • CJavaCJava CJava

  • CJava

    C

  • CJavaJava[ 04] Block (Fat Pointer [Austin 94] [ 01] )FatPtr

  • OutlineJava

  • Java : FatBlock : contents : readFat : writeFat : readByte : : FatPtrbase : FatBlockoffset : basebaseoffsetreadFatcontents

  • int i;int *p;int a[3];FatBlock i = new FatBlock(1);FatBlock p = new FatBlock(1);FatBlock a = new FatBlock(3);readFata0 4 8 poffset 0 writeFatioffset 0 readFat

  • p = &a[1];readFata0 4 8 baseoffsetpoffset 0 writeFatp.writeFat(0 * 4, new FatPtr(a, 1 * 4));

  • p + 1FatPtr temp = p.readFat(0 * 4);new FatPtr(temp.base,temp.offset + 1 * 4)readFata0 4 8 poffset 0readFattemp

  • p + 1FatPtr temp = p.readFat(0 * 4);new FatPtr(temp.base,temp.offset + 1 * 4)readFata0 4 8 poffset 0readFattemp

  • *(char *)p// a[1]intFatPtr temp = p.readFat(0 * 4);temp.base.readByte(temp.offset)readBytea0 4 8 temp0x12345678poffset 0readFatintJava

  • *(char *)pFatPtr temp = p.readFat(0 * 4);temp.base.readByte(temp.offset)readBytea0 4 8 temp0x12345678poffset 0readFatoffset 40x12JavaByte

  • OutlineJavaBlockFatBlockFatPtrFatIntFat

  • BlockJavaFatBlock, ByteBlock, BlockFatBlockByteBlock

  • Blockabstract class Block {int objsize;// Cint size; // int addr;// Object[] contents;// abstract Fat readFat(int vo);// abstract void writeFat(int vo, Fat f); // // }

  • FatBlockclass FatBlock extends Block {Fat[] contents; // FatFatBlock(int n) {objsize = 4; size = 4 * n; contents = new Fat[n];addr = AddrCounter.getAddr();AddrCounter.incrAddr(size);}// AddrCounterFat readFat(int vo) {//if(vo % 4 == 0) return this.contents[vo / 4];else // } // }

  • FatFatPtr:Fat Pointer [Austin 94] [ 01] JavaFatInt:Fat Integer [ 01] JavaFat:FatPtrFatIntFatFatPtrFatInt

  • FatPtrclass FatPtr extends Fat {/* Block base; int offset; */FatPtr(Block b, int n) { base = b; offset = n; }int asInt() { // if(this.base == null) return this.offset; else return this.base.addr + this.offset; }}

  • FatIntCFat Integer [ 01] JavaCFatPtrbasenull

  • FatFatPtrFatIntabstract class Fat {Block base; int offset;abstract int asInt(); }

  • OutlineJava

  • CJavaBlockCJava CFatInt

    C

  • CBlockFatJavaint, long, doubleC

  • CJavaBlock

  • OutlineJava

  • CJava

    Objective Caml

    CCIL [Necula 02]

    Javapretty printerJoust [Cooper]

  • The Computer Language Shootout BenchmarksC

    CPU : Pentium 4 2.80 GHz : 2 GBOS : Linux 2.6GCC 4.0.0 O3 JavaJava JDK 1.5.0

  • nsievespectral-normmandelbrotrecursivepartial-sums

  • nsieve-bitsfannkuchbinary-treesn-body

  • mandelbrot, partial-sumsJava

  • binary-trees, n-bodyBlockBlock

    FatPtrJava

  • nsieve, spectral-norm, recursive, nsieve-bits,fannkuch, binary-trees, n-bodyBlock f(t x) {} f(t x) { t x = x; } xBlockx

  • nsieve, spectral-norm, nsieve-bits, fannkuch, n-bodyBlockJava

  • OutlineJavaCJavaC

  • CJavaJazillian [Jazillian, Inc.]Ephedra [Martin 01]CJavaJava

    CJava

  • CCCured [Necula 02]CCCFail-Safe C [Oiwa 01]CCC

    JavaJavaFail-Safe C

  • OutlineJava

  • JavaC

  • ANSI C gotoCCJavaJavaJITC#MLC SPEC CPU

  • Block f(t x) {} f(t x) { t x = x; } xBlockxtintFatx

    : xJavaint n