Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Verify core of Run method #240

Merged
merged 111 commits into from
Jan 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
63c0bd3
start
jcp19 Mar 20, 2023
d93019b
backup change to interface
jcp19 Mar 20, 2023
3531792
backup change to interface
jcp19 Mar 20, 2023
4472983
Merge branch 'master' into joao-run
jcp19 Mar 21, 2023
f96ced0
backup
jcp19 Mar 22, 2023
4d6484b
backup
jcp19 Apr 4, 2023
e7e7c51
backup of Run
jcp19 Apr 5, 2023
e4aaeda
backup of Run
jcp19 Apr 5, 2023
ed44a18
fix error in auxiliary package
jcp19 Apr 5, 2023
7c82fdf
problematic files
jcp19 Apr 5, 2023
96d1972
deal with incompletnesses by abstracting properties in predicates
jcp19 Apr 5, 2023
f96f088
backup
jcp19 Apr 5, 2023
975b5d0
drop commented assertions; blocked by Gobra incompletness
jcp19 Apr 6, 2023
aa1074f
Fix specification error in the spec of processPkt
jcp19 Apr 6, 2023
67951ad
continue Run
jcp19 Apr 6, 2023
8421951
continue Run
jcp19 Apr 6, 2023
c10de4b
Fix a few errors
jcp19 Apr 7, 2023
e23e207
add fuller spec to processPkt
jcp19 Apr 7, 2023
72b7474
before modying Message.Mem()
jcp19 Apr 7, 2023
15bafde
backup
jcp19 Apr 10, 2023
b9cf7d8
backup
jcp19 Apr 10, 2023
7080606
backup
jcp19 Apr 10, 2023
ba112e7
backup
jcp19 Apr 10, 2023
f6b4712
backup
jcp19 Apr 10, 2023
8c16e3e
backup
jcp19 Apr 10, 2023
c91cd67
backup
jcp19 Apr 12, 2023
deac5f0
backup
jcp19 Apr 13, 2023
2bc9813
drop unncessary invariant, performance improvements
jcp19 Apr 13, 2023
c56cc3d
perform obvious simplification in spec; continue verifying the main l…
jcp19 Apr 13, 2023
1933f83
improves the postconditions of processPkt further
jcp19 Apr 13, 2023
73211eb
weaken predicate that is stronger than necessary
jcp19 Apr 13, 2023
c0ae8c7
Fix ugly typo in an invariant
jcp19 Apr 13, 2023
5a96b5c
Backup
jcp19 Apr 14, 2023
5acf0dd
backup
jcp19 Apr 14, 2023
472fb1d
Merge branch 'master' into joao-run
jcp19 May 11, 2023
271196c
fix conflicts
jcp19 May 12, 2023
5b176bc
fix contract
jcp19 May 19, 2023
e2dcdca
Merge branch 'master' into joao-run
jcp19 Oct 16, 2023
feda9e2
Merge branch 'master' into joao-run
jcp19 Oct 21, 2023
3926d76
fix id erros
jcp19 Oct 21, 2023
2d3f797
backup
jcp19 Oct 30, 2023
215e521
Backup
jcp19 Oct 30, 2023
b0438e0
undo unnecessary changes
jcp19 Oct 30, 2023
04787c5
backup
jcp19 Oct 30, 2023
22fcff9
fix errors
jcp19 Oct 30, 2023
1c36389
Update router/dataplane_spec.gobra
jcp19 Oct 31, 2023
c9f39a6
Merge with master
jcp19 Nov 7, 2023
de178b2
backup
jcp19 Nov 9, 2023
516e7bc
Merge branch 'master' into joao-run
jcp19 Nov 23, 2023
7e827c1
backup
jcp19 Nov 27, 2023
52385c5
backup
jcp19 Nov 27, 2023
fdc0e93
backup
jcp19 Nov 27, 2023
d496d86
backup
jcp19 Nov 28, 2023
0295f2f
merge with merge
jcp19 Nov 30, 2023
aa8947d
Merge branch 'master' into joao-run
jcp19 Dec 12, 2023
9156498
change the order of invariants to avoid incompletness with mce
jcp19 Dec 13, 2023
70284e7
drop dreaded comment
jcp19 Dec 13, 2023
5708123
backup
jcp19 Dec 15, 2023
bdc1597
Merge branch 'master' into joao-run
jcp19 Dec 15, 2023
e963481
fix names
jcp19 Dec 15, 2023
2cc1cfc
fix a few verification errors
jcp19 Dec 15, 2023
243ebcb
fix another verification error
jcp19 Dec 16, 2023
af8c389
kill problematic branch
jcp19 Dec 16, 2023
2385938
progress towards proof
jcp19 Dec 20, 2023
7de2253
backup
jcp19 Dec 20, 2023
c9b33ce
fix verification error
jcp19 Dec 21, 2023
e36a00c
backup
jcp19 Dec 21, 2023
ebb4ea7
update socket.gobra spec
jcp19 Dec 21, 2023
b99ef46
maybe problematic PR
jcp19 Jan 11, 2024
792e701
start refactoring to decrease the amount of info provided to the smt …
jcp19 Jan 11, 2024
3c295ae
backup
jcp19 Jan 11, 2024
d3c591c
merge with master
jcp19 Jan 15, 2024
2967930
fix type error
jcp19 Jan 16, 2024
eac8d19
major clean-up
jcp19 Jan 18, 2024
d813aab
backup
jcp19 Jan 18, 2024
2a65c9d
fix a few errors due to the new encoding of socket
jcp19 Jan 18, 2024
f89ab76
Backup
jcp19 Jan 18, 2024
854eeeb
backup
jcp19 Jan 18, 2024
8676299
backup
jcp19 Jan 19, 2024
815a9ad
continue simplifying codebase
jcp19 Jan 19, 2024
065624d
backup MemWithoutHalf
jcp19 Jan 19, 2024
2f57a57
Drop MemWithoutHalf
jcp19 Jan 19, 2024
1484d5f
Remove one assume false
jcp19 Jan 19, 2024
f7611c0
settled on a spec for processPkt?
jcp19 Jan 19, 2024
402ea3c
cleanup
jcp19 Jan 19, 2024
dc68ff9
further advance a goal
jcp19 Jan 19, 2024
1b55794
backup
jcp19 Jan 19, 2024
a1071a4
backup, might not terminate
jcp19 Jan 19, 2024
83adabd
add necessary lemma calls
jcp19 Jan 19, 2024
58be57b
backup
jcp19 Jan 19, 2024
ab74667
remove unnecessary pre's
jcp19 Jan 19, 2024
5682171
backup; things are still failing
jcp19 Jan 21, 2024
b3dddde
backup
jcp19 Jan 21, 2024
a51e968
backup
jcp19 Jan 21, 2024
92558a3
backup
jcp19 Jan 21, 2024
86b53e9
backup
jcp19 Jan 21, 2024
d22aa1d
backup
jcp19 Jan 21, 2024
e865e40
backup
jcp19 Jan 21, 2024
d723553
fix error with OneHop
jcp19 Jan 22, 2024
6fc7b80
probably done with processOHP
jcp19 Jan 22, 2024
9f324c8
fix bug
jcp19 Jan 22, 2024
dda1e33
start adapting process
jcp19 Jan 22, 2024
dac3369
advances in processSCION
jcp19 Jan 22, 2024
e547237
backup
jcp19 Jan 23, 2024
1a11eb7
continue advancing proof of process
jcp19 Jan 24, 2024
3051b74
backup
jcp19 Jan 24, 2024
80e664d
backup
jcp19 Jan 24, 2024
fd45766
backup
jcp19 Jan 25, 2024
6edf3d2
fix proof
jcp19 Jan 25, 2024
5ee6253
rm file commited by mistake
jcp19 Jan 25, 2024
c517e68
fix tiny error
jcp19 Jan 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 46 additions & 31 deletions pkg/slayers/scion.go
Original file line number Diff line number Diff line change
Expand Up @@ -575,18 +575,18 @@ func scionNextLayerTypeL4(t L4ProtocolType) gopacket.LayerType {
// from the underlaying layer data. Changing the net.Addr object might lead to inconsistent layer
// information and thus should be treated read-only. Instead, SetDstAddr should be used to update
// the destination address.
// @ requires acc(&s.DstAddrType, R20) && acc(&s.RawDstAddr, R20)
// @ requires s.DstAddrType == T4Svc ==> len(s.RawDstAddr) >= addr.HostLenSVC
// @ requires acc(sl.AbsSlice_Bytes(s.RawDstAddr, 0, len(s.RawDstAddr)), R20)
// @ ensures acc(&s.DstAddrType, R20) && acc(&s.RawDstAddr, R20)
// @ ensures acc(sl.AbsSlice_Bytes(s.RawDstAddr, 0, len(s.RawDstAddr)), R20)
// @ ensures err == nil ==> (s.DstAddrType == T16Ip ==> typeOf(res) == *net.IPAddr)
// @ ensures err == nil ==> (s.DstAddrType == T16Ip ==> (acc(res.(*net.IPAddr)) && s.RawDstAddr === []byte(res.(*net.IPAddr).IP)))
// @ ensures err == nil ==> (s.DstAddrType == T4Ip ==> typeOf(res) == *net.IPAddr)
// @ ensures err == nil ==> (s.DstAddrType == T4Ip ==> (acc(res.(*net.IPAddr)) && s.RawDstAddr === []byte(res.(*net.IPAddr).IP)))
// @ ensures err == nil ==> (s.DstAddrType == T4Svc ==> typeOf(res) == addr.HostSVC)
// @ ensures err == nil == (s.DstAddrType == T4Ip || s.DstAddrType == T4Svc || s.DstAddrType == T16Ip)
// @ ensures err != nil ==> err.ErrorMem()
// @ requires acc(&s.DstAddrType, R20) && acc(&s.RawDstAddr, R20)
// @ requires s.DstAddrType == T4Svc ==> len(s.RawDstAddr) >= addr.HostLenSVC
// @ requires acc(sl.AbsSlice_Bytes(s.RawDstAddr, 0, len(s.RawDstAddr)), R15)
// @ ensures acc(&s.DstAddrType, R20) && acc(&s.RawDstAddr, R20)
// @ ensures err == nil ==> acc(res.Mem(), R15)
// @ ensures err == nil ==> typeOf(res) == *net.IPAddr || typeOf(res) == addr.HostSVC
// @ ensures err == nil ==>
// @ let rawDstAddr := s.RawDstAddr in
// @ (acc(res.Mem(), R15) --* acc(sl.AbsSlice_Bytes(rawDstAddr, 0, len(rawDstAddr)), R15))
// @ ensures err != nil ==>
// @ acc(sl.AbsSlice_Bytes(s.RawDstAddr, 0, len(s.RawDstAddr)), R15)
// @ ensures err != nil ==> err.ErrorMem()
// @ decreases
func (s *SCION) DstAddr() (res net.Addr, err error) {
return parseAddr(s.DstAddrType, s.RawDstAddr)
Expand All @@ -598,15 +598,15 @@ func (s *SCION) DstAddr() (res net.Addr, err error) {
// address.
// @ requires acc(&s.SrcAddrType, R20) && acc(&s.RawSrcAddr, R20)
// @ requires s.SrcAddrType == T4Svc ==> len(s.RawSrcAddr) >= addr.HostLenSVC
// @ requires acc(sl.AbsSlice_Bytes(s.RawSrcAddr, 0, len(s.RawSrcAddr)), R20)
// @ requires acc(sl.AbsSlice_Bytes(s.RawSrcAddr, 0, len(s.RawSrcAddr)), R15)
// @ ensures acc(&s.SrcAddrType, R20) && acc(&s.RawSrcAddr, R20)
// @ ensures acc(sl.AbsSlice_Bytes(s.RawSrcAddr, 0, len(s.RawSrcAddr)), R20)
// @ ensures err == nil ==> (s.SrcAddrType == T16Ip ==> typeOf(res) == *net.IPAddr)
// @ ensures err == nil ==> (s.SrcAddrType == T16Ip ==> (acc(res.(*net.IPAddr)) && s.RawSrcAddr === []byte(res.(*net.IPAddr).IP)))
// @ ensures err == nil ==> (s.SrcAddrType == T4Ip ==> typeOf(res) == *net.IPAddr)
// @ ensures err == nil ==> (s.SrcAddrType == T4Ip ==> (acc(res.(*net.IPAddr)) && s.RawSrcAddr === []byte(res.(*net.IPAddr).IP)))
// @ ensures err == nil ==> (s.SrcAddrType == T4Svc ==> typeOf(res) == addr.HostSVC)
// @ ensures err == nil == (s.SrcAddrType == T4Ip || s.SrcAddrType == T4Svc || s.SrcAddrType == T16Ip)
// @ ensures err == nil ==> acc(res.Mem(), R15)
// @ ensures err == nil ==> typeOf(res) == *net.IPAddr || typeOf(res) == addr.HostSVC
// @ ensures err == nil ==>
// @ let rawSrcAddr := s.RawSrcAddr in
// @ (acc(res.Mem(), R15) --* acc(sl.AbsSlice_Bytes(rawSrcAddr, 0, len(rawSrcAddr)), R15))
// @ ensures err != nil ==>
// @ acc(sl.AbsSlice_Bytes(s.RawSrcAddr, 0, len(s.RawSrcAddr)), R15)
// @ ensures err != nil ==> err.ErrorMem()
// @ decreases
func (s *SCION) SrcAddr() (res net.Addr, err error) {
Expand Down Expand Up @@ -687,28 +687,43 @@ func (s *SCION) SetSrcAddr(src net.Addr /*@, ghost wildcard bool @*/) (res error
return err
}

// @ requires addrType == T4Svc ==> len(raw) >= addr.HostLenSVC
// @ preserves acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R20)
// @ ensures err == nil ==> (addrType == T16Ip ==> typeOf(res) == *net.IPAddr)
// @ ensures err == nil ==> (addrType == T16Ip ==> (acc(res.(*net.IPAddr)) && raw === []byte(res.(*net.IPAddr).IP)))
// @ ensures err == nil ==> (addrType == T4Ip ==> typeOf(res) == *net.IPAddr)
// @ ensures err == nil ==> (addrType == T4Ip ==> (acc(res.(*net.IPAddr)) && raw === []byte(res.(*net.IPAddr).IP)))
// @ ensures err == nil ==> (addrType == T4Svc ==> typeOf(res) == addr.HostSVC)
// @ ensures err == nil == (addrType == T4Ip || addrType == T4Svc || addrType == T16Ip)
// @ ensures err != nil ==> err.ErrorMem()
// @ requires addrType == T4Svc ==> len(raw) >= addr.HostLenSVC
// @ requires acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
// @ ensures err == nil ==> acc(res.Mem(), R15)
// @ ensures err == nil ==> typeOf(res) == *net.IPAddr || typeOf(res) == addr.HostSVC
// @ ensures err == nil ==>
// @ (acc(res.Mem(), R15) --* acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15))
// @ ensures err != nil ==> acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
// @ ensures err != nil ==> err.ErrorMem()
// @ decreases
func parseAddr(addrType AddrType, raw []byte) (res net.Addr, err error) {
switch addrType {
case T4Ip:
verScionTmp := &net.IPAddr{IP: net.IP(raw)}
// @ unfold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
// @ fold acc(verScionTmp.Mem(), R15)
// @ package (acc((net.Addr)(verScionTmp).Mem(), R15) --* acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)) {
// @ assert acc(&verScionTmp.IP, R50) && verScionTmp.IP === raw
// @ unfold acc(verScionTmp.Mem(), R15)
// @ fold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
// @ }
return verScionTmp, nil
case T4Svc:
// @ unfold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R20)
// @ unfold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
verScionTmp := addr.HostSVC(binary.BigEndian.Uint16(raw[:addr.HostLenSVC]))
// @ fold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R20)
// @ fold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
// @ fold acc(verScionTmp.Mem(), R15)
// @ package (acc((net.Addr)(verScionTmp).Mem(), R15) --* acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)) { }
return verScionTmp, nil
case T16Ip:
verScionTmp := &net.IPAddr{IP: net.IP(raw)}
// @ unfold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
// @ fold acc(verScionTmp.Mem(), R15)
// @ package (acc((net.Addr)(verScionTmp).Mem(), R15) --* acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)) {
// @ assert acc(&verScionTmp.IP, R50) && verScionTmp.IP === raw
// @ unfold acc(verScionTmp.Mem(), R15)
// @ fold acc(sl.AbsSlice_Bytes(raw, 0, len(raw)), R15)
// @ }
return verScionTmp, nil
}
return nil, serrors.New("unsupported address type/length combination",
Expand Down
26 changes: 13 additions & 13 deletions private/underlay/conn/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ type Conn interface {
//@ ensures err != nil ==> err.ErrorMem()
ReadFrom(b []byte) (n int, addr *net.UDPAddr, err error)
//@ requires acc(Mem(), _)
//@ preserves forall i int :: { &m[i] } 0 <= i && i < len(m) ==> m[i].Mem(1)
//@ preserves forall i int :: { &m[i] } 0 <= i && i < len(m) ==> m[i].Mem()
//@ ensures err == nil ==> 0 <= n && n <= len(m)
//@ ensures err != nil ==> err.ErrorMem()
ReadBatch(m Messages) (n int, err error)
Expand All @@ -67,7 +67,7 @@ type Conn interface {
//@ ensures err != nil ==> err.ErrorMem()
WriteTo(b []byte, u *net.UDPAddr) (n int, err error)
//@ requires acc(Mem(), _)
//@ preserves forall i int :: { &m[i] } 0 <= i && i < len(m) ==> acc(m[i].Mem(1), R10)
//@ preserves forall i int :: { &m[i] } 0 <= i && i < len(m) ==> acc(m[i].Mem(), R10)
//@ ensures err == nil ==> 0 <= n && n <= len(m)
//@ ensures err != nil ==> err.ErrorMem()
WriteBatch(m Messages, k int) (n int, err error)
Expand Down Expand Up @@ -164,24 +164,24 @@ func newConnUDPIPv4(listen, remote *net.UDPAddr, cfg *Config) (res *connUDPIPv4,
// ReadBatch reads up to len(msgs) packets, and stores them in msgs.
// It returns the number of packets read, and an error if any.
// @ requires acc(c.Mem(), _)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> msgs[i].Mem(1)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> msgs[i].Mem()
// @ ensures errRet == nil ==> 0 <= nRet && nRet <= len(msgs)
// @ ensures errRet != nil ==> errRet.ErrorMem()
func (c *connUDPIPv4) ReadBatch(msgs Messages) (nRet int, errRet error) {
//@ unfold acc(c.Mem(), _)
// (VerifiedSCION) 1 is the length of the buffers of the messages in msgs
n, err := c.pconn.ReadBatch(msgs, syscall.MSG_WAITFORONE /*@, 1 @*/)
n, err := c.pconn.ReadBatch(msgs, syscall.MSG_WAITFORONE)
return n, err
}

// @ requires acc(c.Mem(), _)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> acc(msgs[i].Mem(1), R10)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> acc(msgs[i].Mem(), R10)
// @ ensures err == nil ==> 0 <= n && n <= len(msgs)
// @ ensures err != nil ==> err.ErrorMem()
func (c *connUDPIPv4) WriteBatch(msgs Messages, flags int) (n int, err error) {
//@ unfold acc(c.Mem(), _)
// (VerifiedSCION) 1 is the length of the buffers of the messages in msgs
return c.pconn.WriteBatch(msgs, flags /*@, 1 @*/)
return c.pconn.WriteBatch(msgs, flags)
}

// SetReadDeadline sets the read deadline associated with the endpoint.
Expand Down Expand Up @@ -238,24 +238,24 @@ func newConnUDPIPv6(listen, remote *net.UDPAddr, cfg *Config) (res *connUDPIPv6,
// ReadBatch reads up to len(msgs) packets, and stores them in msgs.
// It returns the number of packets read, and an error if any.
// @ requires acc(c.Mem(), _)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> msgs[i].Mem(1)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> msgs[i].Mem()
// @ ensures errRet == nil ==> 0 <= nRet && nRet <= len(msgs)
// @ ensures errRet != nil ==> errRet.ErrorMem()
func (c *connUDPIPv6) ReadBatch(msgs Messages) (nRet int, errRet error) {
//@ unfold acc(c.Mem(), _)
// (VerifiedSCION) 1 is the length of the buffers of the messages in msgs
n, err := c.pconn.ReadBatch(msgs, syscall.MSG_WAITFORONE /*@, 1 @*/)
n, err := c.pconn.ReadBatch(msgs, syscall.MSG_WAITFORONE)
return n, err
}

// @ requires acc(c.Mem(), _)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> acc(msgs[i].Mem(1), R10)
// @ preserves forall i int :: { &msgs[i] } 0 <= i && i < len(msgs) ==> acc(msgs[i].Mem(), R10)
// @ ensures err == nil ==> 0 <= n && n <= len(msgs)
// @ ensures err != nil ==> err.ErrorMem()
func (c *connUDPIPv6) WriteBatch(msgs Messages, flags int) (n int, err error) {
//@ unfold acc(c.Mem(), _)
// (VerifiedSCION) 1 is the length of the buffers of the messages in msgs
return c.pconn.WriteBatch(msgs, flags /*@, 1 @*/)
return c.pconn.WriteBatch(msgs, flags)
}

// SetReadDeadline sets the read deadline associated with the endpoint.
Expand Down Expand Up @@ -463,11 +463,11 @@ func (c *connUDPBase) Close() (err error) {
// messages.
// @ requires 0 < n
// @ ensures len(res) == n
// @ ensures forall i int :: { &res[i] } 0 <= i && i < n ==> res[i].Mem(1)
// @ ensures forall i int :: { &res[i] } 0 <= i && i < n ==> res[i].Mem() && res[i].GetAddr() == nil
// @ decreases
func NewReadMessages(n int) (res Messages) {
m := make(Messages, n)
//@ invariant forall j int :: { &m[j] } (0 <= j && j < i0) ==> m[j].Mem(1)
//@ invariant forall j int :: { &m[j] } (0 <= j && j < i0) ==> m[j].Mem() && m[j].GetAddr() == nil
//@ invariant forall j int :: { &m[j] } (i0 <= j && j < len(m)) ==> acc(&m[j]) && m[j].N == 0
//@ invariant forall j int :: { m[j].Addr } (i0 <= j && j < len(m)) ==> m[j].Addr == nil
//@ invariant forall j int :: { m[j].OOB } (i0 <= j && j < len(m)) ==> m[j].OOB == nil
Expand All @@ -477,7 +477,7 @@ func NewReadMessages(n int) (res Messages) {
m[i].Buffers = make([][]byte, 1)
//@ fold slices.AbsSlice_Bytes(m[i].Buffers[0], 0, len(m[i].Buffers[0]))
//@ fold slices.AbsSlice_Bytes(m[i].OOB, 0, len(m[i].OOB))
//@ fold m[i].Mem(1)
//@ fold m[i].Mem()
}
return m
}
Loading
Loading