• Mindscape ๐Ÿ”ฅ
    • Playlist ๐ŸŽง
  • Algorithm

    • 1018๋ฒˆ: ์ฒด์ŠคํŒ ๋‹ค์‹œ ์น ํ•˜๊ธฐ
    • 1966๋ฒˆ: ํ”„๋ฆฐํ„ฐ ํ
    • Python ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํŒ
    • C++ std::vector ์‚ฌ์šฉ๋ฒ• ์ •๋ฆฌ
    • Vim ์‚ฌ์šฉ ๋งค๋‰ด์–ผ
  • Ubuntu

    • ๋ฆฌ๋ˆ…์Šค ์šฐ๋ถ„ํˆฌ GRUB ํฐํŠธ ๋ณ€๊ฒฝ
    • ์šฐ๋ถ„ํˆฌ ์ด๋ฏธ์ง€ ๋น„๋””์˜ค ์ธ๋„ค์ผ(๋ฏธ๋ฆฌ๋ณด๊ธฐ) ์•ˆ ๋ณด์ž„ ๋ฌธ์ œ ํ•ด๊ฒฐ
    • Wine ํ™˜๊ฒฝ์—์„œ ์นด์นด์˜คํ†ก ์‹คํ–‰ ์‹œ explorer.exe ๋œจ์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฒ•
    • ์šฐ๋ถ„ํˆฌ Wine ์นด์นด์˜คํ†ก ์‚ฌ์ง„ ์ด๋ฏธ์ง€ ์Šคํฌ๋ฆฐ์ƒท ๋ถ™์—ฌ๋„ฃ๊ธฐ
    • Wine ์นด์นด์˜คํ†ก ์ด๋ชจ์ง€ ๊นจ์ง ๋ฌธ์ œ ํ•ด๊ฒฐ
    • Ubuntu ์œˆ๋„์šฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋„๊ธฐ
  • Wellness

    • ์ฐจ์ „์žํ”ผ (Psyllium Husk)
    • ์—‘์ŠคํŠธ๋ผ ๋ฒ„์ง„ ์˜ฌ๋ฆฌ๋ธŒ์œ  (Extra Virgin Olive Oil)
    • ์ž๊ฐ€๋น„๊ฐ•์„ธ์ฒ™ (Nasal Irrigation)
    • QCY HT08 (MeloBuds Pro Plus)
    • ์ฝ˜์„œํƒ€ (Concerta)
    • ์ธ๋ฐ๋†€ (Inderal)
    • ์„คํŠธ๋ž„๋ฆฐ (Sertraline)
    • ๋ฉœ๋ผํ† ๋‹Œ (Melatonin)
    • ์น˜๊ฒฝ๋ถ€ ๋งˆ๋ชจ์ฆ
    • ๋ฐ”๋ฒจ ์Šค์ฟผํŠธ (Barbell Squat)
  • Humanities

    • Nordvik, Russia
    • North Sentinel Island
    • ๋กฑ๊ณ ๋กฑ๊ณ (Rongorongo)
    • ๋ฐ”๋กœํฌ ์Œ์•… (Baroque Music)
  • Design

    • ๊ตฌ๊ธ€์˜ ์•„์ด์ฝ˜ ๋Œ€๊ฐœํŽธ โ€” 6๋…„ ๋งŒ์˜ ์‹ค์ˆ˜ ์ธ์ •
    • ์ œ๋Ÿด๋“œ ์  ํƒ€ โ€” ๋Ÿญ์…”๋ฆฌ ์Šคํฌ์ธ  ์›Œ์น˜์˜ ์ฐฝ์‹œ์ž
    • ๋ฐ”์šฐํ•˜์šฐ์Šค โ€” ํ˜„๋Œ€ ๋””์ž์ธ์˜ ์›์ 
  • Brands

    • NOMOS Glashรผtte
    • Frรฉdรฉrique Constant
    • KZ (Knowledge Zenith)
    • ์—์ŠคํŠธ๋ผ (AESTURA)
    • JINHAO (้‡‘่ฑช)
    • Herman Miller
    • ๋ฐ์Šค์ปค (DESKER)
    • ๋ฌด์‹ ์‚ฌ ์Šคํƒ ๋‹ค๋“œ (Musinsa Standard)
  • Finance

    • ํ˜„๋Œ€์นด๋“œ ZERO โ€” Edition2 vs Edition3 ๋น„๊ต
    • ์‹ ํ•œ์นด๋“œ ์ฒ˜์Œ
    • S&P 500 ETF ํˆฌ์ž ๊ฐ€์ด๋“œ
    • ํŒŒํ‚นํ†ต์žฅ vs CMA ํ†ต์žฅ
    • ๋ฒ„ํฌ์…” ํ•ด์„œ์›จ์ด (Berkshire Hathaway)
    • ๋น„ํŠธ์ฝ”์ธ(Bitcoin)
  • Products

    • ์˜ค๋””์˜ค ์ธํ„ฐํŽ˜์ด์Šค (Audio Interface)
    • ์ฟ ๋ฃจํ† ๊ฐ€ (KURUTOGA)
    • CX31993 DAC ๋™๊ธ€
    • ํด๋ Œ์ง• ๋ฐ€ํฌ (Cleansing Milk)
    • ํ”ผ์ ฏ ํ† ์ด (Fidget Toy)
    • ThinkPad
  • Programming Languages

    • 8.0. Statement Level Control Structures
    • 8. Subprogram
    • 9. Implementing Subprogram
    • 10.1. Abstract Data Types and Encapsulation Constructs
    • 10.2. Support for Object Oriented Programming
    • 11. Concurrency
    • 12. FPL (1)
    • 13. FPL (2)
    • 14. Exception Handling and Event Handling
    • Final Exam

16. Static Analysis

์ž‘์„ฑ 2026. 6. 12.ยท์ˆ˜์ • 2026. 6. 12.

