Changes between Version 3 and Version 4 of MemoryAnalysis


Ignore:
Timestamp:
07/29/15 11:26:33 (11 years ago)
Author:
zmanchun
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • MemoryAnalysis

    v3 v4  
    1515==== Expressions ====
    1616let `e` be an expression, let `le` be an left-hand-side expression, let `impact(e)` be the set of impact memory units of `e`.
     17let`mu(e)` be a function to convert an expression, of pointer type or being a left-hand-side expression, to a memory unit.
    1718
    18 1. abstract function call: `e = f(e0,e1, ...)`
     191. abstract function call: `f(e0,e1, ...)`
    1920    `impact(f(e0,e1, ...)) = impact(e0) U impact(e1) ...`
    20 2. address-of: `e=&le`
     212. address-of: `&le`
    2122    `impact($le)=impact(sub(le))`
    22 3.
     233. array literal: `{e0, e1, ...}`
     24    `impact({e0, e1, ...}) = impact(e0) U impact(e1) ...`
     254. binary expression: `e0 op e1`
     26    `impact(e0 op e1) = impact(e0) U impact(e1)`
     275. bound variable expression: `eb`
     28    `impact(eb)=\empty`
     296. cast expression: `(T)e`
     30    `impact((T)e)=impact(e)`
     317. char literal: `{e0, e1, ...}`
     32    similar to array literal
     338. conditional expression: `e0 ? e1 : e2`
     34    `impact(e0 ? e1 : e2) = impact(e0) U impact(e1) U impact(e2)`
     359. dereference expression: `*e`
     36    `impact(*e) = mu(e) U impact(sub(e))`
     37    the impact memory units of `*e` include the memory unit refers to by `e`, and the impact memory units of the sub-expressions of `e`.
     38    e.g., the impact memory units of `*(p+i)` is `{mu(p+5), impact(i)}`, because `p` is of pointer type and `sub(p+i)` is `{i}`.
     3910. derivative call expression: `de`
     40      `impact(de) = \empty`
     4111. domain guard expression: `(int i0, i1, ... : e)`
     42      `impact((int i0, i1, ... : e)) = impact(e)`
     4312. dot expression: `e.k`
     44      `impact(e.k) = mu(e.k) U impact(sub(e))`
     45       the impact memory units of `e.k` include the memory unit refers to by `e`, and the impact memory units of the sub-expressions of `e`.
     46       e.g., the impact memory units of `points[k].x` is `{mu(points[k]+x), impact(k)}`, because `sub(points[k])` is `{k}`.
     4713. quantified expression: `quantifier er: e` where `er` is the restriction expression
     48      `impact(quantifier er: e) = impact(er) U impact(e)`
     4914. rectangular domain expression: `{e0, e1, ...}`
     50      similar to array literal
     5115. regular range expression: `{el, eh#es}`
     52      `impact({el, eh#es}) = impact(el) U impact(eh) U impact(es)`
     5316. scope-of expression: `scopeof(e)`
     54      `impact(scopeof(e))=\empty`
     5517. sizeof expression: `sizeof(e)`
     56      `impact(sizeof(e))=\empty`
     5718. struct or union literal: `{e0, e1, ...}`
     58      similar to array literal
     5919. subscript expression: `ea[ei]`
     60      `impact(ea[ei])=mu(ea[ei]) U impact(sub(ea)) U impact(ei)`
     61       for example, the impact units of `(a[i])[j]` is `mu(a[i][j]) U impact(i) U impact(j)` because `sub(a[i])` is `{i}`.
    2362
    2463==== Sub-expressions ====
    2564let `e` be an expression, let `sub(e)` be the set of sub-expressions of `e`.
    2665
    27 1. abstract function call: `e = f(e0,e1, ...)`
     661. abstract function call: `f(e0,e1, ...)`
    2867    `sub(f(e0,e1, ...)) = {e0, e1, ...}`
    29 2. address-of: `e=&le`
    30     `sub(&le)=sub(le)`
    31 3.
    32    
     682. address-of: `&le`
     69    `sub(&le)={le} U sub(le)`
     703. array literal: `{e0, e1, ...}`
     71    `sub({e0, e1, ...}) = {e0, e1, ...}``
     72 4. binary expression: `e0 op e1`
     73    `sub(e0 op e1) = e0.type== pointer ? {e1} : {e0, e1}`
     745. bound variable expression: `eb`
     75    `sub(eb)=\empty`
     766. cast expression: `(T)e`
     77    `sub((T)e)={e}`
     78
     79
     80
     81
     82
     83
     84