【问题标题】:Wrong result when getting UUID获取 UUID 时结果错误
【发布时间】:2021-10-23 00:58:45
【问题描述】:

我正在尝试获取机器的 UUID,但此代码得到错误的结果。

const char* getUUID() {
  char ret[512];
  io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/");
  CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
  IOObjectRelease(ioRegistryRoot);
  CFStringGetCString(uuidCf, ret, sizeof(ret)*sizeof(char), kCFStringEncodingUTF8);
  CFRelease(uuidCf);
  NSLog(@"getUUID1: %s", ret);
  return ret;
}
const char* getCPU() {
  char ret[255];
  strcpy(ret, "");
  NSLog(@"getUUID2: %s", getUUID());
  strcat(ret, getUUID());
  NSLog(@"ret: %s", ret);
  return ret;
}

返回这个结果:

getUUID1: 72B5E603-C915-52A7-K7C8-3E2N5214D18B - 好

getUUID2: 72B5E60 - 错误

getUUID1: 72B5E603-C915-52A7-K7C8-3E2N5214D18B - 好

ret: !è`? - 完全错误

我哪里错了?

【问题讨论】:

  • 您正在返回一个指向局部变量的指针 (ret[512])。这是无效的。 stackoverflow.com/questions/19042552/… 也看看这个:stackoverflow.com/questions/1042940/… 特别是 std::vector 用作缓冲区的部分
  • 返回分配在堆栈上的数据是 C++ 中的 #1 内存管理错误。大多数编译器都会对此发出警告。 Xcode 也是如此。你有没有看到警告说“返回的与局部变量'ret'相关的堆栈内存地址”

标签: c++ xcode macos


【解决方案1】:

我没有你所有的包含或库,所以下一个代码未经测试。 但我认为具有正确缓冲区的代码如下所示:

#include <string>
#include <vector>

constexpr size_t buf_size = 512u;

std::string getUUID() 
{
    std::vector<char> buffer(buf_size);
    io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/");
    CFStringRef uuidCf = (CFStringRef)IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
    IOObjectRelease(ioRegistryRoot);
    CFStringGetCString(uuidCf, &buffer[0], buffer.size() * sizeof(char), kCFStringEncodingUTF8);
    CFRelease(uuidCf);
    NSLog(@"getUUID1: %s", ret);

    return std::string(buffer.data());
}

std::string getCPU() {
    std::vector<char> buffer(buf_size);
    NSLog(@"getUUID2: %s", getUUID());
    std::string ret(buffer.data());
    NSLog(@"ret: %s", ret);
    return ret;
}

【讨论】:

  • 但这完全是另一回事。谢谢,但需要一个字符解决方案而不是字符串和向量。
  • 好的,这是否意味着您正在使用“C”语言工作?然后你需要“新建”缓冲区并让调用者删除它。或者您必须让客户端分配一个字符缓冲区并将其传递给函数。
  • 静态字符 ret[512];好像可以解决问题,但是不知道是不是完整的解决方案
  • 如果我使用“新”解决方案,使用后如何删除?
  • @JunaydFinley 将其设为静态确实有效,这意味着变量未在堆栈上分配。但是它将被初始化一次并在程序期间保留内存。它通常只在真正需要时使用。
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2022-01-12
  • 2017-04-11
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多