Learning Goals

  • ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ •์  ๋ถ„์„ ์ •์˜ ๋ฐ ์ •์  ๋ถ„์„์ด ๋ชฉํ‘œ๋กœ ํ•˜๋Š” Bug ์œ ํ˜• ์„ค๋ช…
  • Syntactic ๋˜๋Š” Structural ์ •์  ๋ถ„์„์˜ ์˜ˆ์‹œ ์ œ์‹œ
  • ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ ์ธ Control Flow Graph๋ฅผ ์ˆ˜์ž‘์—…์œผ๋กœ ์ž‘์„ฑ
  • Control-flow ๋ถ„์„๊ณผ Dataflow ๋ถ„์„์˜ ๊ตฌ๋ณ„, ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ์˜ ์ •์˜ ๋ฐ ๋‹จ๊ณ„๋ณ„ ์ˆ˜ํ–‰
  • Dataflow Analysis ๊ตฌํ˜„
  • ์ •์  ๋ถ„์„์ด ์™œ Sound, Complete, Terminatingํ•  ์ˆ˜ ์—†๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ์ฐจ์›์  ์„ค๋ช… ๋ฐ ๋ถ„์„ ์„ค๊ณ„์˜ trade-off ํ‰๊ฐ€
  • ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„๊ตฌ์˜ ํŠน์„ฑ ํŒŒ์•… ๋ฐ ์„ ํƒ

goto fail;

static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams, uint8_t *signature, UInt16 signatureLen) {
    OSStatus err;
    โ€ฆ
    if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
      goto fail;
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
      goto fail;
      goto fail;
    if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
        goto fail;
    โ€ฆ
    fail
    SSLFreeBuffer(&signedHashes);
    SSLFreeBuffer(&hashCtx);
    return err;
}

A Bug in the Old Linux Kernel

/* from Linux 2.3.99 drivers/block/raid5.c */
static struct buffer_head *
get_free_buffer(struct stripe_head * sh, int b_size) {
    struct buffer_head *bh;
    unsigned long flags;
    save_flags(flags);
    cli(); // disables interrupts
    if ((bh = sh->buffer_pool) == NULL)
        return NULL;
    sh->buffer_pool = bh -> b_next;
    bh->b_size = b_size;
    restore_flags(flags); // re-enables interrupts
    return bh;
}

Could You Have Found Them?

  • ์ด๋Ÿฌํ•œ Bug๋“ค์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฐœ์ƒํ•  ๊ฒƒ์ธ๊ฐ€
  • Driver Bug
    • Interrupt๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ Driver๋กœ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์ผ
    • ๊ณ ๋ ค์‚ฌํ•ญ: ๋‹จ์ผ ํ•จ์ˆ˜
  • 2000์ค„(LOC) ํŒŒ์ผ ๋‚ด์˜ ๊ฒฝ์šฐ
  • 60,000์ค„(LOC) ๋ชจ๋“ˆ ๋‚ด์˜ ๊ฒฝ์šฐ
  • ๋ฆฌ๋ˆ…์Šค ์ปค๋„(LINUX KERNEL) ๋‚ด๋ถ€์˜ ๊ฒฝ์šฐ
  • ๊ตํ›ˆ: ์ผ๋ถ€ ๊ฒฐํ•จ์€ ํ…Œ์ŠคํŠธ๋‚˜ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด ๋ฐœ๊ฒฌํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์›€

https://www.cnet.com/news/privacy/klocwork-our-source-code-analyzer-caught-apples-gotofail-bug/

Defects of Interest

  • ํ…Œ์ŠคํŠธ์™€ ๋Œ€์กฐ์ ์œผ๋กœ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ•์ œํ•˜๊ธฐ ์–ด๋ ค์šด ์‹คํ–‰ ๊ฒฝ๋กœ์ƒ์— ์กด์žฌ
  • ์ด๋Ÿฌํ•œ ๊ฒฐํ•จ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์‹คํ–‰(๋˜๋Š” ํ•ด์„/๋ถ„์„)ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ
  • ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์ฒด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ๊ณต๊ฐ„(State Space)์„ ํ™•์ธํ•˜์—ฌ ํŠน์ • ์†์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ

Defects Static Analysis Can Catch

  • ๋‹จ์ˆœํ•˜๊ณ  ๊ธฐ๊ณ„์ ์ธ ์„ค๊ณ„ ๊ทœ์น™์„ ์ผ๊ด€๋˜๊ฒŒ ๋”ฐ๋ฅด์ง€ ์•Š์Œ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐํ•จ.
    • Security: Buffer ์˜ค๋ฒ„๋Ÿฐ, ๋ถ€์ ์ ˆํ•˜๊ฒŒ ๊ฒ€์ฆ๋œ ์ž…๋ ฅ
    • Memory safety: Null ์—ญ์ฐธ์กฐ, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ
    • Resource leaks: Memory, OS ๋ฆฌ์†Œ์Šค
    • API Protocols: Device drivers, ์‹ค์‹œ๊ฐ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, GUI ํ”„๋ ˆ์ž„์›Œํฌ
    • Exceptions: ์‚ฐ์ˆ /๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์‚ฌ์šฉ์ž ์ •์˜
    • Encapsulation: ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ, ๋น„๊ณต๊ฐœ ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • Data races: ๋™๊ธฐํ™” ์—†์ด ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ
  • Key: ๋‹จ์ˆœํ•˜๊ณ  ๊ธฐ๊ณ„์ ์ธ ์„ค๊ณ„ ๊ทœ์น™ ์ค€์ˆ˜ ์—ฌ๋ถ€ ํ™•์ธ

Defining Static Analysis

What is Static Analysis?

  • ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ ๊ณต๊ฐ„์˜ ์ถ”์ƒํ™”์— ๋Œ€ํ•œ ์ฒด๊ณ„์ ์ธ ๊ฒ€์‚ฌ
    • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์Œ(์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ์œ ์‚ฌ)
  • Abstraction: ๋ถ„์„ํ•˜๊ธฐ ๋” ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ํ‘œํ˜„ ์ƒ์„ฑ
    • ํƒ์ƒ‰ํ•  ์ƒํƒœ ์ˆ˜๊ฐ€ ์ ์–ด์ง, ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ฌ
  • ์ „์ฒด ์ƒํƒœ ๊ณต๊ฐ„์— ๋Œ€ํ•ด ํŠน์ • ์†์„ฑ์ด ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธ
    • Liveness: "์ข‹์€ ์ผ์ด ๊ฒฐ๊ตญ ๋ฐœ์ƒํ•จ"
    • Safety: "๋‚˜์œ ์ผ์ด ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ"

