Skip to content

Commit 1e29660

Browse files
authored
[spec] Adapt OOB behaviour in spec; store typing (WebAssembly#129)
* [interpreter] Simplify zero-len and drop semantics * Update overview * [spec] Change drop semantics * [spec] Forgot to adjust prose for *.init ops * [spec] Adapt to early OOB checks * [spec] Fix OOB for table rules * [spec] Spec memory OOB * [spec] Extend store typing to elem and data instances * Apply suggestions from code review Co-Authored-By: Ryan Hunt <[email protected]> * Comments * [spec] Fix uses of table.set
1 parent b2a5c4f commit 1e29660

File tree

6 files changed

+376
-295
lines changed

6 files changed

+376
-295
lines changed

document/core/appendix/index-rules.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ Construct Judgement
5454
:ref:`Table instance <valid-tableinst>` :math:`S \vdashtableinst \tableinst : \tabletype`
5555
:ref:`Memory instance <valid-meminst>` :math:`S \vdashmeminst \meminst : \memtype`
5656
:ref:`Global instance <valid-globalinst>` :math:`S \vdashglobalinst \globalinst : \globaltype`
57+
:ref:`Element instance <valid-eleminst>` :math:`S \vdasheleminst \eleminst \ok`
58+
:ref:`Data instance <valid-datainst>` :math:`S \vdashdatainst \datainst \ok`
5759
:ref:`Export instance <valid-exportinst>` :math:`S \vdashexportinst \exportinst \ok`
5860
:ref:`Module instance <valid-moduleinst>` :math:`S \vdashmoduleinst \moduleinst : C`
5961
:ref:`Store <valid-store>` :math:`\vdashstore \store \ok`
@@ -95,6 +97,8 @@ Construct Judgement
9597
:ref:`Table instance <extend-tableinst>` :math:`\vdashtableinstextends \tableinst_1 \extendsto \tableinst_2`
9698
:ref:`Memory instance <extend-meminst>` :math:`\vdashmeminstextends \meminst_1 \extendsto \meminst_2`
9799
:ref:`Global instance <extend-globalinst>` :math:`\vdashglobalinstextends \globalinst_1 \extendsto \globalinst_2`
100+
:ref:`Element instance <extend-eleminst>` :math:`\vdasheleminstextends \eleminst_1 \extendsto \eleminst_2`
101+
:ref:`Data instance <extend-datainst>` :math:`\vdashdatainstextends \datainst_1 \extendsto \datainst_2`
98102
:ref:`Store <extend-store>` :math:`\vdashstoreextends \store_1 \extendsto \store_2`
99103
=============================================== ===============================================================================
100104

document/core/appendix/properties.rst

Lines changed: 108 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ Module instances are classified by *module contexts*, which are regular :ref:`co
100100

101101
* Each :ref:`global instance <syntax-globalinst>` :math:`\globalinst_i` in :math:`S.\SGLOBALS` must be :ref:`valid <valid-globalinst>` with some :ref:`global type <syntax-globaltype>` :math:`\globaltype_i`.
102102

103+
* Each :ref:`element instance <syntax-eleminst>` :math:`\eleminst_i` in :math:`S.\SELEMS` must be :ref:`valid <valid-eleminst>`.
104+
105+
* Each :ref:`data instance <syntax-datainst>` :math:`\datainst_i` in :math:`S.\SDATAS` must be :ref:`valid <valid-datainst>`.
106+
103107
* Then the store is valid.
104108

105109
.. math::
@@ -114,11 +118,17 @@ Module instances are classified by *module contexts*, which are regular :ref:`co
114118
\qquad
115119
(S \vdashglobalinst \globalinst : \globaltype)^\ast
116120
\\
121+
(S \vdasheleminst \eleminst \ok)^\ast
122+
\qquad
123+
(S \vdashdatainst \datainst \ok)^\ast
124+
\\
117125
S = \{
118126
\SFUNCS~\funcinst^\ast,
119127
\STABLES~\tableinst^\ast,
120128
\SMEMS~\meminst^\ast,
121-
\SGLOBALS~\globalinst^\ast \}
129+
\SGLOBALS~\globalinst^\ast,
130+
\SELEMS~\eleminst^\ast,
131+
\SDATAS~\datainst^\ast \}
122132
\end{array}
123133
}{
124134
\vdashstore S \ok
@@ -224,7 +234,7 @@ Module instances are classified by *module contexts*, which are regular :ref:`co
224234

225235
.. math::
226236
\frac{
227-
((S \vdash \EVFUNC~\X{fa} : \ETFUNC~\functype)^?)^n
237+
((S \vdashexternval \EVFUNC~\X{fa} : \ETFUNC~\functype)^?)^n
228238
\qquad
229239
\vdashlimits \{\LMIN~n, \LMAX~m^?\} : 2^{32}
230240
}{
@@ -265,6 +275,41 @@ Module instances are classified by *module contexts*, which are regular :ref:`co
265275
}
266276
267277
278+
.. index:: element instance, reference
279+
.. _valid-eleminst:
280+
281+
:ref:`Element Instances <syntax-eleminst>` :math:`\{ \EIELEM~\X{fa}^\ast \}`
282+
............................................................................
283+
284+
* For each :ref:`function address <syntax-funcaddr>` :math:`\X{fa}_i` in the table elements :math:`\X{fa}^\ast`:
285+
286+
* The :ref:`external value <syntax-externval>` :math:`\EVFUNC~\X{fa}` must be :ref:`valid <valid-externval-func>` with some :ref:`external type <syntax-externtype>` :math:`\ETFUNC~\X{ft}`.
287+
288+
* Then the element instance is valid.
289+
290+
.. math::
291+
\frac{
292+
(S \vdashexternval \EVFUNC~\X{fa} : \ETFUNC~\functype)^\ast
293+
}{
294+
S \vdasheleminst \{ \EIELEM~\X{fa}^\ast \} \ok
295+
}
296+
297+
298+
.. index:: data instance, byte
299+
.. _valid-datainst:
300+
301+
:ref:`Data Instances <syntax-eleminst>` :math:`\{ \DIDATA~b^\ast \}`
302+
....................................................................
303+
304+
* The data instance is valid.
305+
306+
.. math::
307+
\frac{
308+
}{
309+
S \vdashdatainst \{ \DIDATA~b^\ast \} \ok
310+
}
311+
312+
268313
.. index:: external type, export instance, name, external value
269314
.. _valid-exportinst:
270315

