Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a91ee4bb
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
a91ee4bb
编写于
6月 19, 2017
作者:
R
Ralf Jung
提交者:
Oliver Schneider
7月 25, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
validate boxes
上级
22f43e2d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
25 addition
and
13 deletion
+25
-13
src/librustc_mir/interpret/lvalue.rs
src/librustc_mir/interpret/lvalue.rs
+25
-13
未找到文件。
src/librustc_mir/interpret/lvalue.rs
浏览文件 @
a91ee4bb
...
...
@@ -2,6 +2,7 @@
use
rustc
::
mir
;
use
rustc
::
ty
::
layout
::{
Size
,
Align
};
use
rustc
::
ty
::{
self
,
Ty
};
use
rustc
::
middle
::
region
::
CodeExtent
;
use
rustc_data_structures
::
indexed_vec
::
Idx
;
use
syntax
::
ast
::
Mutability
;
...
...
@@ -469,7 +470,7 @@ pub(super) fn lvalue_ty(&self, lvalue: &mir::Lvalue<'tcx>) -> Ty<'tcx> {
// Validity checks
impl
<
'a
,
'tcx
>
EvalContext
<
'a
,
'tcx
>
{
fn
va
riant_check_valid
(
fn
va
lidate_variant
(
&
mut
self
,
lvalue
:
Lvalue
<
'tcx
>
,
ty
:
Ty
<
'tcx
>
,
...
...
@@ -486,6 +487,20 @@ fn variant_check_valid(
Ok
(())
}
fn
validate_ptr
(
&
mut
self
,
val
:
Value
,
region
:
Option
<
CodeExtent
>
,
pointee_ty
:
Ty
<
'tcx
>
,
mutbl
:
TyMutability
)
->
EvalResult
<
'tcx
>
{
use
self
::
TyMutability
::
*
;
// Acquire lock
let
(
len
,
_
)
=
self
.size_and_align_of_dst
(
pointee_ty
,
val
)
?
;
let
ptr
=
val
.into_ptr
(
&
mut
self
.memory
)
?
.to_ptr
()
?
;
let
access
=
match
mutbl
{
MutMutable
=>
AccessKind
::
Write
,
MutImmutable
=>
AccessKind
::
Read
};
self
.memory
.acquire_lock
(
ptr
,
len
,
region
,
access
)
?
;
// Recurse
let
pointee_lvalue
=
self
.val_to_lvalue
(
val
,
pointee_ty
)
?
;
self
.acquire_valid
(
pointee_lvalue
,
pointee_ty
,
mutbl
)
}
pub
(
super
)
fn
acquire_valid
(
&
mut
self
,
lvalue
:
Lvalue
<
'tcx
>
,
ty
:
Ty
<
'tcx
>
,
outer_mutbl
:
TyMutability
)
->
EvalResult
<
'tcx
>
{
use
rustc
::
ty
::
TypeVariants
::
*
;
use
rustc
::
ty
::
RegionKind
::
*
;
...
...
@@ -504,21 +519,18 @@ pub(super) fn acquire_valid(&mut self, lvalue: Lvalue<'tcx>, ty: Ty<'tcx>, outer
Ok
(())
}
TyRef
(
region
,
ty
::
TypeAndMut
{
ty
:
pointee_ty
,
mutbl
})
=>
{
// Acquire lock
let
val
=
self
.read_lvalue
(
lvalue
)
?
;
let
(
len
,
_
)
=
self
.size_and_align_of_dst
(
pointee_ty
,
val
)
?
;
let
ptr
=
val
.into_ptr
(
&
mut
self
.memory
)
?
.to_ptr
()
?
;
let
combined_mutbl
=
match
outer_mutbl
{
MutMutable
=>
mutbl
,
MutImmutable
=>
MutImmutable
};
let
access
=
match
combined_mutbl
{
MutMutable
=>
AccessKind
::
Write
,
MutImmutable
=>
AccessKind
::
Read
};
let
region
=
match
*
region
{
let
extent
=
match
*
region
{
ReScope
(
extent
)
=>
Some
(
extent
),
_
=>
None
,
};
self
.memory
.acquire_lock
(
ptr
,
len
,
region
,
access
)
?
;
// Recurse
let
pointee_lvalue
=
self
.val_to_lvalue
(
val
,
pointee_ty
)
?
;
self
.acquire_valid
(
pointee_lvalue
,
pointee_ty
,
combined_mutbl
)
self
.validate_ptr
(
val
,
extent
,
pointee_ty
,
combined_mutbl
)
}
TyAdt
(
adt
,
_
)
if
adt
.is_box
()
=>
{
let
val
=
self
.read_lvalue
(
lvalue
)
?
;
// TODO: The region can't always be None. It must take outer borrows into account.
self
.validate_ptr
(
val
,
None
,
ty
.boxed_ty
(),
outer_mutbl
)
}
TySlice
(
elem_ty
)
=>
{
let
len
=
match
lvalue
{
...
...
@@ -555,10 +567,10 @@ pub(super) fn acquire_valid(&mut self, lvalue: Lvalue<'tcx>, ty: Ty<'tcx>, outer
// Recursively validate the fields
let
variant
=
&
adt
.variants
[
variant_idx
];
self
.va
riant_check_valid
(
lvalue
,
ty
,
variant
,
subst
,
outer_mutbl
)
self
.va
lidate_variant
(
lvalue
,
ty
,
variant
,
subst
,
outer_mutbl
)
}
AdtKind
::
Struct
=>
{
self
.va
riant_check_valid
(
lvalue
,
ty
,
adt
.struct_variant
(),
subst
,
outer_mutbl
)
self
.va
lidate_variant
(
lvalue
,
ty
,
adt
.struct_variant
(),
subst
,
outer_mutbl
)
}
AdtKind
::
Union
=>
{
// No guarantees are provided for union types.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录