run clang-tidy
This commit is contained in:
parent
dfb9ffc324
commit
9dc1107f88
168
.clang-format
Normal file
168
.clang-format
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
# BasedOnStyle: Google
|
||||||
|
AccessModifierOffset: -1
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveMacros: false
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlines: Left
|
||||||
|
AlignOperands: true
|
||||||
|
AlignTrailingComments: true
|
||||||
|
AllowAllArgumentsOnNextLine: true
|
||||||
|
AllowAllConstructorInitializersOnNextLine: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortLambdasOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: WithoutElse
|
||||||
|
AllowShortLoopsOnASingleLine: true
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: true
|
||||||
|
AlwaysBreakTemplateDeclarations: Yes
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: false
|
||||||
|
AfterClass: false
|
||||||
|
AfterControlStatement: false
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: false
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
AfterExternBlock: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: true
|
||||||
|
SplitEmptyRecord: true
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeBraces: Attach
|
||||||
|
BreakBeforeInheritanceComma: false
|
||||||
|
BreakInheritanceList: BeforeColon
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 80
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
DeriveLineEnding: true
|
||||||
|
DerivePointerAlignment: true
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: true
|
||||||
|
ForEachMacros:
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeBlocks: Regroup
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^<ext/.*\.h>'
|
||||||
|
Priority: 2
|
||||||
|
SortPriority: 0
|
||||||
|
- Regex: '^<.*\.h>'
|
||||||
|
Priority: 1
|
||||||
|
SortPriority: 0
|
||||||
|
- Regex: '^<.*'
|
||||||
|
Priority: 2
|
||||||
|
SortPriority: 0
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 3
|
||||||
|
SortPriority: 0
|
||||||
|
IncludeIsMainRegex: '([-_](test|unittest))?$'
|
||||||
|
IncludeIsMainSourceRegex: ''
|
||||||
|
IndentCaseLabels: true
|
||||||
|
IndentGotoLabels: true
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentWidth: 2
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: None
|
||||||
|
ObjCBinPackProtocolList: Never
|
||||||
|
ObjCBlockIndentWidth: 2
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakAssignment: 2
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 1
|
||||||
|
PenaltyBreakComment: 300
|
||||||
|
PenaltyBreakFirstLessLess: 120
|
||||||
|
PenaltyBreakString: 1000
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 1000000
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 200
|
||||||
|
PointerAlignment: Left
|
||||||
|
RawStringFormats:
|
||||||
|
- Language: Cpp
|
||||||
|
Delimiters:
|
||||||
|
- cc
|
||||||
|
- CC
|
||||||
|
- cpp
|
||||||
|
- Cpp
|
||||||
|
- CPP
|
||||||
|
- 'c++'
|
||||||
|
- 'C++'
|
||||||
|
CanonicalDelimiter: ''
|
||||||
|
BasedOnStyle: google
|
||||||
|
- Language: TextProto
|
||||||
|
Delimiters:
|
||||||
|
- pb
|
||||||
|
- PB
|
||||||
|
- proto
|
||||||
|
- PROTO
|
||||||
|
EnclosingFunctions:
|
||||||
|
- EqualsProto
|
||||||
|
- EquivToProto
|
||||||
|
- PARSE_PARTIAL_TEXT_PROTO
|
||||||
|
- PARSE_TEST_PROTO
|
||||||
|
- PARSE_TEXT_PROTO
|
||||||
|
- ParseTextOrDie
|
||||||
|
- ParseTextProtoOrDie
|
||||||
|
CanonicalDelimiter: ''
|
||||||
|
BasedOnStyle: google
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: true
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAfterTemplateKeyword: true
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCpp11BracedList: false
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 2
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInContainerLiterals: true
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
Standard: Auto
|
||||||
|
StatementMacros:
|
||||||
|
- Q_UNUSED
|
||||||
|
- QT_REQUIRE_VERSION
|
||||||
|
TabWidth: 8
|
||||||
|
UseCRLF: false
|
||||||
|
UseTab: Never
|
||||||
|
...
|
||||||
|
|
||||||
59
.clang-tidy
Normal file
59
.clang-tidy
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
---
|
||||||
|
Checks: 'clang-diagnostic-*,clang-analyzer-*,google-*'
|
||||||
|
WarningsAsErrors: ''
|
||||||
|
HeaderFilterRegex: ''
|
||||||
|
AnalyzeTemporaryDtors: false
|
||||||
|
FormatStyle: file
|
||||||
|
CheckOptions:
|
||||||
|
- key: cert-dcl16-c.NewSuffixes
|
||||||
|
value: 'L;LL;LU;LLU'
|
||||||
|
- key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField
|
||||||
|
value: '0'
|
||||||
|
- key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors
|
||||||
|
value: '1'
|
||||||
|
- key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic
|
||||||
|
value: '1'
|
||||||
|
- key: google-build-namespaces.HeaderFileExtensions
|
||||||
|
value: ',h,hh,hpp,hxx'
|
||||||
|
- key: google-global-names-in-headers.HeaderFileExtensions
|
||||||
|
value: ',h,hh,hpp,hxx'
|
||||||
|
- key: google-readability-braces-around-statements.ShortStatementLines
|
||||||
|
value: '1'
|
||||||
|
- key: google-readability-function-size.BranchThreshold
|
||||||
|
value: '4294967295'
|
||||||
|
- key: google-readability-function-size.LineThreshold
|
||||||
|
value: '4294967295'
|
||||||
|
- key: google-readability-function-size.NestingThreshold
|
||||||
|
value: '4294967295'
|
||||||
|
- key: google-readability-function-size.ParameterThreshold
|
||||||
|
value: '4294967295'
|
||||||
|
- key: google-readability-function-size.StatementThreshold
|
||||||
|
value: '800'
|
||||||
|
- key: google-readability-function-size.VariableThreshold
|
||||||
|
value: '4294967295'
|
||||||
|
- key: google-readability-namespace-comments.ShortNamespaceLines
|
||||||
|
value: '10'
|
||||||
|
- key: google-readability-namespace-comments.SpacesBeforeComments
|
||||||
|
value: '2'
|
||||||
|
- key: google-runtime-int.SignedTypePrefix
|
||||||
|
value: int
|
||||||
|
- key: google-runtime-int.TypeSuffix
|
||||||
|
value: ''
|
||||||
|
- key: google-runtime-int.UnsignedTypePrefix
|
||||||
|
value: uint
|
||||||
|
- key: google-runtime-references.WhiteListTypes
|
||||||
|
value: ''
|
||||||
|
- key: modernize-loop-convert.MaxCopySize
|
||||||
|
value: '16'
|
||||||
|
- key: modernize-loop-convert.MinConfidence
|
||||||
|
value: reasonable
|
||||||
|
- key: modernize-loop-convert.NamingStyle
|
||||||
|
value: CamelCase
|
||||||
|
- key: modernize-pass-by-value.IncludeStyle
|
||||||
|
value: llvm
|
||||||
|
- key: modernize-replace-auto-ptr.IncludeStyle
|
||||||
|
value: llvm
|
||||||
|
- key: modernize-use-nullptr.NullMacros
|
||||||
|
value: 'NULL'
|
||||||
|
...
|
||||||
|
|
||||||
@ -404,7 +404,8 @@ static void MaybeCancelLastSeparator(State *state) {
|
|||||||
// "mangled_cur" is anonymous namespace.
|
// "mangled_cur" is anonymous namespace.
|
||||||
static bool IdentifierIsAnonymousNamespace(State *state, int length) {
|
static bool IdentifierIsAnonymousNamespace(State *state, int length) {
|
||||||
static const char anon_prefix[] = "_GLOBAL__N_";
|
static const char anon_prefix[] = "_GLOBAL__N_";
|
||||||
return (length > (int)sizeof(anon_prefix) - 1 && // Should be longer.
|
return (length >
|
||||||
|
static_cast<int>(sizeof(anon_prefix)) - 1 && // Should be longer.
|
||||||
StrPrefix(state->mangled_cur, anon_prefix));
|
StrPrefix(state->mangled_cur, anon_prefix));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -203,7 +203,8 @@ static inline int RUN_ALL_TESTS() {
|
|||||||
for (it = g_testlist.begin(); it != g_testlist.end(); ++it) {
|
for (it = g_testlist.begin(); it != g_testlist.end(); ++it) {
|
||||||
(*it)();
|
(*it)();
|
||||||
}
|
}
|
||||||
fprintf(stderr, "Passed %d tests\n\nPASS\n", (int)g_testlist.size());
|
fprintf(stderr, "Passed %d tests\n\nPASS\n",
|
||||||
|
static_cast<int>(g_testlist.size()));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,8 +272,8 @@ static inline void RunSpecifiedBenchmarks() {
|
|||||||
++iter) {
|
++iter) {
|
||||||
clock_t start = clock();
|
clock_t start = clock();
|
||||||
iter->second(iter_cnt);
|
iter->second(iter_cnt);
|
||||||
double elapsed_ns =
|
double elapsed_ns = (static_cast<double>(clock()) - start) /
|
||||||
((double)clock() - start) / CLOCKS_PER_SEC * 1000*1000*1000;
|
CLOCKS_PER_SEC * 1000 * 1000 * 1000;
|
||||||
#if defined(__GNUC__) && !defined(__clang__)
|
#if defined(__GNUC__) && !defined(__clang__)
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
#pragma GCC diagnostic ignored "-Wformat="
|
#pragma GCC diagnostic ignored "-Wformat="
|
||||||
@ -409,8 +410,9 @@ static const std::size_t kLoggingPrefixLength = 9;
|
|||||||
|
|
||||||
// Check if the string is [IWEF](\d{8}|YEARDATE)
|
// Check if the string is [IWEF](\d{8}|YEARDATE)
|
||||||
static inline bool IsLoggingPrefix(const string& s) {
|
static inline bool IsLoggingPrefix(const string& s) {
|
||||||
if (s.size() != kLoggingPrefixLength)
|
if (s.size() != kLoggingPrefixLength) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
if (!strchr("IWEF", s[0])) return false;
|
if (!strchr("IWEF", s[0])) return false;
|
||||||
for (size_t i = 1; i <= 8; ++i) {
|
for (size_t i = 1; i <= 8; ++i) {
|
||||||
if (!isdigit(s[i]) && s[i] != "YEARDATE"[i-1]) return false;
|
if (!isdigit(s[i]) && s[i] != "YEARDATE"[i-1]) return false;
|
||||||
@ -589,7 +591,7 @@ class Thread {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static void* InvokeThread(void* self) {
|
static void* InvokeThread(void* self) {
|
||||||
((Thread*)self)->Run();
|
(static_cast<Thread*>(self))->Run();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -839,10 +839,11 @@ inline void LogDestination::LogToAllLogfiles(LogSeverity severity,
|
|||||||
if ( FLAGS_logtostderr ) { // global flag: never log to file
|
if ( FLAGS_logtostderr ) { // global flag: never log to file
|
||||||
ColoredWriteToStderr(severity, message, len);
|
ColoredWriteToStderr(severity, message, len);
|
||||||
} else {
|
} else {
|
||||||
for (int i = severity; i >= 0; --i)
|
for (int i = severity; i >= 0; --i) {
|
||||||
LogDestination::MaybeLogToLogfile(i, timestamp, message, len);
|
LogDestination::MaybeLogToLogfile(i, timestamp, message, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline void LogDestination::LogToSinks(LogSeverity severity,
|
inline void LogDestination::LogToSinks(LogSeverity severity,
|
||||||
const char* full_filename,
|
const char* full_filename,
|
||||||
@ -1254,8 +1255,9 @@ void LogFileObject::Write(bool force_flush,
|
|||||||
bytes_since_flush_ += message_len;
|
bytes_since_flush_ += message_len;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ( CycleClock_Now() >= next_flush_time_ )
|
if (CycleClock_Now() >= next_flush_time_) {
|
||||||
stop_writing = false; // check to see if disk has free space.
|
stop_writing = false; // check to see if disk has free space.
|
||||||
|
}
|
||||||
return; // no need to flush
|
return; // no need to flush
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1691,8 +1693,9 @@ ostream& LogMessage::stream() {
|
|||||||
// Flush buffered message, called by the destructor, or any other function
|
// Flush buffered message, called by the destructor, or any other function
|
||||||
// that needs to synchronize the log.
|
// that needs to synchronize the log.
|
||||||
void LogMessage::Flush() {
|
void LogMessage::Flush() {
|
||||||
if (data_->has_been_flushed_ || data_->severity_ < FLAGS_minloglevel)
|
if (data_->has_been_flushed_ || data_->severity_ < FLAGS_minloglevel) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
data_->num_chars_to_log_ = data_->stream_.pcount();
|
data_->num_chars_to_log_ = data_->stream_.pcount();
|
||||||
data_->num_chars_to_syslog_ =
|
data_->num_chars_to_syslog_ =
|
||||||
@ -1833,10 +1836,11 @@ void LogMessage::SendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
|
|||||||
|
|
||||||
if (!FLAGS_logtostderr) {
|
if (!FLAGS_logtostderr) {
|
||||||
for (int i = 0; i < NUM_SEVERITIES; ++i) {
|
for (int i = 0; i < NUM_SEVERITIES; ++i) {
|
||||||
if ( LogDestination::log_destinations_[i] )
|
if (LogDestination::log_destinations_[i]) {
|
||||||
LogDestination::log_destinations_[i]->logger_->Write(true, 0, "", 0);
|
LogDestination::log_destinations_[i]->logger_->Write(true, 0, "", 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// release the lock that our caller (directly or indirectly)
|
// release the lock that our caller (directly or indirectly)
|
||||||
// LogMessage::~LogMessage() grabbed so that signal handlers
|
// LogMessage::~LogMessage() grabbed so that signal handlers
|
||||||
@ -2191,8 +2195,9 @@ static bool SendEmailInternal(const char*dest, const char *subject,
|
|||||||
FILE* pipe = popen(cmd.c_str(), "w");
|
FILE* pipe = popen(cmd.c_str(), "w");
|
||||||
if (pipe != NULL) {
|
if (pipe != NULL) {
|
||||||
// Add the body if we have one
|
// Add the body if we have one
|
||||||
if (body)
|
if (body) {
|
||||||
fwrite(body, sizeof(char), strlen(body), pipe);
|
fwrite(body, sizeof(char), strlen(body), pipe);
|
||||||
|
}
|
||||||
bool ok = pclose(pipe) != -1;
|
bool ok = pclose(pipe) != -1;
|
||||||
if ( !ok ) {
|
if ( !ok ) {
|
||||||
if ( use_logging ) {
|
if ( use_logging ) {
|
||||||
@ -2524,7 +2529,7 @@ void MakeCheckOpValueString(std::ostream* os, const char& v) {
|
|||||||
if (v >= 32 && v <= 126) {
|
if (v >= 32 && v <= 126) {
|
||||||
(*os) << "'" << v << "'";
|
(*os) << "'" << v << "'";
|
||||||
} else {
|
} else {
|
||||||
(*os) << "char value " << (short)v;
|
(*os) << "char value " << static_cast<short>(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2533,7 +2538,7 @@ void MakeCheckOpValueString(std::ostream* os, const signed char& v) {
|
|||||||
if (v >= 32 && v <= 126) {
|
if (v >= 32 && v <= 126) {
|
||||||
(*os) << "'" << v << "'";
|
(*os) << "'" << v << "'";
|
||||||
} else {
|
} else {
|
||||||
(*os) << "signed char value " << (short)v;
|
(*os) << "signed char value " << static_cast<short>(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2542,7 +2547,7 @@ void MakeCheckOpValueString(std::ostream* os, const unsigned char& v) {
|
|||||||
if (v >= 32 && v <= 126) {
|
if (v >= 32 && v <= 126) {
|
||||||
(*os) << "'" << v << "'";
|
(*os) << "'" << v << "'";
|
||||||
} else {
|
} else {
|
||||||
(*os) << "unsigned char value " << (unsigned short)v;
|
(*os) << "unsigned char value " << static_cast<unsigned short>(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1004,7 +1004,7 @@ GLOG_CONSTEXPR int64_t LOG_PERIOD_TOL_NS = 500000; // 500us
|
|||||||
// called, since it is also the array size and will be indexed by the stream
|
// called, since it is also the array size and will be indexed by the stream
|
||||||
// operator.
|
// operator.
|
||||||
GLOG_CONSTEXPR size_t MAX_CALLS = 10;
|
GLOG_CONSTEXPR size_t MAX_CALLS = 10;
|
||||||
} // namespace LogStreamTimes
|
} // namespace LogTimes
|
||||||
|
|
||||||
#if defined(HAVE_CXX11_CHRONO) && __cplusplus >= 201103L
|
#if defined(HAVE_CXX11_CHRONO) && __cplusplus >= 201103L
|
||||||
struct LogTimeRecorder {
|
struct LogTimeRecorder {
|
||||||
|
|||||||
@ -207,9 +207,10 @@ void DumpSignalInfo(int signal_number, siginfo_t *siginfo) {
|
|||||||
// We assume pthread_t is an integral number or a pointer, rather
|
// We assume pthread_t is an integral number or a pointer, rather
|
||||||
// than a complex struct. In some environments, pthread_self()
|
// than a complex struct. In some environments, pthread_self()
|
||||||
// returns an uint64 but in some other environments pthread_self()
|
// returns an uint64 but in some other environments pthread_self()
|
||||||
// returns a pointer. Hence we use C-style cast here, rather than
|
// returns a pointer.
|
||||||
// reinterpret/static_cast, to support both types of environments.
|
pthread_t id = pthread_self();
|
||||||
formatter.AppendUint64((uintptr_t)pthread_self(), 16);
|
formatter.AppendUint64(
|
||||||
|
reinterpret_cast<uint64>(reinterpret_cast<const char*>(id)), 16);
|
||||||
formatter.AppendString(") ");
|
formatter.AppendString(") ");
|
||||||
// Only linux has the PID of the signal sender in si_pid.
|
// Only linux has the PID of the signal sender in si_pid.
|
||||||
#ifdef GLOG_OS_LINUX
|
#ifdef GLOG_OS_LINUX
|
||||||
@ -366,8 +367,9 @@ bool IsFailureSignalHandlerInstalled() {
|
|||||||
memset(&sig_action, 0, sizeof(sig_action));
|
memset(&sig_action, 0, sizeof(sig_action));
|
||||||
sigemptyset(&sig_action.sa_mask);
|
sigemptyset(&sig_action.sa_mask);
|
||||||
sigaction(SIGABRT, NULL, &sig_action);
|
sigaction(SIGABRT, NULL, &sig_action);
|
||||||
if (sig_action.sa_sigaction == &FailureSignalHandler)
|
if (sig_action.sa_sigaction == &FailureSignalHandler) {
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
#elif defined(GLOG_OS_WINDOWS)
|
#elif defined(GLOG_OS_WINDOWS)
|
||||||
return kFailureSignalHandlerInstalled;
|
return kFailureSignalHandlerInstalled;
|
||||||
#endif // HAVE_SIGACTION
|
#endif // HAVE_SIGACTION
|
||||||
|
|||||||
@ -54,9 +54,10 @@ static void* DieInThread(void*) {
|
|||||||
// We assume pthread_t is an integral number or a pointer, rather
|
// We assume pthread_t is an integral number or a pointer, rather
|
||||||
// than a complex struct. In some environments, pthread_self()
|
// than a complex struct. In some environments, pthread_self()
|
||||||
// returns an uint64 but in some other environments pthread_self()
|
// returns an uint64 but in some other environments pthread_self()
|
||||||
// returns a pointer. Hence we use C-style cast here, rather than
|
// returns a pointer.
|
||||||
// reinterpret/static_cast, to support both types of environments.
|
fprintf(
|
||||||
fprintf(stderr, "0x%lx is dying\n", (long)pthread_self());
|
stderr, "0x%px is dying\n",
|
||||||
|
static_cast<const void*>(reinterpret_cast<const char*>(pthread_self())));
|
||||||
// Use volatile to prevent from these to be optimized away.
|
// Use volatile to prevent from these to be optimized away.
|
||||||
volatile int a = 0;
|
volatile int a = 0;
|
||||||
volatile int b = 1 / a;
|
volatile int b = 1 / a;
|
||||||
|
|||||||
@ -46,12 +46,15 @@ int GetStackTrace(void** result, int max_depth, int skip_count) {
|
|||||||
size = backtrace(stack, kStackLength);
|
size = backtrace(stack, kStackLength);
|
||||||
skip_count++; // we want to skip the current frame as well
|
skip_count++; // we want to skip the current frame as well
|
||||||
int result_count = size - skip_count;
|
int result_count = size - skip_count;
|
||||||
if (result_count < 0)
|
if (result_count < 0) {
|
||||||
result_count = 0;
|
result_count = 0;
|
||||||
if (result_count > max_depth)
|
}
|
||||||
|
if (result_count > max_depth) {
|
||||||
result_count = max_depth;
|
result_count = max_depth;
|
||||||
for (int i = 0; i < result_count; i++)
|
}
|
||||||
|
for (int i = 0; i < result_count; i++) {
|
||||||
result[i] = stack[i + skip_count];
|
result[i] = stack[i + skip_count];
|
||||||
|
}
|
||||||
|
|
||||||
return result_count;
|
return result_count;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -70,18 +70,21 @@ int GetStackTrace(void** result, int max_depth, int skip_count) {
|
|||||||
skip_count++; // Do not include the "GetStackTrace" frame
|
skip_count++; // Do not include the "GetStackTrace" frame
|
||||||
|
|
||||||
while (n < max_depth) {
|
while (n < max_depth) {
|
||||||
int ret = unw_get_reg(&cursor, UNW_REG_IP, (unw_word_t *) &ip);
|
int ret =
|
||||||
if (ret < 0)
|
unw_get_reg(&cursor, UNW_REG_IP, reinterpret_cast<unw_word_t *>(&ip));
|
||||||
|
if (ret < 0) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
if (skip_count > 0) {
|
if (skip_count > 0) {
|
||||||
skip_count--;
|
skip_count--;
|
||||||
} else {
|
} else {
|
||||||
result[n++] = ip;
|
result[n++] = ip;
|
||||||
}
|
}
|
||||||
ret = unw_step(&cursor);
|
ret = unw_step(&cursor);
|
||||||
if (ret <= 0)
|
if (ret <= 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
g_tl_entered = false;
|
g_tl_entered = false;
|
||||||
return n;
|
return n;
|
||||||
|
|||||||
@ -47,7 +47,7 @@ _START_GOOGLE_NAMESPACE_
|
|||||||
// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned.
|
// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned.
|
||||||
template<bool STRICT_UNWINDING>
|
template<bool STRICT_UNWINDING>
|
||||||
static void **NextStackFrame(void **old_sp) {
|
static void **NextStackFrame(void **old_sp) {
|
||||||
void **new_sp = (void **) *old_sp;
|
void **new_sp = static_cast<void **>(*old_sp);
|
||||||
|
|
||||||
// Check that the transition from frame pointer old_sp to frame
|
// Check that the transition from frame pointer old_sp to frame
|
||||||
// pointer new_sp isn't clearly bogus
|
// pointer new_sp isn't clearly bogus
|
||||||
|
|||||||
@ -134,8 +134,9 @@ static void ATTRIBUTE_NOINLINE CheckStackTraceLeaf(void) {
|
|||||||
#ifdef HAVE_EXECINFO_H
|
#ifdef HAVE_EXECINFO_H
|
||||||
char **strings = backtrace_symbols(stack, size);
|
char **strings = backtrace_symbols(stack, size);
|
||||||
printf("Obtained %d stack frames.\n", size);
|
printf("Obtained %d stack frames.\n", size);
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++) {
|
||||||
printf("%s %p\n", strings[i], stack[i]);
|
printf("%s %p\n", strings[i], stack[i]);
|
||||||
|
}
|
||||||
|
|
||||||
union {
|
union {
|
||||||
void (*p1)(int);
|
void (*p1)(int);
|
||||||
@ -163,32 +164,36 @@ static void ATTRIBUTE_NOINLINE CheckStackTrace4(int i) {
|
|||||||
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[2]);
|
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[2]);
|
||||||
INIT_ADDRESS_RANGE(CheckStackTrace4, start, end, &expected_range[1]);
|
INIT_ADDRESS_RANGE(CheckStackTrace4, start, end, &expected_range[1]);
|
||||||
DECLARE_ADDRESS_LABEL(start);
|
DECLARE_ADDRESS_LABEL(start);
|
||||||
for (int j = i; j >= 0; j--)
|
for (int j = i; j >= 0; j--) {
|
||||||
CheckStackTraceLeaf();
|
CheckStackTraceLeaf();
|
||||||
|
}
|
||||||
DECLARE_ADDRESS_LABEL(end);
|
DECLARE_ADDRESS_LABEL(end);
|
||||||
}
|
}
|
||||||
static void ATTRIBUTE_NOINLINE CheckStackTrace3(int i) {
|
static void ATTRIBUTE_NOINLINE CheckStackTrace3(int i) {
|
||||||
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[3]);
|
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[3]);
|
||||||
INIT_ADDRESS_RANGE(CheckStackTrace3, start, end, &expected_range[2]);
|
INIT_ADDRESS_RANGE(CheckStackTrace3, start, end, &expected_range[2]);
|
||||||
DECLARE_ADDRESS_LABEL(start);
|
DECLARE_ADDRESS_LABEL(start);
|
||||||
for (int j = i; j >= 0; j--)
|
for (int j = i; j >= 0; j--) {
|
||||||
CheckStackTrace4(j);
|
CheckStackTrace4(j);
|
||||||
|
}
|
||||||
DECLARE_ADDRESS_LABEL(end);
|
DECLARE_ADDRESS_LABEL(end);
|
||||||
}
|
}
|
||||||
static void ATTRIBUTE_NOINLINE CheckStackTrace2(int i) {
|
static void ATTRIBUTE_NOINLINE CheckStackTrace2(int i) {
|
||||||
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[4]);
|
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[4]);
|
||||||
INIT_ADDRESS_RANGE(CheckStackTrace2, start, end, &expected_range[3]);
|
INIT_ADDRESS_RANGE(CheckStackTrace2, start, end, &expected_range[3]);
|
||||||
DECLARE_ADDRESS_LABEL(start);
|
DECLARE_ADDRESS_LABEL(start);
|
||||||
for (int j = i; j >= 0; j--)
|
for (int j = i; j >= 0; j--) {
|
||||||
CheckStackTrace3(j);
|
CheckStackTrace3(j);
|
||||||
|
}
|
||||||
DECLARE_ADDRESS_LABEL(end);
|
DECLARE_ADDRESS_LABEL(end);
|
||||||
}
|
}
|
||||||
static void ATTRIBUTE_NOINLINE CheckStackTrace1(int i) {
|
static void ATTRIBUTE_NOINLINE CheckStackTrace1(int i) {
|
||||||
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[5]);
|
ADJUST_ADDRESS_RANGE_FROM_RA(&expected_range[5]);
|
||||||
INIT_ADDRESS_RANGE(CheckStackTrace1, start, end, &expected_range[4]);
|
INIT_ADDRESS_RANGE(CheckStackTrace1, start, end, &expected_range[4]);
|
||||||
DECLARE_ADDRESS_LABEL(start);
|
DECLARE_ADDRESS_LABEL(start);
|
||||||
for (int j = i; j >= 0; j--)
|
for (int j = i; j >= 0; j--) {
|
||||||
CheckStackTrace2(j);
|
CheckStackTrace2(j);
|
||||||
|
}
|
||||||
DECLARE_ADDRESS_LABEL(end);
|
DECLARE_ADDRESS_LABEL(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,8 +209,9 @@ static
|
|||||||
void ATTRIBUTE_NOINLINE CheckStackTrace(int i) {
|
void ATTRIBUTE_NOINLINE CheckStackTrace(int i) {
|
||||||
INIT_ADDRESS_RANGE(CheckStackTrace, start, end, &expected_range[5]);
|
INIT_ADDRESS_RANGE(CheckStackTrace, start, end, &expected_range[5]);
|
||||||
DECLARE_ADDRESS_LABEL(start);
|
DECLARE_ADDRESS_LABEL(start);
|
||||||
for (int j = i; j >= 0; j--)
|
for (int j = i; j >= 0; j--) {
|
||||||
CheckStackTrace1(j);
|
CheckStackTrace1(j);
|
||||||
|
}
|
||||||
DECLARE_ADDRESS_LABEL(end);
|
DECLARE_ADDRESS_LABEL(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -49,7 +49,7 @@ _START_GOOGLE_NAMESPACE_
|
|||||||
// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned.
|
// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned.
|
||||||
template<bool STRICT_UNWINDING>
|
template<bool STRICT_UNWINDING>
|
||||||
static void **NextStackFrame(void **old_sp) {
|
static void **NextStackFrame(void **old_sp) {
|
||||||
void **new_sp = (void **) *old_sp;
|
void **new_sp = static_cast<void **>(*old_sp);
|
||||||
|
|
||||||
// Check that the transition from frame pointer old_sp to frame
|
// Check that the transition from frame pointer old_sp to frame
|
||||||
// pointer new_sp isn't clearly bogus
|
// pointer new_sp isn't clearly bogus
|
||||||
@ -83,9 +83,10 @@ static void **NextStackFrame(void **old_sp) {
|
|||||||
// is already on its last leg, so it's ok to be slow here.
|
// is already on its last leg, so it's ok to be slow here.
|
||||||
static int page_size = getpagesize();
|
static int page_size = getpagesize();
|
||||||
void *new_sp_aligned = (void *)((uintptr_t)new_sp & ~(page_size - 1));
|
void *new_sp_aligned = (void *)((uintptr_t)new_sp & ~(page_size - 1));
|
||||||
if (msync(new_sp_aligned, page_size, MS_ASYNC) == -1)
|
if (msync(new_sp_aligned, page_size, MS_ASYNC) == -1) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
return new_sp;
|
return new_sp;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -68,7 +68,7 @@ class StackTraceInit {
|
|||||||
static StackTraceInit module_initializer; // Force initialization
|
static StackTraceInit module_initializer; // Force initialization
|
||||||
|
|
||||||
static _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void *opq) {
|
static _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void *opq) {
|
||||||
trace_arg_t *targ = (trace_arg_t *) opq;
|
trace_arg_t *targ = static_cast<trace_arg_t *>(opq);
|
||||||
|
|
||||||
if (targ->skip_count > 0) {
|
if (targ->skip_count > 0) {
|
||||||
targ->skip_count--;
|
targ->skip_count--;
|
||||||
@ -76,16 +76,18 @@ static _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void *opq) {
|
|||||||
targ->result[targ->count++] = (void *) _Unwind_GetIP(uc);
|
targ->result[targ->count++] = (void *) _Unwind_GetIP(uc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (targ->count == targ->max_depth)
|
if (targ->count == targ->max_depth) {
|
||||||
return _URC_END_OF_STACK;
|
return _URC_END_OF_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
return _URC_NO_REASON;
|
return _URC_NO_REASON;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If you change this function, also change GetStackFrames below.
|
// If you change this function, also change GetStackFrames below.
|
||||||
int GetStackTrace(void** result, int max_depth, int skip_count) {
|
int GetStackTrace(void** result, int max_depth, int skip_count) {
|
||||||
if (!ready_to_run)
|
if (!ready_to_run) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
trace_arg_t targ;
|
trace_arg_t targ;
|
||||||
|
|
||||||
|
|||||||
@ -99,7 +99,7 @@ static ATTRIBUTE_NOINLINE void DemangleInplace(char *out, int out_size) {
|
|||||||
if (Demangle(out, demangled, sizeof(demangled))) {
|
if (Demangle(out, demangled, sizeof(demangled))) {
|
||||||
// Demangling succeeded. Copy to out if the space allows.
|
// Demangling succeeded. Copy to out if the space allows.
|
||||||
size_t len = strlen(demangled);
|
size_t len = strlen(demangled);
|
||||||
if (len + 1 <= (size_t)out_size) { // +1 for '\0'.
|
if (len + 1 <= static_cast<size_t>(out_size)) { // +1 for '\0'.
|
||||||
SAFE_ASSERT(len < sizeof(demangled));
|
SAFE_ASSERT(len < sizeof(demangled));
|
||||||
memmove(out, demangled, len + 1);
|
memmove(out, demangled, len + 1);
|
||||||
}
|
}
|
||||||
@ -382,7 +382,7 @@ struct FileDescriptor {
|
|||||||
int get() { return fd_; }
|
int get() { return fd_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit FileDescriptor(const FileDescriptor&);
|
FileDescriptor(const FileDescriptor &);
|
||||||
void operator=(const FileDescriptor&);
|
void operator=(const FileDescriptor&);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -458,7 +458,7 @@ class LineReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit LineReader(const LineReader&);
|
LineReader(const LineReader &);
|
||||||
void operator=(const LineReader&);
|
void operator=(const LineReader&);
|
||||||
|
|
||||||
char *FindLineFeed() {
|
char *FindLineFeed() {
|
||||||
@ -674,8 +674,9 @@ OpenObjectFileContainingPcAndGetStartAddress(uint64_t pc,
|
|||||||
static char *itoa_r(uintptr_t i, char *buf, size_t sz, unsigned base, size_t padding) {
|
static char *itoa_r(uintptr_t i, char *buf, size_t sz, unsigned base, size_t padding) {
|
||||||
// Make sure we can write at least one NUL byte.
|
// Make sure we can write at least one NUL byte.
|
||||||
size_t n = 1;
|
size_t n = 1;
|
||||||
if (n > sz)
|
if (n > sz) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (base < 2 || base > 16) {
|
if (base < 2 || base > 16) {
|
||||||
buf[0] = '\000';
|
buf[0] = '\000';
|
||||||
@ -698,8 +699,9 @@ static char *itoa_r(uintptr_t i, char *buf, size_t sz, unsigned base, size_t pad
|
|||||||
*ptr++ = "0123456789abcdef"[i % base];
|
*ptr++ = "0123456789abcdef"[i % base];
|
||||||
i /= base;
|
i /= base;
|
||||||
|
|
||||||
if (padding > 0)
|
if (padding > 0) {
|
||||||
padding--;
|
padding--;
|
||||||
|
}
|
||||||
} while (i > 0 || padding > 0);
|
} while (i > 0 || padding > 0);
|
||||||
|
|
||||||
// Terminate the output with a NUL character.
|
// Terminate the output with a NUL character.
|
||||||
|
|||||||
@ -106,7 +106,8 @@ TEST(Symbolize, Symbolize) {
|
|||||||
|
|
||||||
// The name of an internal linkage symbol is not specified; allow either a
|
// The name of an internal linkage symbol is not specified; allow either a
|
||||||
// mangled or an unmangled name here.
|
// mangled or an unmangled name here.
|
||||||
const char *static_func_symbol = TrySymbolize((void *)(&static_func));
|
const char *static_func_symbol =
|
||||||
|
TrySymbolize(reinterpret_cast<void *>(&static_func));
|
||||||
|
|
||||||
#if !defined(_MSC_VER) || !defined(NDEBUG)
|
#if !defined(_MSC_VER) || !defined(NDEBUG)
|
||||||
CHECK(NULL != static_func_symbol);
|
CHECK(NULL != static_func_symbol);
|
||||||
@ -281,7 +282,7 @@ TEST(Symbolize, SymbolizeStackConsumption) {
|
|||||||
int stack_consumed;
|
int stack_consumed;
|
||||||
const char* symbol;
|
const char* symbol;
|
||||||
|
|
||||||
symbol = SymbolizeStackConsumption((void *)(&nonstatic_func),
|
symbol = SymbolizeStackConsumption(reinterpret_cast<void *>(&nonstatic_func),
|
||||||
&stack_consumed);
|
&stack_consumed);
|
||||||
EXPECT_STREQ("nonstatic_func", symbol);
|
EXPECT_STREQ("nonstatic_func", symbol);
|
||||||
EXPECT_GT(stack_consumed, 0);
|
EXPECT_GT(stack_consumed, 0);
|
||||||
@ -289,7 +290,7 @@ TEST(Symbolize, SymbolizeStackConsumption) {
|
|||||||
|
|
||||||
// The name of an internal linkage symbol is not specified; allow either a
|
// The name of an internal linkage symbol is not specified; allow either a
|
||||||
// mangled or an unmangled name here.
|
// mangled or an unmangled name here.
|
||||||
symbol = SymbolizeStackConsumption((void *)(&static_func),
|
symbol = SymbolizeStackConsumption(reinterpret_cast<void *>(&static_func),
|
||||||
&stack_consumed);
|
&stack_consumed);
|
||||||
CHECK(NULL != symbol);
|
CHECK(NULL != symbol);
|
||||||
EXPECT_TRUE(strcmp("static_func", symbol) == 0 ||
|
EXPECT_TRUE(strcmp("static_func", symbol) == 0 ||
|
||||||
@ -304,7 +305,8 @@ TEST(Symbolize, SymbolizeWithDemanglingStackConsumption) {
|
|||||||
int stack_consumed;
|
int stack_consumed;
|
||||||
const char* symbol;
|
const char* symbol;
|
||||||
|
|
||||||
symbol = SymbolizeStackConsumption((void *)(&Foo::func), &stack_consumed);
|
symbol = SymbolizeStackConsumption(reinterpret_cast<void *>(&Foo::func),
|
||||||
|
&stack_consumed);
|
||||||
|
|
||||||
EXPECT_STREQ("Foo::func()", symbol);
|
EXPECT_STREQ("Foo::func()", symbol);
|
||||||
EXPECT_GT(stack_consumed, 0);
|
EXPECT_GT(stack_consumed, 0);
|
||||||
|
|||||||
@ -147,8 +147,11 @@ static void VLOG2Initializer() {
|
|||||||
VModuleInfo* info = new VModuleInfo;
|
VModuleInfo* info = new VModuleInfo;
|
||||||
info->module_pattern = pattern;
|
info->module_pattern = pattern;
|
||||||
info->vlog_level = module_level;
|
info->vlog_level = module_level;
|
||||||
if (head) tail->next = info;
|
if (head) {
|
||||||
else head = info;
|
tail->next = info;
|
||||||
|
} else {
|
||||||
|
head = info;
|
||||||
|
}
|
||||||
tail = info;
|
tail = info;
|
||||||
}
|
}
|
||||||
// Skip past this entry
|
// Skip past this entry
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user