@@ -299,6 +344,10 @@ Module instances are classified by *module contexts*, which are regular :ref:`co
299344

300345
* For each :ref:`global address <syntax-globaladdr>` :math:`\globaladdr_i` in :math:`\moduleinst.\MIGLOBALS`, the :ref:`external value <syntax-externval>` :math:`\EVGLOBAL~\globaladdr_i` must be :ref:`valid <valid-externval-global>` with some :ref:`external type <syntax-externtype>` :math:`\ETGLOBAL~\globaltype_i`.
301346

347+
* For each :ref:`element address <syntax-elemaddr>` :math:`\elemaddr_i` in :math:`\moduleinst.\MIELEMS`, the :ref:`element instance <syntax-eleminst>` :math:`S.\SELEMS[\elemaddr_i]` must be :ref:`valid <valid-eleminst>`.
348+
349+
* For each :ref:`data address <syntax-dataaddr>` :math:`\dataaddr_i` in :math:`\moduleinst.\MIDATAS`, the :ref:`data instance <syntax-datainst>` :math:`S.\SDATAS[\dataaddr_i]` must be :ref:`valid <valid-datainst>`.
350+
302351
* Each :ref:`export instance <syntax-exportinst>` :math:`\exportinst_i` in :math:`\moduleinst.\MIEXPORTS` must be :ref:`valid <valid-exportinst>`.
303352

304353
* For each :ref:`export instance <syntax-exportinst>` :math:`\exportinst_i` in :math:`\moduleinst.\MIEXPORTS`, the :ref:`name <syntax-name>` :math:`\exportinst_i.\EINAME` must be different from any other name occurring in :math:`\moduleinst.\MIEXPORTS`.
@@ -327,6 +376,10 @@ Module instances are classified by *module contexts*, which are regular :ref:`co
327376
\qquad
328377
(S \vdashexternval \EVGLOBAL~\globaladdr : \ETGLOBAL~\globaltype)^\ast
329378
\\
379+
(S \vdasheleminst S.\SELEMS[\elemaddr] \ok)^\ast
380+
\qquad
381+
(S \vdashdatainst S.\SDATAS[\dataaddr] \ok)^\ast
382+
\\
330383
(S \vdashexportinst \exportinst \ok)^\ast
331384
\qquad
332385
(\exportinst.\EINAME)^\ast ~\mbox{disjoint}
@@ -338,7 +391,9 @@ Module instances are classified by *module contexts*, which are regular :ref:`co
338391
\MIFUNCS & \funcaddr^\ast, \\
339392
\MITABLES & \tableaddr^\ast, \\
340393
\MIMEMS & \memaddr^\ast, \\
341-
\MIGLOBALS & \globaladdr^\ast \\
394+
\MIGLOBALS & \globaladdr^\ast, \\
395+
\MIELEMS & \elemaddr^\ast, \\
396+
\MIDATAS & \dataaddr^\ast, \\
342397
\MIEXPORTS & \exportinst^\ast ~\} : \{
343398
\begin{array}[t]{@{}l@{~}l@{}}
344399
\CTYPES & \functype^\ast, \\
@@ -560,6 +615,10 @@ a store state :math:`S'` extends state :math:`S`, written :math:`S \extendsto S'
560615

561616
* The length of :math:`S.\SGLOBALS` must not shrink.
562617

618+
* The length of :math:`S.\SELEMS` must not shrink.
619+
620+
* The length of :math:`S.\SDATAS` must not shrink.
621+
563622
* For each :ref:`function instance <syntax-funcinst>` :math:`\funcinst_i` in the original :math:`S.\SFUNCS`, the new function instance must be an :ref:`extension <extend-funcinst>` of the old.
564623

