| 22 | | 3. |
| | 23 | 3. array literal: `{e0, e1, ...}` |
| | 24 | `impact({e0, e1, ...}) = impact(e0) U impact(e1) ...` |
| | 25 | 4. binary expression: `e0 op e1` |
| | 26 | `impact(e0 op e1) = impact(e0) U impact(e1)` |
| | 27 | 5. bound variable expression: `eb` |
| | 28 | `impact(eb)=\empty` |
| | 29 | 6. cast expression: `(T)e` |
| | 30 | `impact((T)e)=impact(e)` |
| | 31 | 7. char literal: `{e0, e1, ...}` |
| | 32 | similar to array literal |
| | 33 | 8. conditional expression: `e0 ? e1 : e2` |
| | 34 | `impact(e0 ? e1 : e2) = impact(e0) U impact(e1) U impact(e2)` |
| | 35 | 9. 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}`. |
| | 39 | 10. derivative call expression: `de` |
| | 40 | `impact(de) = \empty` |
| | 41 | 11. domain guard expression: `(int i0, i1, ... : e)` |
| | 42 | `impact((int i0, i1, ... : e)) = impact(e)` |
| | 43 | 12. 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}`. |
| | 47 | 13. quantified expression: `quantifier er: e` where `er` is the restriction expression |
| | 48 | `impact(quantifier er: e) = impact(er) U impact(e)` |
| | 49 | 14. rectangular domain expression: `{e0, e1, ...}` |
| | 50 | similar to array literal |
| | 51 | 15. regular range expression: `{el, eh#es}` |
| | 52 | `impact({el, eh#es}) = impact(el) U impact(eh) U impact(es)` |
| | 53 | 16. scope-of expression: `scopeof(e)` |
| | 54 | `impact(scopeof(e))=\empty` |
| | 55 | 17. sizeof expression: `sizeof(e)` |
| | 56 | `impact(sizeof(e))=\empty` |
| | 57 | 18. struct or union literal: `{e0, e1, ...}` |
| | 58 | similar to array literal |
| | 59 | 19. 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}`. |
| 29 | | 2. address-of: `e=&le` |
| 30 | | `sub(&le)=sub(le)` |
| 31 | | 3. |
| 32 | | |
| | 68 | 2. address-of: `&le` |
| | 69 | `sub(&le)={le} U sub(le)` |
| | 70 | 3. 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}` |
| | 74 | 5. bound variable expression: `eb` |
| | 75 | `sub(eb)=\empty` |
| | 76 | 6. cast expression: `(T)e` |
| | 77 | `sub((T)e)={e}` |
| | 78 | |
| | 79 | |
| | 80 | |
| | 81 | |
| | 82 | |
| | 83 | |
| | 84 | |