Я пишу Плагин LLVM. В нем я создаю глобальный массив указателей которые берут данные по потоку различных функций в программе. Когда указатели получают адрес в области действия функции, логично предположить, что, как только они выходят за пределы их области действия, существует риск того, что содержимое памяти будет перезаписано, если операционная система сочтет это целесообразным.
Я хотел бы знать, есть ли способ сделать содержимое указателя неизменным (если я не нахожусь в необходимости изменить это) через все сферы, конечно, внутри программы.
Я думал, что флаг как volatile
это бы сработало, но, похоже, все, что он делает, это сохраняет свою последовательную позицию по сравнению с энергонезависимыми инструкциями.
Скорее всего вам нужно скопировать данные.
Вы можете пометить память как недоступную для записи, что не позволит никому писать в нее. Однако, если указатель находится в стеке или был освобожден, это, вероятно, будет иметь нежелательные последствия (а именно, segfaults и многие из них). Кроме того, это должно быть сделано на странице, например, большими кусками.
Помните, что если я освобожу указатель, данные, на которые он указал, могут быть позже использованы другой функцией. Даже если я «обещаю» не изменять данные, на которые указывает указатель, после их освобождения … все ставки сняты. Кто-то может выделить ту же память.
Если вам нужно сохранить данные после того, как они будут свободны / они выходят за рамки, вы должны скопировать их.
Других решений пока нет …