565624
* For each :ref:`table instance <syntax-tableinst>` :math:`\tableinst_i` in the original :math:`S.\STABLES`, the new table instance must be an :ref:`extension <extend-tableinst>` of the old.
@@ -568,21 +627,31 @@ a store state :math:`S'` extends state :math:`S`, written :math:`S \extendsto S'
568627

569628
* For each :ref:`global instance <syntax-globalinst>` :math:`\globalinst_i` in the original :math:`S.\SGLOBALS`, the new global instance must be an :ref:`extension <extend-globalinst>` of the old.
570629

630+
* For each :ref:`element instance <syntax-eleminst>` :math:`\eleminst_i` in the original :math:`S.\SELEMS`, the new global instance must be an :ref:`extension <extend-eleminst>` of the old.
631+
632+
* For each :ref:`data instance <syntax-datainst>` :math:`\datainst_i` in the original :math:`S.\SDATAS`, the new global instance must be an :ref:`extension <extend-datainst>` of the old.
633+
571634
.. math::
572635
\frac{
573636
\begin{array}{@{}ccc@{}}
574637
S_1.\SFUNCS = \funcinst_1^\ast &
575638
S_2.\SFUNCS = {\funcinst'_1}^\ast~\funcinst_2^\ast &
576-
(\funcinst_1 \extendsto \funcinst'_1)^\ast \\
639+
(\vdashfuncinstextends \funcinst_1 \extendsto \funcinst'_1)^\ast \\
577640
S_1.\STABLES = \tableinst_1^\ast &
578641
S_2.\STABLES = {\tableinst'_1}^\ast~\tableinst_2^\ast &
579-
(\tableinst_1 \extendsto \tableinst'_1)^\ast \\
642+
(\vdashtableinstextends \tableinst_1 \extendsto \tableinst'_1)^\ast \\
580643
S_1.\SMEMS = \meminst_1^\ast &
581644
S_2.\SMEMS = {\meminst'_1}^\ast~\meminst_2^\ast &
582-
(\meminst_1 \extendsto \meminst'_1)^\ast \\
645+
(\vdashmeminstextends \meminst_1 \extendsto \meminst'_1)^\ast \\
583646
S_1.\SGLOBALS = \globalinst_1^\ast &
584647
S_2.\SGLOBALS = {\globalinst'_1}^\ast~\globalinst_2^\ast &
585-
(\globalinst_1 \extendsto \globalinst'_1)^\ast \\
648+
(\vdashglobalinstextends \globalinst_1 \extendsto \globalinst'_1)^\ast \\
649+
S_1.\SELEMS = \eleminst_1^\ast &
650+
S_2.\SELEMS = {\eleminst'_1}^\ast~\eleminst_2^\ast &
651+
(\vdasheleminstextends \eleminst_1 \extendsto \eleminst'_1)^\ast \\
652+
S_1.\SDATAS = \datainst_1^\ast &
653+
S_2.\SDATAS = {\datainst'_1}^\ast~\datainst_2^\ast &
654+
(\vdashdatainstextends \datainst_1 \extendsto \datainst'_1)^\ast \\
586655
\end{array}
587656
}{
588657
\vdashstoreextends S_1 \extendsto S_2
@@ -660,6 +729,38 @@ a store state :math:`S'` extends state :math:`S`, written :math:`S \extendsto S'
660729
}
661730
662731
732+
.. index:: element instance
733+
.. _extend-eleminst:
734+
735+
:ref:`Element Instance <syntax-eleminst>` :math:`\eleminst`
736+
...........................................................
737+
738+
* The vector :math:`\eleminst.\EIELEM` must either remain unchanged or shrink to length :math:`0`.
739+
740+
.. math::
741+
\frac{
742+
\X{fa}_1^\ast = \X{fa}_2^\ast \vee \X{fa}_2^\ast = \epsilon
743+
}{
744+
\vdasheleminstextends \{\EIELEM~\X{fa}_1^\ast\} \extendsto \{\EIELEM~\X{fa}_2^\ast\}
745+
}
746+
747+
748+
.. index:: data instance
749+
.. _extend-datainst:
750+
751+
:ref:`Data Instance <syntax-datainst>` :math:`\datainst`
752+
........................................................
753+
754+
* The vector :math:`\datainst.\DIDATA` must either remain unchanged or shrink to length :math:`0`.
755+
756+
.. math::
757+
\frac{
758+
b_1^\ast = b_2^\ast \vee b_2^\ast = \epsilon
759+
}{
760+
\vdashdatainstextends \{\DIDATA~b_1^\ast\} \extendsto \{\DIDATA~b_2^\ast\}
761+
}
762+
763+
663764
664765
.. index:: ! preservation, ! progress, soundness, configuration, thread, terminal configuration, instantiation, invocation, validity, module
665766
.. _soundness-statement:

0 commit comments

Comments
 (0)