Blake Bender created GEODE-6500:
-----------------------------------

             Summary: apache::geode::client::InterestResultPolicy only works 
because we get lucky
                 Key: GEODE-6500
                 URL: https://issues.apache.org/jira/browse/GEODE-6500
             Project: Geode
          Issue Type: Bug
          Components: native client
            Reporter: Blake Bender


Here's the code in InterestResultPolicy.hpp:
{code:java}
namespace apache {
namespace geode {
namespace client {
/**
 * @class InterestResultPolicy InterestResultPolicy.hpp
 * Policy class for interest result.
 */
class APACHE_GEODE_EXPORT InterestResultPolicy {
  // public static methods
 public:
  static char nextOrdinal;

  static InterestResultPolicy NONE;
  static InterestResultPolicy KEYS;
  static InterestResultPolicy KEYS_VALUES;

  char ordinal;

  char getOrdinal() { return ordinal; }

 private:
  InterestResultPolicy() { ordinal = nextOrdinal++; }
};{code}
All the statics are initialized in InterestResultPolicy.cpp, with nextOrdinal 
set to 0.  Thus, most of the time, the InterestResultPolicy instances NONE, 
KEYS, and KEYS_VALUES are assigned 1, 2, and 3, respectively.  The Geode wire 
protocol most likely depends on these being fixed values, but the code as 
written relies on initialization order to get the correct values.  
Initialization order is *undefined behavior*, and compiler dependent.  These 
need to be explicitly initialized, NONE KEYS and KEYS_VALUES should be members 
of an enum class rather than object instances, etc.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to