在试图让 CODAN 运行一些用于 Mac 的代码时,我遇到了很多这样的错误。我的 Mac SDK 库是通过符号链接包含在这个问题中的(但不是全部 - 请继续关注!)最后,结果证明我没有包含所有标题。例如,我有以下函数调用:
IORegistryEntryGetParentEntry(service, kIOServicePlane, &parent);
这给出了错误:
Invalid arguments 'Candidates are: ? IORegistryEntryGetParentEntry(?,?,?)'
IOKit/IOKitLib.h
现在,在(我确实有)中定义的函数的正确签名是:
kern_return_t IORegistryEntryGetParentEntry(
io_registry_entry_t entry,
const io_name_t plane,
io_registry_entry_t *parent );
现在,如果我们采用第一个参数并跟踪类型定义,我们会得到:
typedef io_object_t io_registry_entry_t; (in IOKit/IOTypes.h)
typedef mach_port_t io_object_t; (in IOKit/IOTypes.h)
typedef mach_port_name_t mach_port_t; (in mach/port.h)
typedef natural_t mach_port_name_t; (in mach/port.h)
进而!我没有包含定义的__darwin_natural_t
。这个包含实际上是i386
在我的符号链接目录中没有的。添加它完成了链:
typedef __darwin_natural_t natural_t; (in i386/vm_types.h)
typedef unsigned int __darwin_natural_t; (in i386/_types.h)
最后,CODAN 知道参数 1IORegistryEntryGetParentEntry()
应该是什么类型,错误变为:
Invalid arguments 'Candidates are: kern_return_t IORegistryEntryGetParentEntry(io_registry_entry_t ,?,io_registry_entry_t*)'
我对其他参数重复了这个“类型跟踪”,发现错误消失了(我什至不需要重建索引,但是 YMMV)。当然,您需要找到您需要的标头,并确保它们已包含在内 - 以上只是一个示例!