LINUX.ORG.RU

История изменений

Исправление 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* число)