Rollup merge of #51747 - varkor:export_name-null-character, r=estebank

Add error for using null characters in #[export_name]

Fixes #51741.
This commit is contained in:
Pietro Albini 2018-06-26 11:35:39 +02:00 committed by GitHub
commit b2cf26eec1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 44 additions and 10 deletions

View File

@ -48,8 +48,3 @@ unsafe { simd_add(i32x2(0, 0), i32x2(1, 2)); } // ok!
"##, "##,
} }
register_diagnostics! {
E0558
}

View File

@ -1898,11 +1898,18 @@ fn codegen_fn_attrs<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, id: DefId) -> Codegen
} }
}); });
} else if attr.check_name("export_name") { } else if attr.check_name("export_name") {
if let s @ Some(_) = attr.value_str() { if let Some(s) = attr.value_str() {
codegen_fn_attrs.export_name = s; if s.as_str().contains("\0") {
// `#[export_name = ...]` will be converted to a null-terminated string,
// so it may not contain any null characters.
struct_span_err!(tcx.sess, attr.span, E0648,
"`export_name` may not contain null characters")
.emit();
}
codegen_fn_attrs.export_name = Some(s);
} else { } else {
struct_span_err!(tcx.sess, attr.span, E0558, struct_span_err!(tcx.sess, attr.span, E0558,
"export_name attribute has invalid format") "`export_name` attribute has invalid format")
.span_label(attr.span, "did you mean #[export_name=\"*\"]?") .span_label(attr.span, "did you mean #[export_name=\"*\"]?")
.emit(); .emit();
} }

View File

@ -3709,7 +3709,7 @@ The `export_name` attribute was malformed.
Erroneous code example: Erroneous code example:
```ignore (error-emitted-at-codegen-which-cannot-be-handled-by-compile_fail) ```ignore (error-emitted-at-codegen-which-cannot-be-handled-by-compile_fail)
#[export_name] // error: export_name attribute has invalid format #[export_name] // error: `export_name` attribute has invalid format
pub fn something() {} pub fn something() {}
fn main() {} fn main() {}
@ -4545,6 +4545,15 @@ fn start(_: isize, _: *const *const u8) -> isize where (): Copy {
``` ```
"##, "##,
E0648: r##"
`export_name` attributes may not contain null characters (`\0`).
```compile_fail,E0648
#[export_name="\0foo"] // error: `export_name` may not contain null characters
pub fn bar() {}
```
"##,
E0689: r##" E0689: r##"
This error indicates that the numeric value for the method being passed exists This error indicates that the numeric value for the method being passed exists
but the type of the numeric value or binding could not be identified. but the type of the numeric value or binding could not be identified.

View File

@ -1,4 +1,4 @@
error[E0558]: export_name attribute has invalid format error[E0558]: `export_name` attribute has invalid format
--> $DIR/E0558.rs:11:1 --> $DIR/E0558.rs:11:1
| |
LL | #[export_name] LL | #[export_name]

View File

@ -0,0 +1,14 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[export_name="\0foo"] //~ ERROR E0648
pub fn bar() {}
fn main() {}

View File

@ -0,0 +1,9 @@
error[E0648]: `export_name` may not contain null characters
--> $DIR/E0648.rs:11:1
|
LL | #[export_name="/0foo"] //~ ERROR E0648
| ^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
For more information about this error, try `rustc --explain E0648`.