GCC 6 имеет новую функцию оптимизатора: предполагается, что this
всегда не является нулевым и оптимизирует на основе этого.
Распространение диапазона значений теперь предполагает, что этот указатель функций-членов С++ не равен нулю. Это устраняет общие проверки нулевого указателя , но также нарушает некоторые несоответствующие кодовые базы (такие как Qt-5, Chromium, KDevelop). В качестве временного обхода -fno-delete-null-pointer-проверок можно использовать. Неверный код можно определить, используя -fsanitize = undefined.
Документ изменения явно называет это опасным, поскольку он разбивает удивительное количество часто используемого кода.
Почему это новое предположение нарушит практический код на С++? Есть ли определенные шаблоны, когда неосторожные или неосведомленные программисты полагаются на это поведение undefined? Я не могу представить, чтобы кто-нибудь писал if (this == NULL)
, потому что это так неестественно.