The Bad News: Riceโ€™s Theorem

"ํŠœ๋ง ๋จธ์‹ ์— ์˜ํ•ด ์ธ์‹๋˜๋Š” ์–ธ์–ด์— ๋Œ€ํ•œ ๋น„์ž๋ช…ํ•œ ์†์„ฑ์€ ๊ฒฐ์ • ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค" (Henry Gordon Rice, 1953)

  • ๋ชจ๋“  ์ •์  ๋ถ„์„์€ ํ•„์—ฐ์ ์œผ๋กœ Incompleteํ•˜๊ฑฐ๋‚˜ Unsoundํ•˜๊ฑฐ๋‚˜ Undecidableํ•จ (ํ˜น์€ ์ด๊ฒƒ๋“ค์˜ ๋ณตํ•ฉ)

Soundness and Completeness

์—๋Ÿฌ ์กด์žฌ์—๋Ÿฌ ์กด์žฌํ•˜์ง€ ์•Š์Œ
์—๋Ÿฌ ๋ณด๊ณ ๋จTrue positive
(correct analysis result)
False positive
์—๋Ÿฌ ๋ณด๊ณ ๋˜์ง€ ์•Š์ŒFalse negativeTrue negative
(correct analysis result)
  • Sound Analysis
    • ๋ชจ๋“  ๊ฒฐํ•จ์„ ๋ณด๊ณ 
    • False negative๊ฐ€ ์—†์Œ
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณผ๋Œ€ ๊ทผ์‚ฌ(Overapproximated)
  • Complete Analysis
    • ๋ณด๊ณ ๋œ ๋ชจ๋“  ๊ฒฐํ•จ์ด ์‹ค์ œ ๊ฒฐํ•จ์ž„
    • False positive ์—†์Œ
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณผ์†Œ ๊ทผ์‚ฌ(Underapproximated)

alt text

Simple Syntactic and Structural Analyses

Syntactic Analysis

  • ํŠน์ • ํŒจํ„ด์˜ ๋ชจ๋“  ๋ฐœ์ƒ ์ฐพ๊ธฐ
public foo() {
  โ€ฆ
  logger.debug(โ€œWe have โ€ + conn + โ€œconnections.โ€);
} 
public foo() {
  โ€ฆ
    if (logger.inDebug()) {
    logger.debug(โ€œWe have โ€ + conn + โ€œconnections.โ€);
    }
}
  • Grep ๋ช…๋ น์–ด ์˜ˆ์‹œ: grep "if \(logger\.Debug\(" . -r

Type Analysis

public void foo() {
    int a = computeSomething();

    if (a == "5")
        doMoreStuff();
}

Abstraction: Abstract Syntax Tree

  • ์†Œ์Šค ์ฝ”๋“œ์˜ ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ํŠธ๋ฆฌ๋กœ ํ‘œํ˜„
    • Parser๊ฐ€ ๊ตฌ์ฒด์ ์ธ ๊ตฌ๋ฌธ์„ ์ถ”์ƒ ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๊ฒฐ๊ณผ์ ์ธ ๋ชจํ˜ธ์„ฑ ์ฒ˜๋ฆฌ
  • ์˜๋ฏธ์ ์œผ๋กœ ๊ด€๋ จ๋œ ์ •๋ณด๋งŒ ๊ธฐ๋ก
    • Abstract: ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ(๊ด„ํ˜ธ ๋“ฑ)์„ ํ‘œํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์€ ๊ตฌ์กฐ์—์„œ ์œ ์ถ” ๊ฐ€๋Šฅ
  • ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ์˜ˆ์‹œ: 5+(2+3)5 + (2 + 3)5+(2+3)

Type Checking

  • Class X, Logger ๋“ฑ์˜ ๊ตฌ์กฐ ๋ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ ๋ฐ ์ฝ”๋“œ
  • Class X
    • Field: logger
    • Method: foo
      • If stmt
        • Method Invoc.: logger inDebug
        • Block
          • Method Invoc.: logger debug
          • Param.: String ์—ฐ๊ฒฐ
  • Logger ํด๋ž˜์Šค ๊ตฌ์กฐ
    • boolean inDebug() {โ€ฆ}
    • void debug(String msg) {โ€ฆ}alt text

Abstract Syntax Tree Walker

  • Logger.inDebug ์ฒดํฌ ์™ธ๋ถ€์—์„œ ๋””๋ฒ„๊น… ๋กœ๊ทธ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ
  • Abstraction
    • Logger.debug() ํ˜ธ์ถœ๋งŒ ํ™•์ธ
    • ๋ชจ๋‘ if (Logger.inDebug())๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธ
  • Systematic: ๋ชจ๋“  ์ฝ”๋“œ ๊ฒ€์‚ฌ
  • Abstract Syntax Tree (AST) Walker๋กœ ์•Œ๋ ค์ง
    • ์ฝ”๋“œ๋ฅผ ๊ตฌ์กฐํ™”๋œ ํŠธ๋ฆฌ๋กœ ์ทจ๊ธ‰
    • Control Flow, ๋ณ€์ˆ˜ ๊ฐ’, Heap ๋ฌด์‹œ
    • Code style checker๊ฐ€ ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™

Structural Analysis

alt text

Bug Finding

Structural Analysis to Detect goto fail;?

  • goto fail; ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ SSLVerifySignedServerKeyExchange ํ•จ์ˆ˜ ์ฝ”๋“œ ์žฌ์ œ์‹œ

Summary of Syntactic/Structural Analyses

  • Token ์ŠคํŠธ๋ฆผ ๋˜๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ(AST) ๋ถ„์„
  • ํŒจํ„ด์„ ์ฐพ๋Š” ๋ฐ ์œ ์šฉ
  • ์‹คํ–‰ ๊ฒฝ๋กœ์™€ ๋ฌด๊ด€ํ•œ ๊ตญ์†Œ์ /๊ตฌ์กฐ์  ์†์„ฑ

