Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(284)

Side by Side Diff: base/logging.h

Issue 2617283002: Add Clang static analyzer to Clang toolchain defs in GN (Closed)
Patch Set: wez feedback Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef BASE_LOGGING_H_ 5 #ifndef BASE_LOGGING_H_
6 #define BASE_LOGGING_H_ 6 #define BASE_LOGGING_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <cassert> 10 #include <cassert>
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 LAZY_STREAM(LOG_STREAM(DCHECK), false) \ 718 LAZY_STREAM(LOG_STREAM(DCHECK), false) \
719 << "Check failed: " #condition ". " 719 << "Check failed: " #condition ". "
720 720
721 #define DPCHECK(condition) \ 721 #define DPCHECK(condition) \
722 __analysis_assume(!!(condition)), \ 722 __analysis_assume(!!(condition)), \
723 LAZY_STREAM(PLOG_STREAM(DCHECK), false) \ 723 LAZY_STREAM(PLOG_STREAM(DCHECK), false) \
724 << "Check failed: " #condition ". " 724 << "Check failed: " #condition ". "
725 725
726 #else // _PREFAST_ 726 #else // _PREFAST_
727 727
728 #if defined(__clang_analyzer__) 728 #if __has_feature(attribute_analyzer_noreturn)
729 // Alternative DCHECK implementation for Clang static analysis.
729 730
730 // Stops the analyzer from proceeding along the current codepath. 731 // Prevents the analyzer from proceeding along the current codepath.
731 void AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {} 732 // Function is short-circuit evaluated when a DCHECK condition fails.
733 constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) {
734 return false;
735 }
732 736
733 #define DCHECK(condition) \ 737 #define DCHECK(condition) \
734 LAZY_STREAM( \ 738 LAZY_STREAM( \
735 LOG_STREAM(DCHECK), \ 739 LOG_STREAM(DCHECK), \
736 DCHECK_IS_ON() ? (logging::AnalyzerNoReturn(), !(condition)) : false) \ 740 DCHECK_IS_ON() ? !((condition) || logging::AnalyzerNoReturn()) : false) \
737 << "Check failed: " #condition ". " 741 << "Check failed: " #condition ". "
738 742
739 #define DPCHECK(condition) \ 743 #define DPCHECK(condition) \
740 LAZY_STREAM( \ 744 LAZY_STREAM( \
741 PLOG_STREAM(DCHECK), \ 745 PLOG_STREAM(DCHECK), \
742 DCHECK_IS_ON() ? (logging::AnalyzerNoReturn(), !(condition)) : false) \ 746 DCHECK_IS_ON() ? !((condition) || logging::AnalyzerNoReturn()) : false) \
743 << "Check failed: " #condition ". " 747 << "Check failed: " #condition ". "
744 748
745 #else // __clang_analyzer__ 749 #else // attribute_analyzer_noreturn
746 750
747 #define DCHECK(condition) \ 751 #define DCHECK(condition) \
748 LAZY_STREAM(LOG_STREAM(DCHECK), \ 752 LAZY_STREAM(LOG_STREAM(DCHECK), \
749 DCHECK_IS_ON() ? !(condition) : false) \ 753 DCHECK_IS_ON() ? !(condition) : false) \
750 << "Check failed: " #condition ". " 754 << "Check failed: " #condition ". "
751 755
752 #define DPCHECK(condition) \ 756 #define DPCHECK(condition) \
753 LAZY_STREAM(PLOG_STREAM(DCHECK), \ 757 LAZY_STREAM(PLOG_STREAM(DCHECK), \
754 DCHECK_IS_ON() ? !(condition) : false) \ 758 DCHECK_IS_ON() ? !(condition) : false) \
755 << "Check failed: " #condition ". " 759 << "Check failed: " #condition ". "
756 760
757 #endif // __clang_analyzer__ 761 #endif // attribute_analyzer_noreturn
758 762
759 #define DCHECK_INTERNAL_TEST(condition) \ 763 #define DCHECK_INTERNAL_TEST(condition) \
760 (DCHECK_IS_ON() ? !DCHECK_INTERNAL_ASSUME(condition) : false) 764 (DCHECK_IS_ON() ? !DCHECK_INTERNAL_ASSUME(condition) : false)
761 765
762 766
763 #endif // _PREFAST_ 767 #endif // _PREFAST_
764 768
765 // Helper macro for binary operators. 769 // Helper macro for binary operators.
766 // Don't use this macro directly in your code, use DCHECK_EQ et al below. 770 // Don't use this macro directly in your code, use DCHECK_EQ et al below.
767 // The 'switch' is used to prevent the 'else' from being ambiguous when the 771 // The 'switch' is used to prevent the 'else' from being ambiguous when the
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 #elif NOTIMPLEMENTED_POLICY == 5 1046 #elif NOTIMPLEMENTED_POLICY == 5
1043 #define NOTIMPLEMENTED() do {\ 1047 #define NOTIMPLEMENTED() do {\
1044 static bool logged_once = false;\ 1048 static bool logged_once = false;\
1045 LOG_IF(ERROR, !logged_once) << NOTIMPLEMENTED_MSG;\ 1049 LOG_IF(ERROR, !logged_once) << NOTIMPLEMENTED_MSG;\
1046 logged_once = true;\ 1050 logged_once = true;\
1047 } while(0);\ 1051 } while(0);\
1048 EAT_STREAM_PARAMETERS 1052 EAT_STREAM_PARAMETERS
1049 #endif 1053 #endif
1050 1054
1051 #endif // BASE_LOGGING_H_ 1055 #endif // BASE_LOGGING_H_
OLDNEW
« no previous file with comments | « no previous file | build/toolchain/clang_static_analyzer.gni » ('j') | build/toolchain/gcc_toolchain.gni » ('J')

Powered by Google App Engine
This is Rietveld 408576698