You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Strange conflict between NSProcessInfo and NSScreen, causing segmentation fault. #107
I found a strange conflict issue between NSScreen and NSProcessInfo. Using both NSProcessInfo.operatingSystemVersion and UIScreen.mainScreen will cause the application to crash with "segmentation fault". But I can't imagine the relation between them.
Minimal Example:
#[macro_use]externcrate objc;use cocoa::{appkit::NSScreen, base::nil};use objc::{runtime::Object};fnmain(){unsafe{let ns_process_info = class!(NSProcessInfo);let process_info:*mutObject = msg_send![ns_process_info, processInfo];// Deleting either of the following two lines will avoid the crash.let os_version:*constObject = msg_send![process_info, operatingSystemVersion];let screen = NSScreen::mainScreen(nil);}}
msg_send! has no way to know what sending the operatingSystemVersion selector to NSProcessInfo could possibly return, so when you write let os_version: *const Object, you have the responsibility to ensure that the return type is correct. When it isn't you get to keep both pieces (this isunsafe code after all).
In this case, operatingSystemVersion does not return an instance pointer (*const Object), the return type is a struct NSOperatingSystemVersion with three integers (found out by looking at C header files and the documentation).
So the correct usage would be:
use cocoa::foundation::NSInteger;#[repr(C)]structNSOperatingSystemVersion{major_version:NSInteger;
minor_version:NSInteger;
patch_version:NSInteger;}let os_version:NSOperatingSystemVersion = msg_send![process_info, operatingSystemVersion];
Activity
madsmtm commentedon Oct 14, 2021
msg_send!has no way to know what sending theoperatingSystemVersionselector toNSProcessInfocould possibly return, so when you writelet os_version: *const Object, you have the responsibility to ensure that the return type is correct. When it isn't you get to keep both pieces (this isunsafecode after all).In this case,
operatingSystemVersiondoes not return an instance pointer (*const Object), the return type is a structNSOperatingSystemVersionwith three integers (found out by looking at C header files and the documentation).So the correct usage would be: