我们有这个函数原型:
BNode *b_new_node(const char *name, int pos, int len, const char *val);
大多数使用这个(和类似的)代码是自动生成的代码,看起来像:
b = b_new_node("foo.bar.id.1", 0, 10, some_data);
该函数分配一个新的 BNode 并将 val
字符串复制到其中,但它只是将name
成员分配给一个指针,例如
b_strlcpy(new_node->val, val, sizeof new_node->val);
new_node->name = name;
如果 b_new_node("foo.bar.id.1", 0, 10, some_data); 中的第一个参数,这会造成严重破坏 不是字符串文字,也不是具有静态存储持续时间的其他内容,而是例如堆栈上的缓冲区。
无论如何,使用 gcc(其他编译器也很感兴趣),我们可以在编译时检查传入的这个参数是静态存储的吗?
(当然,避免这些可能出现的问题的简单方法是将该参数也复制到节点中 - 我们使用该方法所做的测量将内存需求增加了 50% 并将程序减慢了 10%,因此这种方法是不可取的)。