003 File Manager
Current Path:
/usr/src/contrib/llvm-project/compiler-rt/lib/scudo/standalone
usr
/
src
/
contrib
/
llvm-project
/
compiler-rt
/
lib
/
scudo
/
standalone
/
📁
..
📄
allocator_config.h
(2.57 KB)
📄
atomic_helpers.h
(4.16 KB)
📄
bytemap.h
(992 B)
📄
checksum.cpp
(2.52 KB)
📄
checksum.h
(1.67 KB)
📄
chunk.h
(5.83 KB)
📄
combined.h
(40.99 KB)
📄
common.cpp
(874 B)
📄
common.h
(5.29 KB)
📄
crc32_hw.cpp
(656 B)
📄
flags.cpp
(2.09 KB)
📄
flags.h
(975 B)
📄
flags.inc
(2.41 KB)
📄
flags_parser.cpp
(4.38 KB)
📄
flags_parser.h
(1.23 KB)
📄
fuchsia.cpp
(6.04 KB)
📄
fuchsia.h
(695 B)
📁
fuzz
📁
include
📄
internal_defs.h
(4.61 KB)
📄
linux.cpp
(6.1 KB)
📄
linux.h
(2.77 KB)
📄
list.h
(4.95 KB)
📄
local_cache.h
(5.21 KB)
📄
memtag.h
(7.21 KB)
📄
mutex.h
(1.69 KB)
📄
platform.h
(2.03 KB)
📄
primary32.h
(18.05 KB)
📄
primary64.h
(17.3 KB)
📄
quarantine.h
(9.64 KB)
📄
release.cpp
(522 B)
📄
release.h
(10.27 KB)
📄
report.cpp
(6.62 KB)
📄
report.h
(1.97 KB)
📄
secondary.h
(13.22 KB)
📄
size_class_map.h
(9.9 KB)
📄
stack_depot.h
(4.47 KB)
📄
stats.h
(2.77 KB)
📄
string_utils.cpp
(7.93 KB)
📄
string_utils.h
(1.05 KB)
📄
tsd.h
(1.84 KB)
📄
tsd_exclusive.h
(4.03 KB)
📄
tsd_shared.h
(5.53 KB)
📄
vector.h
(3.07 KB)
📄
wrappers_c.cpp
(1.19 KB)
📄
wrappers_c.h
(1.46 KB)
📄
wrappers_c.inc
(8.6 KB)
📄
wrappers_c_bionic.cpp
(2.23 KB)
📄
wrappers_c_checks.h
(1.99 KB)
📄
wrappers_cpp.cpp
(4.53 KB)
Editing: flags_parser.cpp
//===-- flags_parser.cpp ----------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "flags_parser.h" #include "common.h" #include "report.h" #include <stdlib.h> #include <string.h> namespace scudo { class UnknownFlagsRegistry { static const u32 MaxUnknownFlags = 16; const char *UnknownFlagsNames[MaxUnknownFlags]; u32 NumberOfUnknownFlags; public: void add(const char *Name) { CHECK_LT(NumberOfUnknownFlags, MaxUnknownFlags); UnknownFlagsNames[NumberOfUnknownFlags++] = Name; } void report() { if (!NumberOfUnknownFlags) return; Printf("Scudo WARNING: found %d unrecognized flag(s):\n", NumberOfUnknownFlags); for (u32 I = 0; I < NumberOfUnknownFlags; ++I) Printf(" %s\n", UnknownFlagsNames[I]); NumberOfUnknownFlags = 0; } }; static UnknownFlagsRegistry UnknownFlags; void reportUnrecognizedFlags() { UnknownFlags.report(); } void FlagParser::printFlagDescriptions() { Printf("Available flags for Scudo:\n"); for (u32 I = 0; I < NumberOfFlags; ++I) Printf("\t%s\n\t\t- %s\n", Flags[I].Name, Flags[I].Desc); } static bool isSeparator(char C) { return C == ' ' || C == ',' || C == ':' || C == '\n' || C == '\t' || C == '\r'; } static bool isSeparatorOrNull(char C) { return !C || isSeparator(C); } void FlagParser::skipWhitespace() { while (isSeparator(Buffer[Pos])) ++Pos; } void FlagParser::parseFlag() { const uptr NameStart = Pos; while (Buffer[Pos] != '=' && !isSeparatorOrNull(Buffer[Pos])) ++Pos; if (Buffer[Pos] != '=') reportError("expected '='"); const char *Name = Buffer + NameStart; const uptr ValueStart = ++Pos; const char *Value; if (Buffer[Pos] == '\'' || Buffer[Pos] == '"') { const char Quote = Buffer[Pos++]; while (Buffer[Pos] != 0 && Buffer[Pos] != Quote) ++Pos; if (Buffer[Pos] == 0) reportError("unterminated string"); Value = Buffer + ValueStart + 1; ++Pos; // consume the closing quote } else { while (!isSeparatorOrNull(Buffer[Pos])) ++Pos; Value = Buffer + ValueStart; } if (!runHandler(Name, Value)) reportError("flag parsing failed."); } void FlagParser::parseFlags() { while (true) { skipWhitespace(); if (Buffer[Pos] == 0) break; parseFlag(); } } void FlagParser::parseString(const char *S) { if (!S) return; // Backup current parser state to allow nested parseString() calls. const char *OldBuffer = Buffer; const uptr OldPos = Pos; Buffer = S; Pos = 0; parseFlags(); Buffer = OldBuffer; Pos = OldPos; } inline bool parseBool(const char *Value, bool *b) { if (strncmp(Value, "0", 1) == 0 || strncmp(Value, "no", 2) == 0 || strncmp(Value, "false", 5) == 0) { *b = false; return true; } if (strncmp(Value, "1", 1) == 0 || strncmp(Value, "yes", 3) == 0 || strncmp(Value, "true", 4) == 0) { *b = true; return true; } return false; } bool FlagParser::runHandler(const char *Name, const char *Value) { for (u32 I = 0; I < NumberOfFlags; ++I) { const uptr Len = strlen(Flags[I].Name); if (strncmp(Name, Flags[I].Name, Len) != 0 || Name[Len] != '=') continue; bool Ok = false; switch (Flags[I].Type) { case FlagType::FT_bool: Ok = parseBool(Value, reinterpret_cast<bool *>(Flags[I].Var)); if (!Ok) reportInvalidFlag("bool", Value); break; case FlagType::FT_int: char *ValueEnd; *reinterpret_cast<int *>(Flags[I].Var) = static_cast<int>(strtol(Value, &ValueEnd, 10)); Ok = *ValueEnd == '"' || *ValueEnd == '\'' || isSeparatorOrNull(*ValueEnd); if (!Ok) reportInvalidFlag("int", Value); break; } return Ok; } // Unrecognized flag. This is not a fatal error, we may print a warning later. UnknownFlags.add(Name); return true; } void FlagParser::registerFlag(const char *Name, const char *Desc, FlagType Type, void *Var) { CHECK_LT(NumberOfFlags, MaxFlags); Flags[NumberOfFlags].Name = Name; Flags[NumberOfFlags].Desc = Desc; Flags[NumberOfFlags].Type = Type; Flags[NumberOfFlags].Var = Var; ++NumberOfFlags; } } // namespace scudo
Upload File
Create Folder