[cfe-dev] is there any way to detect temporary referencing with clang?
Dennis Luehring
dl.soluz at gmx.net
Tue Jul 15 23:54:46 PDT 2014
or is that already covered by
https://code.google.com/p/address-sanitizer/issues/detail?id=73
example:
#include <cstdint>
#include <cstdio>
class user_t
{
public:
user_t(const int64_t& p_a):
m_a(p_a)
{
}
const int64_t& m_a; // someone added evil & while refactoring
int64_t use_it() const
{
return m_a;
}
};
#define EVIL_TEMPORARY
//example result:
//EVIL_TEMPORARY Mode
// X Release --> a: 8, user_a: 75769734271860736 FAIL
// X Debug --> a: 8, user_a: 7 FAIL
// - Release --> a: 8, user_a: 8 OK
// - Debug --> a: 8, user_a: 8 OK
int main(int argc, char** argv)
{
const int64_t value = argc+6;
int64_t a = value;
#if defined(EVIL_TEMPORARY)
const user_t user(a++); // the temporary result of a++ is referenced
by member m_a
#else
const user_t user(a);
++a;
#endif
const int64_t user_a = user.use_it();
const bool ok = user_a == a;
printf("a: %I64d, user_a: %I64d %s\n", a, user_a, ok ? "OK":"FAIL");
return ok;
}
More information about the cfe-dev
mailing list