| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |  | 
| 2 // Use of this source code is governed by a BSD-style license that can be |  | 
| 3 // found in the LICENSE file. |  | 
| 4 |  | 
| 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_ |  | 
| 6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_ |  | 
| 7 |  | 
| 8 #include "mojo/public/cpp/system/macros.h" |  | 
| 9 |  | 
| 10 namespace mojo { |  | 
| 11 namespace internal { |  | 
| 12 |  | 
| 13 enum ValidationError { |  | 
| 14   // There is no validation error. |  | 
| 15   VALIDATION_ERROR_NONE, |  | 
| 16   // An object (struct or array) is not 8-byte aligned. |  | 
| 17   VALIDATION_ERROR_MISALIGNED_OBJECT, |  | 
| 18   // An object is not contained inside the message data, or it overlaps other |  | 
| 19   // objects. |  | 
| 20   VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE, |  | 
| 21   // A struct header doesn't make sense, for example: |  | 
| 22   // - |num_bytes| is smaller than the size of the oldest version that we |  | 
| 23   // support. |  | 
| 24   // - |num_fields| is smaller than the field number of the oldest version that |  | 
| 25   // we support. |  | 
| 26   // - |num_bytes| and |num_fields| don't match. |  | 
| 27   VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER, |  | 
| 28   // An array header doesn't make sense, for example: |  | 
| 29   // - |num_bytes| is smaller than the size of the header plus the size required |  | 
| 30   // to store |num_elements| elements. |  | 
| 31   // - For fixed-size arrays, |num_elements| is different than the specified |  | 
| 32   // size. |  | 
| 33   VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER, |  | 
| 34   // An encoded handle is illegal. |  | 
| 35   VALIDATION_ERROR_ILLEGAL_HANDLE, |  | 
| 36   // A non-nullable handle field is set to invalid handle. |  | 
| 37   VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE, |  | 
| 38   // An encoded pointer is illegal. |  | 
| 39   VALIDATION_ERROR_ILLEGAL_POINTER, |  | 
| 40   // A non-nullable pointer field is set to null. |  | 
| 41   VALIDATION_ERROR_UNEXPECTED_NULL_POINTER, |  | 
| 42   // |flags| in the message header is an invalid flag combination. |  | 
| 43   VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAG_COMBINATION, |  | 
| 44   // |flags| in the message header indicates that a request ID is required but |  | 
| 45   // there isn't one. |  | 
| 46   VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID, |  | 
| 47   // Two parallel arrays which are supposed to represent a map have different |  | 
| 48   // lengths. |  | 
| 49   VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP |  | 
| 50 }; |  | 
| 51 |  | 
| 52 const char* ValidationErrorToString(ValidationError error); |  | 
| 53 |  | 
| 54 void ReportValidationError(ValidationError error, |  | 
| 55                            const char* description = nullptr); |  | 
| 56 |  | 
| 57 // Only used by validation tests and when there is only one thread doing message |  | 
| 58 // validation. |  | 
| 59 class ValidationErrorObserverForTesting { |  | 
| 60  public: |  | 
| 61   ValidationErrorObserverForTesting(); |  | 
| 62   ~ValidationErrorObserverForTesting(); |  | 
| 63 |  | 
| 64   ValidationError last_error() const { return last_error_; } |  | 
| 65   void set_last_error(ValidationError error) { last_error_ = error; } |  | 
| 66 |  | 
| 67  private: |  | 
| 68   ValidationError last_error_; |  | 
| 69 |  | 
| 70   MOJO_DISALLOW_COPY_AND_ASSIGN(ValidationErrorObserverForTesting); |  | 
| 71 }; |  | 
| 72 |  | 
| 73 // Used only by MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING. Don't use it directly. |  | 
| 74 // |  | 
| 75 // The function returns true if the error is recorded (by a |  | 
| 76 // SerializationWarningObserverForTesting object), false otherwise. |  | 
| 77 bool ReportSerializationWarning(ValidationError error); |  | 
| 78 |  | 
| 79 // Only used by serialization tests and when there is only one thread doing |  | 
| 80 // message serialization. |  | 
| 81 class SerializationWarningObserverForTesting { |  | 
| 82  public: |  | 
| 83   SerializationWarningObserverForTesting(); |  | 
| 84   ~SerializationWarningObserverForTesting(); |  | 
| 85 |  | 
| 86   ValidationError last_warning() const { return last_warning_; } |  | 
| 87   void set_last_warning(ValidationError error) { last_warning_ = error; } |  | 
| 88 |  | 
| 89  private: |  | 
| 90   ValidationError last_warning_; |  | 
| 91 |  | 
| 92   MOJO_DISALLOW_COPY_AND_ASSIGN(SerializationWarningObserverForTesting); |  | 
| 93 }; |  | 
| 94 |  | 
| 95 }  // namespace internal |  | 
| 96 }  // namespace mojo |  | 
| 97 |  | 
| 98 // In debug build, logs a serialization warning if |condition| evaluates to |  | 
| 99 // true: |  | 
| 100 //   - if there is a SerializationWarningObserverForTesting object alive, |  | 
| 101 //     records |error| in it; |  | 
| 102 //   - otherwise, logs a fatal-level message. |  | 
| 103 // |error| is the validation error that will be triggered by the receiver |  | 
| 104 // of the serialzation result. |  | 
| 105 // |  | 
| 106 // In non-debug build, does nothing (not even compiling |condition|). |  | 
| 107 #define MOJO_INTERNAL_DLOG_SERIALIZATION_WARNING(                        \ |  | 
| 108     condition, error, description)                                       \ |  | 
| 109   MOJO_DLOG_IF(FATAL, (condition) && !ReportSerializationWarning(error)) \ |  | 
| 110       << "The outgoing message will trigger "                            \ |  | 
| 111       << ValidationErrorToString(error) << " at the receiving side ("    \ |  | 
| 112       << description << ")."; |  | 
| 113 |  | 
| 114 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_ |  | 
| OLD | NEW | 
|---|