Details
Description
The following program results in incorrect output:
// g++ test.cpp -o test -lqmf2 #include <qmf/DataAddr.h> #include <iostream> int main(void) { qmf::DataAddr foo("foo", "blarg", 1); const qmf::DataAddr bar("bar", "wibble", 2); // prints "false" std::cout << "foo == bar: " << (foo == bar ? "true" : "false") << "\n"; // prints "true" (Doh!) std::cout << "bar == foo: " << (bar == foo ? "true" : "false") << "\n"; return 0; }
Anywhere where two DataAddr objects are compared and the first is a const reference will give a bogus result. (Specifically, both operands are converted to bool before being compared.) The reason is that DataAddr::operator==() is not declared const, so it will not be used to compare const references, and that C++ is pure, unadulterated evil.
Not that qmf::Data::getAddr() returns a const qmf::DataAddr&, so this is likely to be a common problem. Some other APIs, such as qmf::AgentEvent::getDataAddr() return non-const references, which would be unaffected (unless they become const at some point in the call chain).
A patch will follow presently.