Put assertions behind a DEBUG flag to make it easy to build without them.
This commit is contained in:
parent
f3754b8429
commit
0c898e3c2c
Notes:
sideshowbarker
2024-07-19 14:36:41 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/0c898e3c2ca
18 changed files with 49 additions and 37 deletions
|
@ -3,12 +3,15 @@
|
|||
#include <Kernel/kstdio.h>
|
||||
#include <Kernel/i386.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
[[noreturn]] void __assertion_failed(const char* msg, const char* file, unsigned line, const char* func);
|
||||
|
||||
#define ASSERT(expr) (static_cast<bool>(expr) ? (void)0 : __assertion_failed(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__))
|
||||
#define ASSERT_NOT_REACHED() ASSERT(false)
|
||||
#else
|
||||
#define ASSERT(expr)
|
||||
#define ASSERT_NOT_REACHED() CRASH()
|
||||
#endif
|
||||
#define CRASH() do { asm volatile("ud2"); } while(0)
|
||||
#define RELEASE_ASSERT(x) do { if (!(x)) CRASH(); } while(0)
|
||||
//#define ASSERT RELEASE_ASSERT
|
||||
#define ASSERT_NOT_REACHED() ASSERT(false)
|
||||
#define ASSERT_INTERRUPTS_DISABLED() ASSERT(!(cpu_flags() & 0x200))
|
||||
#define ASSERT_INTERRUPTS_ENABLED() ASSERT(cpu_flags() & 0x200)
|
||||
|
|
|
@ -484,6 +484,7 @@ void handle_irq()
|
|||
PIC::eoi(irq);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
void __assertion_failed(const char* msg, const char* file, unsigned line, const char* func)
|
||||
{
|
||||
asm volatile("cli");
|
||||
|
@ -493,6 +494,7 @@ void __assertion_failed(const char* msg, const char* file, unsigned line, const
|
|||
asm volatile("hlt");
|
||||
for (;;);
|
||||
}
|
||||
#endif
|
||||
|
||||
void sse_init()
|
||||
{
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
extern "C" {
|
||||
|
||||
#ifdef DEBUG
|
||||
void __assertion_failed(const char* msg, const char* file, unsigned line, const char* func)
|
||||
{
|
||||
dbgprintf("USERSPACE(%d) ASSERTION FAILED: %s\n%s:%u in %s\n", getpid(), msg, file, line, func);
|
||||
|
@ -12,5 +13,6 @@ void __assertion_failed(const char* msg, const char* file, unsigned line, const
|
|||
abort();
|
||||
for (;;);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
|
@ -4,13 +4,18 @@
|
|||
|
||||
__BEGIN_DECLS
|
||||
|
||||
#ifdef DEBUG
|
||||
__attribute__((noreturn)) void __assertion_failed(const char* msg, const char* file, unsigned line, const char* func);
|
||||
|
||||
#define assert(expr) ((expr) ? (void)0 : __assertion_failed(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__))
|
||||
#define ASSERT_NOT_REACHED() assert(false)
|
||||
#else
|
||||
#define assert(expr)
|
||||
#define ASSERT_NOT_REACHED() CRASH()
|
||||
#endif
|
||||
|
||||
#define CRASH() do { asm volatile("ud2"); } while(0)
|
||||
#define ASSERT assert
|
||||
#define RELEASE_ASSERT assert
|
||||
#define ASSERT_NOT_REACHED() assert(false)
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ int _start(int argc, char** argv, char** env)
|
|||
|
||||
[[noreturn]] void __cxa_pure_virtual()
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
void __cxa_atexit()
|
||||
|
|
|
@ -5,7 +5,7 @@ extern "C" {
|
|||
|
||||
struct mntent* getmntent(FILE*)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
|
|
@ -401,7 +401,7 @@ FILE* freopen(const char* pathname, const char* mode, FILE* stream)
|
|||
(void)pathname;
|
||||
(void)mode;
|
||||
(void)stream;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
FILE* fdopen(int fd, const char* mode)
|
||||
|
@ -429,19 +429,19 @@ int rename(const char* oldpath, const char* newpath)
|
|||
|
||||
char* tmpnam(char*)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
FILE* popen(const char* command, const char* type)
|
||||
{
|
||||
(void)command;
|
||||
(void)type;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int pclose(FILE*)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int remove(const char* pathname)
|
||||
|
|
|
@ -63,7 +63,7 @@ void* malloc(size_t size)
|
|||
|
||||
if (s_malloc_sum_free < real_size) {
|
||||
fprintf(stderr, "malloc(): Out of memory\ns_malloc_sum_free=%u, real_size=%u\n", s_malloc_sum_free, real_size);
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
size_t chunks_needed = real_size / CHUNK_SIZE;
|
||||
|
@ -183,7 +183,7 @@ void exit(int status)
|
|||
extern void _fini();
|
||||
_fini();
|
||||
_exit(status);
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int atexit(void (*handler)())
|
||||
|
@ -271,7 +271,7 @@ double strtod(const char* str, char** endptr)
|
|||
(void)str;
|
||||
(void)endptr;
|
||||
dbgprintf("LibC: strtod: '%s'\n", str);
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
float strtof(const char* str, char** endptr)
|
||||
|
@ -279,13 +279,13 @@ float strtof(const char* str, char** endptr)
|
|||
(void)str;
|
||||
(void)endptr;
|
||||
dbgprintf("LibC: strtof: '%s'\n", str);
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
double atof(const char* str)
|
||||
{
|
||||
dbgprintf("LibC: atof: '%s'\n", str);
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int atoi(const char* str)
|
||||
|
@ -417,7 +417,7 @@ ldiv_t ldiv(long numerator, long denominator)
|
|||
|
||||
size_t mbstowcs(wchar_t*, const char*, size_t)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
long strtol(const char* str, char** endptr, int base)
|
||||
|
|
|
@ -366,7 +366,7 @@ char *strtok(char* str, const char* delim)
|
|||
{
|
||||
(void)str;
|
||||
(void)delim;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ extern "C" {
|
|||
pid_t wait(int* wstatus)
|
||||
{
|
||||
(void)wstatus;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -107,7 +107,7 @@ int tgetnum(const char* id)
|
|||
auto it = caps->find(id);
|
||||
if (it != caps->end())
|
||||
return atoi((*it).value);
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
char* tgoto(const char* cap, int col, int row)
|
||||
|
@ -115,7 +115,7 @@ char* tgoto(const char* cap, int col, int row)
|
|||
(void)cap;
|
||||
(void)col;
|
||||
(void)row;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int tputs(const char* str, int affcnt, int (*putc)(int))
|
||||
|
|
|
@ -29,14 +29,14 @@ int tcflow(int fd, int action)
|
|||
{
|
||||
(void) fd;
|
||||
(void) action;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int tcflush(int fd, int queue_selector)
|
||||
{
|
||||
(void)fd;
|
||||
(void)queue_selector;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
speed_t cfgetispeed(const struct termios* tp)
|
||||
|
|
|
@ -92,12 +92,12 @@ struct tm* gmtime(const time_t* t)
|
|||
|
||||
char *asctime(const struct tm*)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
size_t strftime(char*, size_t, const char*, const struct tm*)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
long timezone;
|
||||
|
@ -107,7 +107,7 @@ int daylight;
|
|||
|
||||
void tzset()
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ long ulimit(int cmd, long newlimit)
|
|||
{
|
||||
(void) cmd;
|
||||
(void) newlimit;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -362,27 +362,27 @@ int access(const char* pathname, int mode)
|
|||
int mknod(const char* pathname, mode_t, dev_t)
|
||||
{
|
||||
(void) pathname;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
long fpathconf(int fd, int name)
|
||||
{
|
||||
(void) fd;
|
||||
(void) name;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
long pathconf(const char* path, int name)
|
||||
{
|
||||
(void) path;
|
||||
(void) name;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
void _exit(int status)
|
||||
{
|
||||
syscall(SC_exit, status);
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
void sync()
|
||||
|
|
|
@ -5,25 +5,25 @@ extern "C" {
|
|||
|
||||
double cos(double)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
double sin(double)
|
||||
{
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
double pow(double x, double y)
|
||||
{
|
||||
(void)x;
|
||||
(void)y;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
double ldexp(double, int exp)
|
||||
{
|
||||
(void)exp;
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,10 +11,10 @@ INCLUDE_FLAGS = -I$(SERENITY_BASE_DIR) -I. -I$(SERENITY_BASE_DIR)/LibC -I$(SEREN
|
|||
LDFLAGS = -L$(SERENITY_BASE_DIR)/LibC -L$(SERENITY_BASE_DIR)/LibCore -L$(SERENITY_BASE_DIR)/LibM -L$(SERENITY_BASE_DIR)/LibGUI -Wl,--gc-sections
|
||||
CLANG_FLAGS = -Wconsumed -m32 -ffreestanding -march=i686
|
||||
#SUGGEST_FLAGS = -Wsuggest-final-types -Wsuggest-final-methods -Wsuggest-override #-Wsuggest-attribute=noreturn
|
||||
DEFINES = -DSANITIZE_PTRS
|
||||
CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(FLAVOR_FLAGS) $(ARCH_FLAGS) $(STANDARD_FLAGS) $(SUGGEST_FLAGS) $(INCLUDE_FLAGS) $(DEFINES)
|
||||
#CXX = clang $(CLANG_FLAGS)
|
||||
CXX = i686-pc-serenity-g++
|
||||
LD = i686-pc-serenity-g++
|
||||
AS = i686-pc-serenity-as
|
||||
|
||||
DEFINES = -DSANITIZE_PTRS -DDEBUG
|
||||
|
|
|
@ -180,7 +180,7 @@ static int runcmd(char* cmd)
|
|||
exit(1);
|
||||
}
|
||||
// We should never get here!
|
||||
assert(false);
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
int wstatus = 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue