Clang 3.9 очень многократно использует память, используемую временными.
Этот код UB (упрощенный код):
template <class T>
class my_optional
{
public:
bool has{ false };
T value;
const T& get_or_default(const T& def)
{
return has ? value : def;
}
};
void use(const std::string& s)
{
// ...
}
int main()
{
my_optional<std::string> m;
// ...
const std::string& s = m.get_or_default("default value");
use(s); // s is dangling if default returned
}
У нас есть тонны кода, что-то вроде выше (my_optional
- просто пример, чтобы проиллюстрировать его).
Из-за UB все компиляторы clang с 3.9 начинают повторно использовать эту память, и это законное поведение.
Возникает вопрос: как обнаружить такие оборванные ссылки во время компиляции или что-то вроде дезинфицирующего средства во время выполнения? Ни один дезинфицирующий агент может обнаружить их.
Upd. Пожалуйста, не отвечайте: "используйте std::optional
". Читайте внимательно: вопрос не об этом.
UPD2. Пожалуйста, не отвечайте: "ваш код плохой". Читайте внимательно: вопрос НЕ о дизайне кода.