interpret/memory: explain why we check is_thread_local_static
This commit is contained in:
parent
ef1b78eabe
commit
c83bcbbad9
@ -165,6 +165,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
// We need to handle `extern static`.
|
// We need to handle `extern static`.
|
||||||
match self.tcx.try_get_global_alloc(alloc_id) {
|
match self.tcx.try_get_global_alloc(alloc_id) {
|
||||||
Some(GlobalAlloc::Static(def_id)) if self.tcx.is_thread_local_static(def_id) => {
|
Some(GlobalAlloc::Static(def_id)) if self.tcx.is_thread_local_static(def_id) => {
|
||||||
|
// Thread-local statics do not have a constant address. They *must* be accessed via
|
||||||
|
// `ThreadLocalRef`; we can never have a pointer to them as a regular constant value.
|
||||||
bug!("global memory cannot point to thread-local static")
|
bug!("global memory cannot point to thread-local static")
|
||||||
}
|
}
|
||||||
Some(GlobalAlloc::Static(def_id)) if self.tcx.is_foreign_item(def_id) => {
|
Some(GlobalAlloc::Static(def_id)) if self.tcx.is_foreign_item(def_id) => {
|
||||||
@ -539,6 +541,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
None => throw_ub!(PointerUseAfterFree(id, CheckInAllocMsg::MemoryAccessTest)),
|
None => throw_ub!(PointerUseAfterFree(id, CheckInAllocMsg::MemoryAccessTest)),
|
||||||
Some(GlobalAlloc::Static(def_id)) => {
|
Some(GlobalAlloc::Static(def_id)) => {
|
||||||
assert!(self.tcx.is_static(def_id));
|
assert!(self.tcx.is_static(def_id));
|
||||||
|
// Thread-local statics do not have a constant address. They *must* be accessed via
|
||||||
|
// `ThreadLocalRef`; we can never have a pointer to them as a regular constant value.
|
||||||
assert!(!self.tcx.is_thread_local_static(def_id));
|
assert!(!self.tcx.is_thread_local_static(def_id));
|
||||||
// Notice that every static has two `AllocId` that will resolve to the same
|
// Notice that every static has two `AllocId` that will resolve to the same
|
||||||
// thing here: one maps to `GlobalAlloc::Static`, this is the "lazy" ID,
|
// thing here: one maps to `GlobalAlloc::Static`, this is the "lazy" ID,
|
||||||
@ -740,6 +744,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
match self.tcx.try_get_global_alloc(id) {
|
match self.tcx.try_get_global_alloc(id) {
|
||||||
Some(GlobalAlloc::Static(def_id)) => {
|
Some(GlobalAlloc::Static(def_id)) => {
|
||||||
assert!(self.tcx.is_static(def_id));
|
assert!(self.tcx.is_static(def_id));
|
||||||
|
// Thread-local statics do not have a constant address. They *must* be accessed via
|
||||||
|
// `ThreadLocalRef`; we can never have a pointer to them as a regular constant value.
|
||||||
assert!(!self.tcx.is_thread_local_static(def_id));
|
assert!(!self.tcx.is_thread_local_static(def_id));
|
||||||
// Use size and align of the type.
|
// Use size and align of the type.
|
||||||
let ty = self
|
let ty = self
|
||||||
|
Loading…
x
Reference in New Issue
Block a user