Tools

  • Checkstyle
  • ๋‹ค์ˆ˜์˜ Linter (C, JS, Python ๋“ฑ)
  • Find bugs (์ผ๋ถ€ ๋ถ„์„)

Tools: Compilers

  • Type checking, ์ ์ ˆํ•œ ์ดˆ๊ธฐํ™” API, ์˜ฌ๋ฐ”๋ฅธ API ์‚ฌ์šฉ

  • ํ”„๋กœ๊ทธ๋žจ

    int add(int x, int y) {
        return x + y;
    }
    
    void main() {
        add(2);
    }
    
  • ์ปดํŒŒ์ผ๋Ÿฌ ์ถœ๋ ฅ

    $> error: too few arguments to function 'int add(int, int)'
    
  • ๋†’์€ ๊ฒฝ๊ณ  ๋ ˆ๋ฒจ๋กœ ์ปดํŒŒ์ผ

    • ์˜ˆ: $ gcc -Wall

Control-Flow Analysis

Control/Dataflow Analysis

  • Control Flow Graph๋ฅผ ํ†ตํ•œ ๊ฒฝ๋กœ๋กœ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์‹คํ–‰์— ๋Œ€ํ•ด ์ถ”๋ก 
    • ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ์ง€์ ์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์†์„ฑ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด ์ถ”์ 
    • Exception ์ฒ˜๋ฆฌ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ ํฌํ•จ.
  • ๊ด€์‹ฌ ์žˆ๋Š” ์†์„ฑ๊ณผ ๊ด€๋ จ๋œ ๊ฐ’/์ƒํƒœ๋งŒ ํฌ์ฐฉํ•˜๋Š” Abstract domain ์ •์˜
  • ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์‹คํ–‰(๊ฒฝ๋กœ)์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ตฌ์ฒด์ ์ธ ๊ฐ’ ๋Œ€์‹  Abstract state ์ถ”์ 

Control Flow Graphs

  • ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•œ ์ œ์–ด ํ๋ฆ„์˜ ํŠธ๋ฆฌ/๊ทธ๋ž˜ํ”„ ๊ธฐ๋ฐ˜ ํ‘œํ˜„
    • ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ๊ฒฝ๋กœ ํฌ์ฐฉ
  • ๊ฐ ๋…ธ๋“œ๋Š” Basic block: ๋‚ด๋ถ€๋กœ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ๋‚˜๊ฐ€๋Š” ์ ํ”„ ์—†์Œ
  • ์—ฃ์ง€(Edges)๋Š” ๋…ธ๋“œ ๊ฐ„์˜ ์ œ์–ด ํ๋ฆ„ ์˜ต์…˜ ํ‘œํ˜„
  • Intra-procedural: ๋‹จ์ผ ํ•จ์ˆ˜ ๋‚ด (cf. Inter-procedural)
a = 5 + (2 + 3)
if (b > 10)
    a = 0;
return a;

alt text

  • ๋…ธ๋“œ 0~6์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ

Control Flow Graphs (CFG)

public int foo() {
    doStuff();

    return 3;

    doMoreStuff();
    return 4;
}

alt text

A Bug in the Old Linux Kernel

  • ๋ฆฌ๋ˆ…์Šค RAID ๋“œ๋ผ์ด๋ฒ„(raid5.c)์˜ get_free_buffer ํ•จ์ˆ˜ ์ฝ”๋“œ
  • ํ•ด๋‹น ํ•จ์ˆ˜์— ๋Œ€ํ•œ Control Flow Graph ๊ทธ๋ฆฌ๊ธฐ (๋‹จ์ˆœํ™” ํฌํ•จ)

Example of a CFG

  • int foo() ํ•จ์ˆ˜ ์˜ˆ์ œ ์ฝ”๋“œ
    • save_flags, cli, dont_interrupt ํ˜ธ์ถœ
    • if (rv > 0) ๋ถ„๊ธฐ ๋ฐ ๋ณต๊ตฌ ๋กœ์ง
  • Entry๋ถ€ํ„ฐ Exit๊นŒ์ง€์˜ ํ๋ฆ„๋„ ํ‘œํ˜„
  • ๋™์ผํ•œ foo() ํ•จ์ˆ˜์˜ ํ๋ฆ„๋„ ํ‘œํ˜„ ๋ฐ˜๋ณต

alt text

Control/Dataflow Analysis

  • Control Flow Graph๋ฅผ ํ†ตํ•œ ๊ฒฝ๋กœ๋กœ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์‹คํ–‰์— ๋Œ€ํ•ด ์ถ”๋ก 
    • ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ์ง€์ ์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์†์„ฑ๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด ์ถ”์ 
    • Exception ์ฒ˜๋ฆฌ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋“ฑ ํฌํ•จ.
  • ๊ด€์‹ฌ ์žˆ๋Š” ์†์„ฑ๊ณผ ๊ด€๋ จ๋œ ๊ฐ’/์ƒํƒœ๋งŒ ํฌ์ฐฉํ•˜๋Š” Abstract domain ์ •์˜
  • ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ์‹คํ–‰(๊ฒฝ๋กœ)์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ตฌ์ฒด์ ์ธ ๊ฐ’ ๋Œ€์‹  Abstract state ์ถ”์ 

Abstract Domain: Lattices

  • Lattice D=(S,r)D = (S, r)D=(S,r)
    • DDD๋Š” ํ”„๋กœ๊ทธ๋žจ ์†์„ฑ์˜ Domain
    • SSS๋Š” ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ(๋ฌดํ•œํ•  ์ˆ˜ ์žˆ์Œ)
  • SSS๋Š” ์œ ์ผํ•œ ์ตœ๋Œ€ ์š”์†Œ(Top)์™€ ์ตœ์†Œ ์š”์†Œ(Bottom)๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•จ.
    • rrr์€ SSS์˜ ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ์ดํ•ญ ๊ด€๊ณ„
  • rrr์˜ ํ•„์ˆ˜ ์†์„ฑ
    • ๋ถ€๋ถ„ ์ˆœ์„œ(Partial order): ๋ฐ˜์‚ฌ์ , ์ถ”์ด์ , ๋ฐ˜๋Œ€์นญ์ 
    • ๋ชจ๋“  ์š”์†Œ ์Œ์€ ์œ ์ผํ•œ ์ตœ๋Œ€ ํ•˜ํ•œ(Meet)๊ณผ ์œ ์ผํ•œ ์ตœ์†Œ ์ƒํ•œ(Join)์„ ๊ฐ€์ง

