4343
4444using namespace swift ;
4545
46+ // / Returns true if the pointer passed to a native retain or release is valid.
47+ // / If false, the operation should immediately return.
48+ static inline bool isValidPointerForNativeRetain (const void *p) {
49+ #if defined(__x86_64__) || defined(__arm64__)
50+ // On these platforms, the upper half of address space is reserved for the
51+ // kernel, so we can assume that pointer values in this range are invalid.
52+ return (intptr_t )p > 0 ;
53+ #else
54+ return p != nullptr ;
55+ #endif
56+ }
57+
4658HeapObject *swift::swift_allocObject (HeapMetadata const *metadata,
4759 size_t requiredSize,
4860 size_t requiredAlignmentMask)
@@ -185,7 +197,7 @@ OpaqueValue *swift::swift_projectBox(HeapObject *o) {
185197 // for boxes of empty type. The address of an empty value is always undefined,
186198 // so we can just return nil back in this case.
187199 if (!o)
188- return reinterpret_cast <OpaqueValue*>(o) ;
200+ return nullptr ;
189201 auto metadata = static_cast <const GenericBoxHeapMetadata *>(o->metadata );
190202 return metadata->project (o);
191203}
@@ -206,7 +218,7 @@ void swift::swift_nonatomic_retain(HeapObject *object) {
206218SWIFT_RT_ENTRY_IMPL_VISIBILITY
207219extern " C"
208220void SWIFT_RT_ENTRY_IMPL (swift_nonatomic_retain)(HeapObject *object) {
209- if (object)
221+ if (isValidPointerForNativeRetain ( object) )
210222 object->refCounts .incrementNonAtomic (1 );
211223}
212224
@@ -217,15 +229,15 @@ void swift::swift_nonatomic_release(HeapObject *object) {
217229SWIFT_RT_ENTRY_IMPL_VISIBILITY
218230extern " C"
219231void SWIFT_RT_ENTRY_IMPL (swift_nonatomic_release)(HeapObject *object) {
220- if (object)
232+ if (isValidPointerForNativeRetain ( object) )
221233 object->refCounts .decrementAndMaybeDeinitNonAtomic (1 );
222234}
223235
224236SWIFT_RT_ENTRY_IMPL_VISIBILITY
225237extern " C"
226238void SWIFT_RT_ENTRY_IMPL (swift_retain)(HeapObject *object)
227239 SWIFT_CC(RegisterPreservingCC_IMPL) {
228- if (object)
240+ if (isValidPointerForNativeRetain ( object) )
229241 object->refCounts .increment (1 );
230242}
231243
@@ -238,7 +250,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
238250extern " C"
239251void SWIFT_RT_ENTRY_IMPL (swift_retain_n)(HeapObject *object, uint32_t n)
240252 SWIFT_CC(RegisterPreservingCC_IMPL) {
241- if (object)
253+ if (isValidPointerForNativeRetain ( object) )
242254 object->refCounts .increment (n);
243255}
244256
@@ -251,7 +263,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
251263extern " C"
252264void SWIFT_RT_ENTRY_IMPL (swift_nonatomic_retain_n)(HeapObject *object, uint32_t n)
253265 SWIFT_CC(RegisterPreservingCC_IMPL) {
254- if (object)
266+ if (isValidPointerForNativeRetain ( object) )
255267 object->refCounts .incrementNonAtomic (n);
256268}
257269
@@ -264,7 +276,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
264276extern " C"
265277void SWIFT_RT_ENTRY_IMPL (swift_release)(HeapObject *object)
266278 SWIFT_CC(RegisterPreservingCC_IMPL) {
267- if (object)
279+ if (isValidPointerForNativeRetain ( object) )
268280 object->refCounts .decrementAndMaybeDeinit (1 );
269281}
270282
@@ -277,7 +289,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
277289extern " C"
278290void SWIFT_RT_ENTRY_IMPL (swift_release_n)(HeapObject *object, uint32_t n)
279291 SWIFT_CC(RegisterPreservingCC_IMPL) {
280- if (object)
292+ if (isValidPointerForNativeRetain ( object) )
281293 object->refCounts .decrementAndMaybeDeinit (n);
282294}
283295
@@ -294,7 +306,7 @@ SWIFT_RT_ENTRY_IMPL_VISIBILITY
294306extern " C"
295307void SWIFT_RT_ENTRY_IMPL (swift_nonatomic_release_n)(HeapObject *object, uint32_t n)
296308 SWIFT_CC(RegisterPreservingCC_IMPL) {
297- if (object)
309+ if (isValidPointerForNativeRetain ( object) )
298310 object->refCounts .decrementAndMaybeDeinitNonAtomic (n);
299311}
300312
@@ -308,15 +320,15 @@ size_t swift::swift_unownedRetainCount(HeapObject *object) {
308320
309321void swift::swift_unownedRetain (HeapObject *object)
310322 SWIFT_CC(RegisterPreservingCC_IMPL) {
311- if (!object)
323+ if (!isValidPointerForNativeRetain ( object) )
312324 return ;
313325
314326 object->refCounts .incrementUnowned (1 );
315327}
316328
317329void swift::swift_unownedRelease (HeapObject *object)
318330 SWIFT_CC(RegisterPreservingCC_IMPL) {
319- if (!object)
331+ if (!isValidPointerForNativeRetain ( object) )
320332 return ;
321333
322334 // Only class objects can be unowned-retained and unowned-released.
@@ -334,15 +346,15 @@ void swift::swift_unownedRelease(HeapObject *object)
334346
335347void swift::swift_unownedRetain_n (HeapObject *object, int n)
336348 SWIFT_CC(RegisterPreservingCC_IMPL) {
337- if (!object)
349+ if (!isValidPointerForNativeRetain ( object) )
338350 return ;
339351
340352 object->refCounts .incrementUnowned (n);
341353}
342354
343355void swift::swift_unownedRelease_n (HeapObject *object, int n)
344356 SWIFT_CC(RegisterPreservingCC_IMPL) {
345- if (!object)
357+ if (!isValidPointerForNativeRetain ( object) )
346358 return ;
347359
348360 // Only class objects can be unowned-retained and unowned-released.
@@ -359,7 +371,7 @@ void swift::swift_unownedRelease_n(HeapObject *object, int n)
359371
360372HeapObject *swift::swift_tryPin (HeapObject *object)
361373 SWIFT_CC(RegisterPreservingCC_IMPL) {
362- assert (object);
374+ assert (isValidPointerForNativeRetain ( object) );
363375
364376 // Try to set the flag. If this succeeds, the caller will be
365377 // responsible for clearing it.
@@ -373,7 +385,7 @@ HeapObject *swift::swift_tryPin(HeapObject *object)
373385
374386void swift::swift_unpin (HeapObject *object)
375387 SWIFT_CC(RegisterPreservingCC_IMPL) {
376- if (object)
388+ if (isValidPointerForNativeRetain ( object) )
377389 object->refCounts .decrementAndUnpinAndMaybeDeinit ();
378390}
379391
@@ -398,15 +410,15 @@ HeapObject *swift::swift_nonatomic_tryPin(HeapObject *object)
398410
399411void swift::swift_nonatomic_unpin (HeapObject *object)
400412 SWIFT_CC(RegisterPreservingCC_IMPL) {
401- if (object)
413+ if (isValidPointerForNativeRetain ( object) )
402414 object->refCounts .decrementAndUnpinAndMaybeDeinitNonAtomic ();
403415}
404416
405417SWIFT_RT_ENTRY_IMPL_VISIBILITY
406418extern " C"
407419HeapObject *SWIFT_RT_ENTRY_IMPL (swift_tryRetain)(HeapObject *object)
408420 SWIFT_CC(RegisterPreservingCC_IMPL) {
409- if (!object)
421+ if (!isValidPointerForNativeRetain ( object) )
410422 return nullptr ;
411423
412424 if (object->refCounts .tryIncrement ()) return object;
@@ -421,14 +433,14 @@ bool swift_isDeallocating(HeapObject *object) {
421433SWIFT_RT_ENTRY_IMPL_VISIBILITY
422434extern " C"
423435bool SWIFT_RT_ENTRY_IMPL (swift_isDeallocating)(HeapObject *object) {
424- if (!object)
436+ if (!isValidPointerForNativeRetain ( object) )
425437 return false ;
426438 return object->refCounts .isDeiniting ();
427439}
428440
429441void swift::swift_unownedRetainStrong (HeapObject *object)
430442 SWIFT_CC(RegisterPreservingCC_IMPL) {
431- if (!object)
443+ if (!isValidPointerForNativeRetain ( object) )
432444 return ;
433445 assert (object->refCounts .getUnownedCount () &&
434446 " object is not currently unowned-retained" );
@@ -439,7 +451,7 @@ void swift::swift_unownedRetainStrong(HeapObject *object)
439451
440452void swift::swift_unownedRetainStrongAndRelease (HeapObject *object)
441453 SWIFT_CC(RegisterPreservingCC_IMPL) {
442- if (!object)
454+ if (!isValidPointerForNativeRetain ( object) )
443455 return ;
444456 assert (object->refCounts .getUnownedCount () &&
445457 " object is not currently unowned-retained" );
@@ -454,7 +466,7 @@ void swift::swift_unownedRetainStrongAndRelease(HeapObject *object)
454466}
455467
456468void swift::swift_unownedCheck (HeapObject *object) {
457- if (!object) return ;
469+ if (!isValidPointerForNativeRetain ( object) ) return ;
458470 assert (object->refCounts .getUnownedCount () &&
459471 " object is not currently unowned-retained" );
460472
0 commit comments