| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 Note, this file uses many GCC extensions, but it should be compatible with | 33 Note, this file uses many GCC extensions, but it should be compatible with |
| 34 C, Objective C, C++, and Objective C++. | 34 C, Objective C, C++, and Objective C++. |
| 35 | 35 |
| 36 For non-debug builds, everything is disabled by default, except for the | 36 For non-debug builds, everything is disabled by default, except for the |
| 37 RELEASE_ASSERT family of macros. | 37 RELEASE_ASSERT family of macros. |
| 38 | 38 |
| 39 Defining any of the symbols explicitly prevents this from having any effect. | 39 Defining any of the symbols explicitly prevents this from having any effect. |
| 40 | 40 |
| 41 */ | 41 */ |
| 42 | 42 |
| 43 #include "base/logging.h" |
| 43 #include "wtf/Compiler.h" | 44 #include "wtf/Compiler.h" |
| 44 #include "wtf/Noncopyable.h" | 45 #include "wtf/Noncopyable.h" |
| 45 #include "wtf/WTFExport.h" | 46 #include "wtf/WTFExport.h" |
| 46 #include "wtf/build_config.h" | 47 #include "wtf/build_config.h" |
| 47 #include <stdarg.h> | 48 #include <stdarg.h> |
| 48 | 49 |
| 49 // Users must test "#if ENABLE(ASSERT)", which helps ensure that code | 50 // Users must test "#if ENABLE(ASSERT)", which helps ensure that code |
| 50 // testing this macro has included this header. | 51 // testing this macro has included this header. |
| 51 #ifndef ENABLE_ASSERT | 52 #ifndef ENABLE_ASSERT |
| 52 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) | 53 #if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 (WTFReportBacktrace(), (*(int*)0xfbadbeef = 0), IMMEDIATE_CRASH()) | 130 (WTFReportBacktrace(), (*(int*)0xfbadbeef = 0), IMMEDIATE_CRASH()) |
| 130 #endif | 131 #endif |
| 131 #endif | 132 #endif |
| 132 | 133 |
| 133 #if COMPILER(CLANG) | 134 #if COMPILER(CLANG) |
| 134 #define NO_RETURN_DUE_TO_CRASH NO_RETURN | 135 #define NO_RETURN_DUE_TO_CRASH NO_RETURN |
| 135 #else | 136 #else |
| 136 #define NO_RETURN_DUE_TO_CRASH | 137 #define NO_RETURN_DUE_TO_CRASH |
| 137 #endif | 138 #endif |
| 138 | 139 |
| 139 /* ASSERT, ASSERT_NOT_REACHED, ASSERT_UNUSED | 140 // ASSERT, ASSERT_NOT_REACHED, ASSERT_UNUSED |
| 140 | 141 // These macros are compiled out of release builds. |
| 141 These macros are compiled out of release builds. | 142 // Expressions inside them are evaluated in debug builds only. |
| 142 Expressions inside them are evaluated in debug builds only. | 143 // They are deprecated. We should use: |
| 143 */ | 144 // - DCHECK() for ASSERT() |
| 145 // - NOTREACHED() for ASSERT_NOT_REACHED() |
| 146 // - DCHECK() and ALLOW_UNUSED_LOCAL() for ASSERT_UNUSED(). |
| 144 #if OS(WIN) | 147 #if OS(WIN) |
| 145 /* FIXME: Change to use something other than ASSERT to avoid this conflict with
the underlying platform */ | 148 /* FIXME: Change to use something other than ASSERT to avoid this conflict with
the underlying platform */ |
| 146 #undef ASSERT | 149 #undef ASSERT |
| 147 #endif | 150 #endif |
| 148 | 151 |
| 149 #if ENABLE(ASSERT) | 152 #if ENABLE(ASSERT) |
| 150 | 153 |
| 151 #define ASSERT(assertion) \ | 154 #define ASSERT(assertion) \ |
| 152 (!(assertion) ? \ | 155 (!(assertion) ? \ |
| 153 (WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #ass
ertion), \ | 156 (WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #ass
ertion), \ |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 #endif | 208 #endif |
| 206 | 209 |
| 207 // Users must test "#if ENABLE(SECURITY_ASSERT)", which helps ensure | 210 // Users must test "#if ENABLE(SECURITY_ASSERT)", which helps ensure |
| 208 // that code testing this macro has included this header. | 211 // that code testing this macro has included this header. |
| 209 #if defined(ADDRESS_SANITIZER) || ENABLE(ASSERT) | 212 #if defined(ADDRESS_SANITIZER) || ENABLE(ASSERT) |
| 210 #define ENABLE_SECURITY_ASSERT 1 | 213 #define ENABLE_SECURITY_ASSERT 1 |
| 211 #else | 214 #else |
| 212 #define ENABLE_SECURITY_ASSERT 0 | 215 #define ENABLE_SECURITY_ASSERT 0 |
| 213 #endif | 216 #endif |
| 214 | 217 |
| 215 /* ASSERT_WITH_MESSAGE */ | 218 // ASSERT_WITH_MESSAGE |
| 216 | 219 // This is deprecated. We should use DCHECK() << "message". |
| 217 #if ASSERT_MSG_DISABLED | 220 #if ASSERT_MSG_DISABLED |
| 218 #define ASSERT_WITH_MESSAGE(assertion, ...) ((void)0) | 221 #define ASSERT_WITH_MESSAGE(assertion, ...) ((void)0) |
| 219 #else | 222 #else |
| 220 #define ASSERT_WITH_MESSAGE(assertion, ...) do \ | 223 #define ASSERT_WITH_MESSAGE(assertion, ...) do \ |
| 221 if (!(assertion)) { \ | 224 if (!(assertion)) { \ |
| 222 WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNC
TION, #assertion, __VA_ARGS__); \ | 225 WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNC
TION, #assertion, __VA_ARGS__); \ |
| 223 CRASH(); \ | 226 CRASH(); \ |
| 224 } \ | 227 } \ |
| 225 while (0) | 228 while (0) |
| 226 #endif | 229 #endif |
| 227 | 230 |
| 228 /* ASSERT_WITH_MESSAGE_UNUSED */ | 231 // ASSERT_WITH_MESSAGE_UNUSED |
| 229 | 232 // This is deprecated. We should use DCHECK() << "message" and |
| 233 // ALLOW_UNUSED_LOCAL(). |
| 230 #if ASSERT_MSG_DISABLED | 234 #if ASSERT_MSG_DISABLED |
| 231 #define ASSERT_WITH_MESSAGE_UNUSED(variable, assertion, ...) ((void)variable) | 235 #define ASSERT_WITH_MESSAGE_UNUSED(variable, assertion, ...) ((void)variable) |
| 232 #else | 236 #else |
| 233 #define ASSERT_WITH_MESSAGE_UNUSED(variable, assertion, ...) do \ | 237 #define ASSERT_WITH_MESSAGE_UNUSED(variable, assertion, ...) do \ |
| 234 if (!(assertion)) { \ | 238 if (!(assertion)) { \ |
| 235 WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNC
TION, #assertion, __VA_ARGS__); \ | 239 WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNC
TION, #assertion, __VA_ARGS__); \ |
| 236 CRASH(); \ | 240 CRASH(); \ |
| 237 } \ | 241 } \ |
| 238 while (0) | 242 while (0) |
| 239 #endif | 243 #endif |
| 240 | 244 |
| 241 /* ASSERT_ARG */ | 245 /* ASSERT_ARG */ |
| 242 | 246 |
| 243 #if ASSERT_ARG_DISABLED | 247 #if ASSERT_ARG_DISABLED |
| 244 | 248 |
| 245 #define ASSERT_ARG(argName, assertion) ((void)0) | 249 #define ASSERT_ARG(argName, assertion) ((void)0) |
| 246 | 250 |
| 247 #else | 251 #else |
| 248 | 252 |
| 249 #define ASSERT_ARG(argName, assertion) do \ | 253 #define ASSERT_ARG(argName, assertion) do \ |
| 250 if (!(assertion)) { \ | 254 if (!(assertion)) { \ |
| 251 WTFReportArgumentAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTIO
N, #argName, #assertion); \ | 255 WTFReportArgumentAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTIO
N, #argName, #assertion); \ |
| 252 CRASH(); \ | 256 CRASH(); \ |
| 253 } \ | 257 } \ |
| 254 while (0) | 258 while (0) |
| 255 | 259 |
| 256 #endif | 260 #endif |
| 257 | 261 |
| 258 /* FATAL */ | 262 // FATAL |
| 259 | 263 // This is deprecated. We should use DLOG(FATAL) << ... |
| 260 #if FATAL_DISABLED | 264 #if FATAL_DISABLED |
| 261 #define FATAL(...) ((void)0) | 265 #define FATAL(...) ((void)0) |
| 262 #else | 266 #else |
| 263 #define FATAL(...) do { \ | 267 #define FATAL(...) do { \ |
| 264 WTFReportFatalError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__); \ | 268 WTFReportFatalError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__); \ |
| 265 CRASH(); \ | 269 CRASH(); \ |
| 266 } while (0) | 270 } while (0) |
| 267 #endif | 271 #endif |
| 268 | 272 |
| 269 /* WTF_LOG_ERROR */ | 273 // WTF_LOG_ERROR |
| 270 | 274 // This is deprecated. We should use DLOG(ERROR) << ... |
| 271 #if ERROR_DISABLED | 275 #if ERROR_DISABLED |
| 272 #define WTF_LOG_ERROR(...) ((void)0) | 276 #define WTF_LOG_ERROR(...) ((void)0) |
| 273 #else | 277 #else |
| 274 #define WTF_LOG_ERROR(...) WTFReportError(__FILE__, __LINE__, WTF_PRETTY_FUNCTIO
N, __VA_ARGS__) | 278 #define WTF_LOG_ERROR(...) WTFReportError(__FILE__, __LINE__, WTF_PRETTY_FUNCTIO
N, __VA_ARGS__) |
| 275 #endif | 279 #endif |
| 276 | 280 |
| 277 /* WTF_LOG */ | 281 // WTF_LOG |
| 278 | 282 // This is deprecated. Should be replaced with DVLOG(verboselevel), which works |
| 283 // only in debug build, or VLOG(verboselevel), which works in release build too. |
| 279 #if LOG_DISABLED | 284 #if LOG_DISABLED |
| 280 #define WTF_LOG(channel, ...) ((void)0) | 285 #define WTF_LOG(channel, ...) ((void)0) |
| 281 #else | 286 #else |
| 282 #define WTF_LOG(channel, ...) WTFLog(&JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_P
REFIX, channel), __VA_ARGS__) | 287 #define WTF_LOG(channel, ...) WTFLog(&JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_P
REFIX, channel), __VA_ARGS__) |
| 283 #define JOIN_LOG_CHANNEL_WITH_PREFIX(prefix, channel) JOIN_LOG_CHANNEL_WITH_PREF
IX_LEVEL_2(prefix, channel) | 288 #define JOIN_LOG_CHANNEL_WITH_PREFIX(prefix, channel) JOIN_LOG_CHANNEL_WITH_PREF
IX_LEVEL_2(prefix, channel) |
| 284 #define JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) prefix ## channel | 289 #define JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) prefix ## channel |
| 285 #endif | 290 #endif |
| 286 | 291 |
| 287 /* RELEASE_ASSERT | 292 /* RELEASE_ASSERT |
| 288 | 293 |
| 289 Use in places where failure of an assertion indicates a definite security | 294 Use in places where failure of an assertion indicates a definite security |
| 290 vulnerability from which execution must not continue even in a release build. | 295 vulnerability from which execution must not continue even in a release build. |
| 291 Please sure to file bugs for these failures using the security template: | 296 Please sure to file bugs for these failures using the security template: |
| 292 http://code.google.com/p/chromium/issues/entry?template=Security%20Bug | 297 http://code.google.com/p/chromium/issues/entry?template=Security%20Bug |
| 293 */ | 298 */ |
| 294 | 299 // RELEASE_ASSERT* are deprecated. We should use: |
| 300 // - CHECK() for RELEASE_ASSERT() |
| 301 // - CHECK() << message for RELEASE_ASSERT_WITH_MESSAGE() |
| 302 // - RELEASE_NOTREACHED() for RELEASE_ASSERT_NOT_REACHED(). |
| 295 #if ENABLE(ASSERT) | 303 #if ENABLE(ASSERT) |
| 296 #define RELEASE_ASSERT(assertion) ASSERT(assertion) | 304 #define RELEASE_ASSERT(assertion) ASSERT(assertion) |
| 297 #define RELEASE_ASSERT_WITH_MESSAGE(assertion, ...) ASSERT_WITH_MESSAGE(assertio
n, __VA_ARGS__) | 305 #define RELEASE_ASSERT_WITH_MESSAGE(assertion, ...) ASSERT_WITH_MESSAGE(assertio
n, __VA_ARGS__) |
| 298 #define RELEASE_ASSERT_NOT_REACHED() ASSERT_NOT_REACHED() | 306 #define RELEASE_ASSERT_NOT_REACHED() ASSERT_NOT_REACHED() |
| 299 #else | 307 #else |
| 300 #define RELEASE_ASSERT(assertion) (UNLIKELY(!(assertion)) ? (IMMEDIATE_CRASH())
: (void)0) | 308 #define RELEASE_ASSERT(assertion) (UNLIKELY(!(assertion)) ? (IMMEDIATE_CRASH())
: (void)0) |
| 301 #define RELEASE_ASSERT_WITH_MESSAGE(assertion, ...) RELEASE_ASSERT(assertion) | 309 #define RELEASE_ASSERT_WITH_MESSAGE(assertion, ...) RELEASE_ASSERT(assertion) |
| 302 #define RELEASE_ASSERT_NOT_REACHED() IMMEDIATE_CRASH() | 310 #define RELEASE_ASSERT_NOT_REACHED() IMMEDIATE_CRASH() |
| 303 #endif | 311 #endif |
| 312 // TODO(tkent): Move this to base/logging.h? |
| 313 #define RELEASE_NOTREACHED() LOG(FATAL) |
| 304 | 314 |
| 305 /* DEFINE_COMPARISON_OPERATORS_WITH_REFERENCES */ | 315 /* DEFINE_COMPARISON_OPERATORS_WITH_REFERENCES */ |
| 306 | 316 |
| 307 // Allow equality comparisons of Objects by reference or pointer, interchangeabl
y. | 317 // Allow equality comparisons of Objects by reference or pointer, interchangeabl
y. |
| 308 // This can be only used on types whose equality makes no other sense than point
er equality. | 318 // This can be only used on types whose equality makes no other sense than point
er equality. |
| 309 #define DEFINE_COMPARISON_OPERATORS_WITH_REFERENCES(thisType) \ | 319 #define DEFINE_COMPARISON_OPERATORS_WITH_REFERENCES(thisType) \ |
| 310 inline bool operator==(const thisType& a, const thisType& b) { return &a ==
&b; } \ | 320 inline bool operator==(const thisType& a, const thisType& b) { return &a ==
&b; } \ |
| 311 inline bool operator==(const thisType& a, const thisType* b) { return &a ==
b; } \ | 321 inline bool operator==(const thisType& a, const thisType* b) { return &a ==
b; } \ |
| 312 inline bool operator==(const thisType* a, const thisType& b) { return a == &
b; } \ | 322 inline bool operator==(const thisType* a, const thisType& b) { return a == &
b; } \ |
| 313 inline bool operator!=(const thisType& a, const thisType& b) { return !(a ==
b); } \ | 323 inline bool operator!=(const thisType& a, const thisType& b) { return !(a ==
b); } \ |
| (...skipping 27 matching lines...) Expand all Loading... |
| 341 } \ | 351 } \ |
| 342 inline const thisType& to##thisType(const argumentType& argumentName) \ | 352 inline const thisType& to##thisType(const argumentType& argumentName) \ |
| 343 { \ | 353 { \ |
| 344 ASSERT_WITH_SECURITY_IMPLICATION(referencePredicate); \ | 354 ASSERT_WITH_SECURITY_IMPLICATION(referencePredicate); \ |
| 345 return static_cast<const thisType&>(argumentName); \ | 355 return static_cast<const thisType&>(argumentName); \ |
| 346 } \ | 356 } \ |
| 347 void to##thisType(const thisType*); \ | 357 void to##thisType(const thisType*); \ |
| 348 void to##thisType(const thisType&) | 358 void to##thisType(const thisType&) |
| 349 | 359 |
| 350 #endif /* WTF_Assertions_h */ | 360 #endif /* WTF_Assertions_h */ |
| OLD | NEW |