Coverity 标记了一个我无法理解的问题。
我有一个初始化器:
1686 arrayOfNodeIds componentRefs = (arrayOfNodeIds) {
1687 .size = 2,
1688 .ids = (UA_NodeId[]) { UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY)}
1689 };
成员 ids 包含一个数组。然后这个结构被赋予一个函数:
1707 UA_Server_addInstanceOf_instatiateChildNode(server, &subtypeRefs, &componentRefs, &typedefRefs,
1708 objectRoot, callback, (UA_ObjectTypeNode *) typeDefNode,
1709 UA_TRUE, &instantiatedTypes, handle);
该函数取消引用 conponentRefs->ids 并且 Coverity 将其标记为对范围之外的局部变量的访问。
通过谷歌搜索,我在一个 linux 驱动程序中发现了一个类似的问题,该问题通过使用 memcpy 到堆栈变量来解决。但是,我根本不明白这个问题。内部数组的初始化器是否被视为范围限制器?有问题的文件可以在github上找到。
PS:arrayOfNodeIds的定义:
typedef struct arrayOfNodeIds_s {
UA_Int32 size;
UA_NodeId *ids;
} arrayOfNodeIds;