summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Hotham <david.hotham@metaswitch.com>2015-10-24 10:30:04 +0100
committerDavid Hotham <david.hotham@metaswitch.com>2015-10-24 11:01:46 +0100
commit522fbea80bda6a6d94d84c23cdac87f3ad530a04 (patch)
tree2c61ec9b194f2572f643ac1888466c691a08823a
parent56faaf291d87355c204bf7deec66128d6090d4d1 (diff)
Presume that a function taking a pointer is unsafe
-rw-r--r--src/gen.rs20
-rw-r--r--src/parser.rs7
-rw-r--r--src/types.rs1
3 files changed, 22 insertions, 6 deletions
diff --git a/src/gen.rs b/src/gen.rs
index fc90e5fa..2986cf39 100644
--- a/src/gen.rs
+++ b/src/gen.rs
@@ -1011,11 +1011,13 @@ fn cty_to_rs(ctx: &mut GenCtx, ty: &Type) -> ast::Ty {
},
&TFuncPtr(ref sig) => {
let decl = cfuncty_to_rs(ctx, &*sig.ret_ty, &sig.args[..], sig.is_variadic);
- mk_fnty(ctx, &decl, sig.abi)
+ let unsafety = if sig.is_safe { ast::Unsafety::Normal } else { ast::Unsafety::Unsafe };
+ mk_fnty(ctx, &decl, unsafety, sig.abi)
},
&TFuncProto(ref sig) => {
let decl = cfuncty_to_rs(ctx, &*sig.ret_ty, &sig.args[..], sig.is_variadic);
- mk_fn_proto_ty(ctx, &decl, sig.abi)
+ let unsafety = if sig.is_safe { ast::Unsafety::Normal } else { ast::Unsafety::Unsafe };
+ mk_fn_proto_ty(ctx, &decl, unsafety, sig.abi)
},
&TNamed(ref ti) => {
let id = rust_type_id(ctx, ti.borrow().name.clone());
@@ -1092,9 +1094,12 @@ fn mk_arrty(ctx: &GenCtx, base: &ast::Ty, n: usize) -> ast::Ty {
};
}
-fn mk_fn_proto_ty(ctx: &mut GenCtx, decl: &ast::FnDecl, abi: abi::Abi) -> ast::Ty {
+fn mk_fn_proto_ty(ctx: &mut GenCtx,
+ decl: &ast::FnDecl,
+ unsafety: ast::Unsafety,
+ abi: abi::Abi) -> ast::Ty {
let fnty = ast::TyBareFn(P(ast::BareFnTy {
- unsafety: ast::Unsafety::Normal,
+ unsafety: unsafety,
abi: abi,
lifetimes: Vec::new(),
decl: P(decl.clone())
@@ -1107,9 +1112,12 @@ fn mk_fn_proto_ty(ctx: &mut GenCtx, decl: &ast::FnDecl, abi: abi::Abi) -> ast::T
}
}
-fn mk_fnty(ctx: &mut GenCtx, decl: &ast::FnDecl, abi: abi::Abi) -> ast::Ty {
+fn mk_fnty(ctx: &mut GenCtx,
+ decl: &ast::FnDecl,
+ unsafety: ast::Unsafety,
+ abi: abi::Abi) -> ast::Ty {
let fnty = ast::TyBareFn(P(ast::BareFnTy {
- unsafety: ast::Unsafety::Normal,
+ unsafety: unsafety,
abi: abi,
lifetimes: Vec::new(),
decl: P(decl.clone())
diff --git a/src/parser.rs b/src/parser.rs
index bfb8065d..8c80ea3e 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -218,10 +218,17 @@ fn mk_fn_sig(ctx: &mut ClangParserCtx, ty: &cx::Type, cursor: &Cursor) -> il::Fu
let ret_ty = Box::new(conv_ty(ctx, &ty.ret_type(), cursor));
let abi = get_abi(ty.call_conv());
+ // Function is presumed unsafe if it takes a pointer argument.
+ let is_unsafe = args_lst.iter().any(|arg| match arg.1 {
+ TPtr(_, _, _) => true,
+ _ => false
+ });
+
il::FuncSig {
ret_ty: ret_ty,
args: args_lst,
is_variadic: ty.is_variadic(),
+ is_safe: !is_unsafe,
abi: abi,
}
}
diff --git a/src/types.rs b/src/types.rs
index 5af176bf..80042783 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -74,6 +74,7 @@ pub struct FuncSig {
pub ret_ty: Box<Type>,
pub args: Vec<(String, Type)>,
pub is_variadic: bool,
+ pub is_safe: bool,
pub abi: abi::Abi,
}