Example of a Lattice

  • D=(2{x,y,z},โІ)D = (2^{\{x,y,z\}}, \subseteq)D=(2{x,y,z},โІ)

    • 2{x,y,z}={โˆ…,{x},{y},{z},โ€ฆ,{x,y,z}}2^{\{x,y,z\}} = \{\emptyset, \{x\}, \{y\}, \{z\}, \dots, \{x, y, z\}\}2{x,y,z}={โˆ…,{x},{y},{z},โ€ฆ,{x,y,z}}

    alt text

Say What? Why We Need It?

  • ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ ์ง€์ ์—์„œ ๊ด€์‹ฌ ์†์„ฑ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฐ’ ์ถ”์ 
  • ๊ฐ€๋Šฅํ•œ ๊ฐ’(์ถ”์  ์ค‘์ธ ์ •๋ณด)์€ Domain์„ ์ •์˜ํ•˜๋Š” Lattice์˜ ์š”์†Œ๋กœ ๋ชจ๋ธ๋ง
  • ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์—์„œ ์ •๋ณด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์ •๋ณด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ Lattice ์‚ฌ์šฉ
    • Transfer function: ๋ช…๋ น์–ด๊ฐ€ ์ƒํƒœ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ
    • Meet/Join: Control Flow์˜ ์˜ํ–ฅ

Abstract Domain: Interrupt Checker

      maybe-enabled
    /               \
enabled          disabled
      \          /
            ?

Reasoning about a CFG

  • ๋ถ„์„์€ ํ”„๋กœ๊ทธ๋žจ ์ง€์ (๋…ธ๋“œ ์‚ฌ์ด์˜ ์ง€์ )์—์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•จ.
  • ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด
    • ์„ ํ–‰ ๋…ธ๋“œ(Predecessors)์˜ ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌ/๊ฒฐํ•ฉํ•˜์—ฌ ์ง„์ž… ์‹œ ์ƒํƒœ ๊ฒฐ์ •
    • ์—ฐ์‚ฐ(Transfer)์˜ ํšจ๊ณผ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋…ธ๋“œ ์ข…๋ฃŒ ์‹œ ์ƒํƒœ ํ‰๊ฐ€
  • ๊ฐ ํ”„๋กœ๊ทธ๋žจ ์ง€์ ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ํ›„ํ–‰ ๋…ธ๋“œ(Successors)์™€ ์ „์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต
  • Output: ๊ฐ ํ”„๋กœ๊ทธ๋žจ ์ง€์ ์—์„œ์˜ ์ƒํƒœ

An Interrupt Checker

  • Abstraction
    • 3๊ฐ€์ง€ Abstract states: Enabled, Disabled, Maybe-enabled
    • Interrupt๊ฐ€ disable๋œ ์ƒํƒœ๋กœ ํ•จ์ˆ˜ ๋์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ alarm์„ ์คŒ.
  • Transfer function
    • Basic block์— cli() ํ˜ธ์ถœ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ๋ถ„์„ ์ƒํƒœ๋ฅผ Enabled์—์„œ Disabled๋กœ ๋ณ€๊ฒฝ
    • Basic block์— restore_flags() ํ˜ธ์ถœ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ๋ถ„์„ ์ƒํƒœ๋ฅผ Disabled์—์„œ Enabled๋กœ ๋ณ€๊ฒฝ

Transfer Function

  • ๊ฐ€์ •: ๋ธ”๋ก ์ „ ํ”„๋กœ๊ทธ๋žจ ์ง€์ ์˜ Interrupt enabled
            โ†“
    โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
    โ”ƒ // do_stuff       โ”ƒ
    โ”ƒ restore_flags();  โ”ƒ
    โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›
            โ†“
    
  • ๋ธ”๋ก ํ›„ ํ”„๋กœ๊ทธ๋žจ ์ง€์ : Interrupt disabled

Join

  • ๊ฐ€์ •: ๋ธ”๋ก ์ „ ํ”„๋กœ๊ทธ๋žจ ์ง€์ ์˜ Interrupt disabled
                    โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
                    โ”ƒ if(rv > 0) โ”ƒ
                    โ”—โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”›
          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ”‚                                 โ”‚
          โ–ผ                                 โ–ผ
  True branch:                          False branch:
  interrupts disabled                   interrupts disabled

โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“                 โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ // do_stuff       โ”ƒ                 โ”ƒ Handle_error_case(); โ”ƒ
โ”ƒ Restore_flags();  โ”ƒ                 โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›
โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›                            โ”‚
          โ”‚                                      โ”‚
  interrupts enabled                    interrupts disabled
          โ”‚                                      โ”‚
          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ–ผ
                    โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
                    โ”ƒ return rv; โ”ƒ
                    โ”—โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”›

                   interrupts...???

