Освобождение (vfree-ing) указателя на изменчивые данные

volatile кажется бесконечным вопросом каждого. Я думал, что все об этом знаю, но потом я столкнулся с этим:

Итак, у меня есть часть памяти, разделяемая между streamами, и я определил ее так:

 volatile type *name; 

Если это заставляет вас чувствовать себя лучше, вы можете представить, что type – это просто int .

Это означает, что у меня есть указатель (который не является изменчивым) на некоторые данные, которые нестабильны. Так, например, когда дело доходит до оптимизации, компилятор может кэшировать значение name но не name[0] . Я прав?

Итак, теперь я vfree этот указатель (он находится в модуле ядра Linux), и он сообщает мне, что vfree ожидает const void * то время как я передаю его volatile type * .

Я понимаю, как опасно передавать volatile type * как type * потому что в этой функции значения name[i] могут быть кэшированы (в результате оптимизации), что нежелательно.

Я не понимаю, почему, хотя, vfree ожидает, что я обязательно отправлю его указателю на энергонезависимые данные. Там что-то мне не хватает? Или это просто ребята, которые писали, не думая об этой ситуации?

Я полагаю, что я просто бросаю свой указатель на void * , не причинил бы вреда, верно?

Функция vfree (и всякая нормальная функция освобождения в целом) не заботятся о ваших фактических данных (будь она volatile или нет). Он просто ожидает (действительный) указатель (подумайте: передайте указатель как long значение в регистре CPU).

Основываясь на этом значении, функция будет:

  1. вызовите SLAB / SLUB, чтобы освободить память
  2. удалить карту памяти

Так что да, приведение к void * не повредит во время выполнения.

Мое заключение заключалось в том, что просто наведение указателя на void * не вызовет проблемы, и тот факт, что free и vfree напрямую не принимают указатели на volatile данные, – это просто что-то, что было упущено.