История изменений
Исправление lwo, (текущая версия) :
const
-объекты не могут быть изменены. Если ты получил const
-ссылку, сделал const_cast
¹, чтобы избавиться от const-ности, и поменял объект, это UB. Так можно делать, только если знаешь, что исходный объект, на который ссылка - действительно не const
.
Поэтому компиляторы на практике по возможности располагают статические const
данные в read-only секции, чтобы твоя программа при попытке их поменять вовсе упала. Это и произошло.
Обычно данные в callback передают через void*
. Тот, кто установил callback, может проконтролировать и const-ность объекта, на который передаётся указатель², и то, что callback не меняет его, поэтому const_cast
на границе между пользовательским и библиотечным кодом - ОК, но надо быть осторожным.
Эти правила действуют одинаково и в C++, и в C (с точностью до наличия в языке const_cast
).
¹ (в C++ сишный каст с круглыми скобками тоже первым делом выполняет const_cast
)
² (а может быть, это вообще не указатель, а просто упакованное в void*
число)
Исходная версия lwo, :
const
-объекты не могут быть изменены. Если ты получил const
-ссылку, сделал const_cast
¹, чтобы избавиться от const-ности, и поменял объект, это UB. Так можно делать, только если знаешь, что исходный объект, на который ссылка - действительно не const
.
Поэтому компиляторы на практике по возможности располагают статические const
данные в read-only секции, чтобы твоя программа при попытке их поменять вовсе упала. Это и произошло.
Обычно данные в callback передают через void*
. Тот, кто установил callback, может проконтролировать и const-ность объекта, на который передаётся указатель², и то, что callback не меняет его, поэтому const_cast
на границе между пользовательским и библиотечным кодом - ОК, но надо быть осторожным.
Эти правила действуют одинаково и в C++, и в C (с точностью до наличия в языке const_cast
).
¹ (в C++ сишный каст с круглыми скобками тоже первым делом выполняет const_cast
)
² (а может быть, это вообще не указатель, а просто упакованное в void*
число)