Join/Branching

  • ๋‹ค์ˆ˜์˜ ์ด์ „ ์ƒํƒœ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š”/๊ฐ€๋Š” ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€
  • ๋ถ„๊ธฐ(Branch)์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…
    1. ๊ฐ ๊ฒฝ๋กœ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํƒ์ƒ‰
      • ๊ฐ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ •ํ™•ํ•œ ์ •๋ณด
      • ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฝ๋กœ์˜ ์ˆ˜๊ฐ€ ๋ฌด์ˆ˜ํžˆ ๋งŽ์„ ์ˆ˜ ์žˆ์Œ
      • ์ƒํƒœ ํญ๋ฐœ(State explosion) ๋ฐœ์ƒ, ๋ฃจํ”„๋Š” ๋ฌดํ•œ์„ฑ ๋ฌธ์ œ ์ถ”๊ฐ€
    2. Join!
    • ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ
    • ๋œ ์ •ํ™•ํ•˜๋ฉฐ ์ •๋ณด ์†์‹ค ๋ฐœ์ƒ (Rice's theorem)
    • ๊ทธ๋Ÿฌ๋‚˜ ์ƒํƒœ ํญ๋ฐœ์ด ์—†์œผ๋ฉฐ ์ข…๋ฃŒ๋จ (Terminate)
  • ์กฐ๊ฑด๋ฌธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฃจํ”„, Switch, Exception๋„ ํ•ด๋‹น๋จ

Interrupt Analysis: Join Function

  • Abstraction
    • 3๊ฐ€์ง€ ์ƒํƒœ: Enabled, Disabled, Maybe-enabled
    • Program counter
  • Join: Basic block์˜ ์„ ํ–‰ ๋…ธ๋“œ ์ค‘ ์ ์–ด๋„ ํ•˜๋‚˜๊ฐ€ Interrupt enabled์ด๊ณ  ์ ์–ด๋„ ํ•˜๋‚˜๊ฐ€ Disabled์ธ ๊ฒฝ์šฐ
    • Join(Enabled, Enabled) โ†’ Enabled
    • Join(Disabled, Disabled) โ†’ Disabled
    • Join(Disabled, Enabled) โ†’ Maybe-enabled
    • Join(Maybe-enabled, *) โ†’ Maybe-enabled

Example of the Interrupt Analysis

  • foo() ํ•จ์ˆ˜ ์˜ˆ์ œ์— ๋Œ€ํ•œ ๋ถ„์„ ์ถ”์ 
  • ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ƒํƒœ ๋ณ€ํ™” (ฯƒโ†’\sigma โ†’ฯƒโ†’ Enabled/Disabled)
  • ๋ฌธ์ œ ๋ฐœ์ƒ ์ง€์ : ฯƒโ†’\sigma โ†’ฯƒโ†’ Maybe-enabled alt text

Abstraction

  • ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์˜ˆ์ œ
    • cli();
    • if (*) ๋ถ„๊ธฐ ๋‚ด restore_flags();
    • ์ข…๋ฃŒ ์‹œ์  ์ƒํƒœ ํ™•์ธ

Too Simple?

  • ํ•จ์ˆ˜๋‹น ์ „์—ญ ์ƒํƒœ(Control flow analysis)๋งŒ ์ถ”์ ํ•˜๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•จ.
    • ์˜ˆ: ๋‹ค์ˆ˜ ์ปดํŒŒ์ผ๋Ÿฌ(์˜ˆ: Java)์˜ Dead-code ๊ฐ์ง€
    • ๊ฒฐ์ • ์ง€์  ์ „ํ›„์˜ ๋™์  ๋ถ„์„์„ ์œ„ํ•œ Instrumentation, ๋ฃจํ”„ ๊ฐ์ง€
    • ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ์‹ค์ œ Interrupt ๋ถ„์„
  • ๋ณต์žก์„ฑ์„ ํ•œ ๋‹จ๊ณ„ ๋†’์ด๋Š” ๊ฒƒ์€ ๋ณ€์ˆ˜๋‹น ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ (Dataflow analysis)
  • ์˜ˆ: ๋ณ€์ˆ˜ x๊ฐ€ 0์ด ๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€
    • ์›๋ณธ Domain: NNN์€ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ •์ˆ˜๋กœ ๋งคํ•‘. ๊ฐ€๋Šฅํ•œ ๊ตฌ์ฒด์  ์ƒํƒœ ์ˆ˜๋Š” ๊ฑฐ๋Œ€ํ•จ.
      • nnn๊ฐœ์˜ 32๋น„ํŠธ ๋ณ€์ˆ˜๋Š” 232โˆ—n2^{32*n}232โˆ—n๊ฐœ์˜ ์ƒํƒœ ์ดˆ๋ž˜
      • ๋ฃจํ”„๊ฐ€ ์žˆ์œผ๋ฉด ์ƒํƒœ๊ฐ€ ๋ฌดํ•œํžˆ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Œ
    • Abstract state space๋Š” ํ›จ์”ฌ ์ž‘์Œ: ๋ณ€์ˆ˜๊ฐ€ Zero, Not-zero, ๋˜๋Š” Maybe-zero (2nโˆ—32^{n*3}2nโˆ—3)

Data-Flow Analysis

Data- VS. Control-Flow

  • Dataflow: ํ”„๋กœ๊ทธ๋žจ ๋‚ด ๋ณ€์ˆ˜(์ผ๋ถ€ ๋ถ€๋ถ„ ์ง‘ํ•ฉ) ๊ฐ๊ฐ์— ๋Œ€ํ•œ Abstract value ์ถ”์ 
  • Control flow: ํ•ด๋‹น ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ „์—ญ(Global) ์ƒํƒœ ์ถ”์ 

Example: Zero/Null-pointer Analysis

  • ๋ณ€์ˆ˜ x๊ฐ€ 0์ด ๋  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
    • (์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?)
  • ์›๋ณธ Domain: NNN์€ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ์ •์ˆ˜๋กœ ๋งคํ•‘
  • Abstraction: ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” Non zero(NZ), Zero(Z), ๋˜๋Š” Maybe zero(MZ)์ž„

Zero Analysis Transfer

  • ์–ด๋–ค ์—ฐ์‚ฐ์ด ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”๊ฐ€?
  • ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ!

Zero Analysis Join (per Variable)

  • Join(Zero, Zero) โ†’ Zero
  • Join(Not-zero, Not-zero) โ†’ Not-zero
  • Join(Zero, Not-zero) โ†’ Maybe-zero
  • Join(Maybe-zero, *) โ†’ Maybe-zero

Example

x = 10;
y = x;
z = 0;
while (y > -1) {
    x = x / y;
    y = y - 1;
    z = 5;
}
  • ๋‚˜๋ˆ—์…ˆ์—์„œ y๊ฐ€ 0์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Zero analysis ์‚ฌ์šฉ
  • 1์ฐจ ๋ฐ˜๋ณต
    • ๊ฐ ๋ผ์ธ๋ณ„ ์ƒํƒœ(NZ, Z, MZ) ๋ณ€ํ™” ์ถ”์ 
    • Join ์ ์šฉ ๊ฒฐ๊ณผ
  • 2์ฐจ ๋ฐ˜๋ณต
    • ์ƒํƒœ ๋ณ€ํ™” ๋ฐ Join ์ ์šฉ ๊ฒฐ๊ณผ
    • yโ†’MZy โ†’ MZyโ†’MZ ๋“ฑ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
  • 3์ฐจ ๋ฐ˜๋ณต
    • ์ด์ „ ์ƒํƒœ์™€ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—†์Œ (Stable, Fixed point ๋„๋‹ฌ)
    • ๊ฒฝ๊ณ : Div-by-zero ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

Abstraction at Work

  • ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์˜ ์ˆ˜๋Š” ๊ฑฐ๋Œ€ํ•จ.
    • nnn๊ฐœ์˜ 32๋น„ํŠธ ๋ณ€์ˆ˜๋Š” 232โˆ—n2^{32*n}232โˆ—n๊ฐœ์˜ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ
    • 232โˆ—3=296โ‰ˆ7.92ร—10282^{32*3} = 2^{96} \approx 7.92 \times 10^{28}232โˆ—3=296โ‰ˆ7.92ร—1028
    • Loop๊ฐ€ ์žˆ์œผ๋ฉด ์ƒํƒœ๊ฐ€ ๋ฌดํ•œํžˆ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Œ
  • Zero Analysis๋Š” ์ƒํƒœ ๊ณต๊ฐ„์„ ์ขํž˜
    • 4๊ฐœ์˜ Abstract values (Z, NZ, MZ, โŠฅ\botโŠฅ)
    • 24โˆ—3=212=40962^{4*3} = 2^{12} = 409624โˆ—3=212=4096
    • ์ด ์ œํ•œ๋œ ๊ณต๊ฐ„์ด ํƒ์ƒ‰๋˜๋ฉด ์™„๋ฃŒ๋จ
  • ๋ชจ๋“  ๋ฃจํ”„ ๋ฐ˜๋ณต์— ๋Œ€ํ•ด ์™ธ์‚ฝ(Extrapolate)

Termination Intuition

  • Termination์„ ํ•ญ์ƒ ๋ณด์žฅํ•˜์ง€๋Š” ์•Š์Œ. ์ˆ˜๋ ด(fixed point)ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.
  • ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ •๋ณด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ณ„์‚ฐ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์ƒํƒœ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ํŠน๋ณ„ํ•œ ๊ฐ’ ์‚ฌ์šฉ
  • ํ•จ์ˆ˜์˜ ๊ณ ์ •์ (Fixed point)์€ ํ•จ์ˆ˜๊ฐ€ ์ž์‹ ์—๊ฒŒ ๋งคํ•‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’ ฮฝ\nuฮฝ์ž„
    • โˆ’f(v)=v-f(v) = vโˆ’f(v)=v
  • Flow function์€ ์ˆ˜ํ•™์  ํ•จ์ˆ˜์ž„
  • ๊ฐ ๊ณ ์ •์ ์—์„œ์˜ Dataflow analysis ์ƒํƒœ๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์ž„

The Bad News: Riceโ€™s Theorem

"ํŠœ๋ง ๋จธ์‹ ์— ์˜ํ•ด ์ธ์‹๋˜๋Š” ์–ธ์–ด์— ๋Œ€ํ•œ ๋น„์ž๋ช…ํ•œ ์†์„ฑ์€ ๊ฒฐ์ • ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค" (Henry Gordon Rice, 1953)

  • ๋ชจ๋“  ์ •์  ๋ถ„์„์€ ํ•„์—ฐ์ ์œผ๋กœ Incompleteํ•˜๊ฑฐ๋‚˜ Unsoundํ•˜๊ฑฐ๋‚˜ Undecidableํ•จ (ํ˜น์€ ์ด๊ฒƒ๋“ค์˜ ๋ณตํ•ฉ)

Computability Theory saysโ€ฆ

  • ์ •์ง€ ๋ฌธ์ œ(Halting problem): ์ฃผ์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃผ์–ด์ง„ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ •์ง€/์ข…๋ฃŒํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฌธ์ œ
  • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ถˆ๊ฐ€๋Šฅ
    • ๋” ๊ตฌ์ฒด์ ์œผ๋กœ, ๊ฒฐ์ • ๋ถˆ๊ฐ€๋Šฅํ•จ (Yes ๋‹ต์€ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ, No ๋‹ต์€ ์–ป์„ ์ˆ˜ ์—†์Œ)
  • ๋•Œ๋•Œ๋กœ ํœด๋ฆฌ์Šคํ‹ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅ
def g():
  if halts(g):
    loop_forever()

OK, So?

  • ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ž๋ช…ํ•œ ์†์„ฑ(์ ˆ๋Œ€ Null ์—ญ์ฐธ์กฐ ์•ˆ ํ•จ, ํ•ญ์ƒ ๋ชจ๋“  ํŒŒ์ผ ํ•ธ๋“ค ํ•ด์ œ ๋“ฑ)์„ ๊ฐ–๋Š”์ง€ ์ •์ ์œผ๋กœ ํ•ญ์ƒ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ •์ง€ ๋ฌธ์ œ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  • ...๊ทธ๋Ÿฌ๋‚˜ ์ •์ง€ ๋ฌธ์ œ๋Š” ๋ช…๋ฐฑํžˆ ๋ถˆ๊ฐ€๋Šฅํ•จ.
  • ๋”ฐ๋ผ์„œ, ์™„๋ฒฝํ•œ ์ •์  ๋ถ„์„์€ ์—†์Œ. ํ•ญ์ƒ False positive๋‚˜ False negative(๋˜๋Š” ๋‘˜ ๋‹ค)๋ฅผ ๊ฐ€์ง
  • ๋ชจ๋“  ๋„๊ตฌ๋Š” trade-off๋ฅผ ๊ฐ€์ง

Sound vs. Heuristic Analysis vs. Reality

  • Heuristic Analysis
    • FindBugs, Coverity, Checkstyle ๋“ฑ
    • ๊ทœ์น™ ๋”ฐ๋ฆ„, ๊ทผ์‚ฌ์น˜ ์‚ฌ์šฉ, False positive๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ๊ฒ€์‚ฌ ํšŒํ”ผ
    • False positive์™€ False negative ๋ชจ๋‘ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์Œ
  • Sound Static Analysis
    • Type checking, Not-Null ๋“ฑ (ํŠน์ • ๊ฒฐํ•จ ํด๋ž˜์Šค)
    • Sound Abstraction, False positive๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ •๋ฐ€ํ•œ ๋ถ„์„
  • ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š”, ์–ธ์–ด๊ฐ€ ๋ณต์žกํ•˜๋ฉฐ, ๋ชจ๋“  ๋„๊ตฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฌด์—‡์„ ๋ชจ๋ธ๋งํ• ์ง€/์‹ค์ œ abstraction์„ ์–ด๋–ป๊ฒŒ ํ• ์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์ด ํ•„์š”ํ•จ.

Example: Null Pointers

int foo() {
    Integer x = new Integer(6);

}

alt text

What About that Function Call?

  • ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ์˜ต์…˜
    • ์™„์ „ํžˆ ์—‰๋šฑํ•œ Control Flow(Exception, Longjumps)๊ฐ€ ์šฐ๋ ค๋œ๋‹ค๋ฉด, ๋” ๋ณต์žกํ•œ Control Flow Graph๋กœ ๋ชจ๋ธ๋ง ๊ฐ€๋Šฅ
    • ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  "ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๋ถ„์„์ด Soundํ•˜๊ฒŒ ๊ณ„์‚ฐ๋จ..."์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋ฉฐ ๋ฌด์‹œ
      • ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ •ํ•จ.
  • Interprocedural ๋ถ„์„์ด ์กด์žฌํ•˜์ง€๋งŒ ํ™•์žฅํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋ณธ ๊ฐ•์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚จ.
    • ์˜ˆ: ๋‹จ์ผ์˜ ํฐ ๊ทธ๋ž˜ํ”„ ๊ตฌ์ถ• ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋ ˆ๋ฒจ์—์„œ์˜ ์ถ”์ƒํ™”; ์ข…์ข… ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•œ ์ˆ˜๋™ ์ฃผ์„(Annotation) ์‚ฌ์šฉ

Try-Catch?

alt text

Design Choices: Representation and Abstract Domain

  • Try/catch๋ฅผ ๋ชจ๋ธ๋งํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋– ํ•œ๊ฐ€
  • ํ•œ๋‹ค๋ฉด... ์–ด๋–ป๊ฒŒ ํฌํ•จํ•ด์•ผ ํ•˜๋Š”๊ฐ€
  • IOException์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์–ด๋– ํ•œ๊ฐ€
  • ๋” ๋„“์€ ์งˆ๋ฌธ: Semantics๋ฅผ ์–ผ๋งˆ๋‚˜ ์ •๋ฐ€ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•ด์•ผ ํ•˜๋Š”๊ฐ€
    • ์˜ˆ: ๋ช…๋ น์–ด, ์กฐ๊ฑด ํ™•์ธ ๋“ฑ์˜ Semantics

Upshot: Analysis as Approximation

  • ๋ถ„์„์€ ์‹ค์ œ์ ์œผ๋กœ ๊ทผ์‚ฌ(Approximate)ํ•ด์•ผ ํ•จ.
    • False positives: ์‹ค์ œ๋กœ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š” ๊ณณ์— ์˜ค๋ฅ˜ ๋ณด๊ณ  ๊ฐ€๋Šฅ
    • False negatives: ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
    • ๋ชจ๋“  ๋ถ„์„ ๋„๊ตฌ๋Š” False negative ๋˜๋Š” False positive๋ฅผ ๊ฐ€์ง
  • Approximation ์ „๋žต
    • ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ํŒจํ„ด P ์ฐพ๊ธฐ
      • ํ™•์ธํ•˜๊ธฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋ฉฐ(๋ถ„์„์ด ๋นจ๋ฆฌ ์ข…๋ฃŒ๋จ),
      • ์‹ค์ œ ๋Œ€๋ถ€๋ถ„์˜ ์˜ฌ๋ฐ”๋ฅธ ์ฝ”๋“œ๋ฅผ ์ปค๋ฒ„ํ•˜๊ณ (๋‚ฎ์€ False positive),
      • ์˜ค๋ฅ˜๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•จ(False negative ์—†์Œ)
  • ๋ถ„์„์€ ์‹ค์ œ์ ์œผ๋กœ ๊ฝค ํ›Œ๋ฅญํ•  ์ˆ˜ ์žˆ์Œ
    • ๋งŽ์€ ๋„๊ตฌ๊ฐ€ ๋‚ฎ์€ False positive/negative ๋น„์œจ์„ ๊ฐ€์ง
    • Sound ๋„๊ตฌ๋Š” False negative๊ฐ€ ์—†์Œ
      • ํ™•์ธํ•˜๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ ˆ๋Œ€ ๋†“์น˜์ง€ ์•Š์Œ

Summary

  • ์ •์  ๋ถ„์„: ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ž๋™ ๋ถ„์„
  • Structural ๋ถ„์„์€ ์ฝ”๋“œ ๋‚ด ํŒจํ„ด์„ ์ฐพ์Œ
  • Control-flow ๋ถ„์„์€ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ ๋ถ„์„ (global ์†์„ฑ)
  • Data-flow ๋ถ„์„์€ ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ๋ณ€์ˆ˜์˜ ๊ฐ€๋Šฅํ•œ (abstract) ๊ฐ’ ๋ถ„์„
    • Abstraction, Transfer function, Join
    • Fix point ๊ณ„์‚ฐ. termination
  • ๋ถ„์„์€ Unsoundํ•˜๊ฑฐ๋‚˜ Incompleteํ•˜๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค์ž„.
์ตœ๊ทผ ์ˆ˜์ •: 26. 6. 12. ์˜คํ›„ 3:28
Contributors: kmbzn, Claude Sonnet 4.6

BUILT WITH

CloudflareNode.jsGitHubGitVue.jsJavaScriptVSCodenpm

All trademarks and logos are property of their respective owners.
ยฉ 2026 kmbzn ยท MIT License