Uploaded image for project: 'Qpid'
  1. Qpid
  2. QPID-3344

Comparisons of const DataAddr objects are incorrect

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 0.10
    • Fix Version/s: 0.13
    • Component/s: QMF
    • Labels:
      None
    • Environment:

      Fedora 15, not that it matters.

      Description

      The following program results in incorrect output:

      test.cpp
      // 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.

        Attachments

          Activity

            People

            • Assignee:
              tedross Ted Ross
              Reporter:
              zaneb Zane Bitter
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: