macos-CFStringGetLength EXC_坏访问(SIGSEGV)崩溃

macos-CFStringGetLength EXC_坏访问(SIGSEGV)崩溃,macos,core-foundation,Macos,Core Foundation,我有以下代码: char *get_string_property_2(IOHIDDeviceRef device, CFStringRef prop) { CFStringRef str = IOHIDDeviceGetProperty(device, prop); if(str) { CFIndex str_len = CFStringGetLength(str); ... } ... } 有时(并非总是)

我有以下代码:

char *get_string_property_2(IOHIDDeviceRef device, CFStringRef prop)
{

    CFStringRef str = IOHIDDeviceGetProperty(device, prop);

    if(str)
    {
         CFIndex str_len = CFStringGetLength(str);
         ...

    }

    ...
}
有时(并非总是)我在
CFStringGetLength
中遇到以下日志崩溃:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00007fff770083a8

Thread 8 Crashed:
0   libobjc.A.dylib                 0x00007fff88e22097 objc_msgSend + 23
1   libtobii_usb.dylib              0x00000001081c4f72 get_string_property_2 + 130 (macosx.c:99)
2   serviced                        0x00000001081a5fad device_removed_callback + 285 (daemond_mac.c:614)
3   libsystem_pthread.dylib         0x00007fff8ae35899 _pthread_body + 138
4   libsystem_pthread.dylib         0x00007fff8ae3572a _pthread_start + 137
5   libsystem_pthread.dylib         0x00007fff8ae39fc9 thread_start + 13
我怎样才能解决这个问题?在调用
CFStringGetLength
之前,我正在检查str是否为NULL,显然这还不够

编辑:

我仍然会受到撞击,总是在同一个地方

如果它是一个错误的指针,为什么不在
IOHIDDeviceGetProperty
的上面一行崩溃呢

是否有其他方法可以获得
CFStringRef
的长度


我怀疑api中有一个bug。

一些想法。首先,IOKit的生命周期对我来说总是很棘手。在许多方面,在保留对象时必须格外小心,因为这些对象被API调用“消耗”

其次,你的崩溃发生在设备的回调中,这进一步让我怀疑某些对象在幕后被释放,但直到回调发生,你才注意到

坏指针并不总是空的,并且经常指向映射到进程中的内存,但并不指向您认为应该指向的内存。这通常被称为悬空指针,非常非常常见。通常也很难调试

我敢打赌,这是由于IOKit代码的另一个区域中的对象生命周期问题造成的,并且在这里有所体现。尝试使用NSZombies(这可能也适用于CF对象,我想不起来)。另外,再次检查正在注册设备通知的区域是否在内存管理方面做了正确的事情。我在那方面遇到了很多错误