Мы имеем этот прототип функции:Обеспечение статической памяти для параметра функции
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%, поэтому подход нежелательно).
Извините, что не ответил на хороший вопрос, но: Вы уверены, что вам нужна * статическая * строка?Думаю, что строка, которая живет дольше, чем узел? Классическим способом решения этой проблемы является документация о ожидаемом времени жизни содержимого 'name' и программисты, читающие документацию. Субоптимальный, я знаю, но стандарт. – thiton
@thiton Конечно, в принципе вам нужно только то, что живет дольше, чем узел. Но так как большая часть кода, использующего это, автоматически генерируется, с строковым литералом и тем фактом, что обнаружение строкового литерала или статического хранилища звучит как более легкое задание для компилятора, чем отслеживание срока действия сурового объекта - это будет подходящий подход. – user964970
@larsmans уверен, что вопрос, похоже, о проверке времени выполнения? OP, похоже, требуется только проверка времени компиляции. – nos