summaryrefslogtreecommitdiff
path: root/src/_safety.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/_safety.h')
-rw-r--r--src/_safety.h46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/_safety.h b/src/_safety.h
index 7697589c..c9d8a812 100644
--- a/src/_safety.h
+++ b/src/_safety.h
@@ -32,15 +32,41 @@ extern struct __checked_call {
_Thread_local
#endif
extern struct __dangerous {
- const char *func;
- const char *param;
- const void *addr;
+ int reporting;
+ struct __danger {
+ const char *func;
+ const char *param;
+ uintptr_t addr;
+ size_t len;
+ } read, write;
} __dangerous;
#ifndef NDEBUG
#define UNDEFINED(...) __undefined(__VA_ARGS__)
-#define DANGER(__s) __dangerous = ((__s != NULL && __dangerous.func == NULL) ? (struct __dangerous){ .func = __func__, .param = #__s, .addr = __s } : (struct __dangerous){ 0 })
+#define DANGEROUS_READ(__s, __l) do { \
+ if (__dangerous.reporting == 0 && __dangerous.read.func == 0) { \
+ __dangerous.read.func = __func__; \
+ __dangerous.read.param = #__s; \
+ __dangerous.read.addr = (uintptr_t)__s; \
+ __dangerous.read.len = __l; \
+ } \
+} while (0)
+
+#define DANGEROUS_WRITE(__s, __l) do { \
+ if (__dangerous.reporting == 0 && __dangerous.write.func == 0) { \
+ __dangerous.write.func = __func__; \
+ __dangerous.write.param = #__s; \
+ __dangerous.write.addr = (uintptr_t)__s; \
+ __dangerous.write.len = __l; \
+ } \
+} while (0)
+
+#define DANGER_OVER() do { \
+ if (__dangerous.reporting == 0) { \
+ __dangerous.read.func = __dangerous.write.func = 0; \
+ } \
+} while (0)
#define ADD_PREV(__val, __arr, __count) do { \
void *tmp = realloc((__arr), ((__count) + 1) * sizeof((__arr)[0])); \
@@ -105,6 +131,16 @@ extern struct __dangerous {
} \
} while (0)
+#define ASSERT_MBS(__s, __fn, __desc) do { \
+ size_t __n = MB_CUR_MAX; \
+ for (size_t __i = 0; __s[__i] != '\0'; __i++) { \
+ wchar_t __wc = L'\0'; \
+ if (0 && mbtowc(&__wc, __s + __i, __n) == -1) { \
+ UNDEFINED("In call to %s(), %s is not a valid multi-byte string", __fn, __desc); \
+ } \
+ } \
+} while (0)
+
#define SIGNAL_SAFE(__n) do { \
if (__n == 0 && __signal_h.current != 0) { \
int _sig = __signal_h.current; \
@@ -192,7 +228,7 @@ extern struct __dangerous {
#define UNDEFINED(...)
#define ASSERT_NOOVERLAP(__x, __y, __s)
#define ASSERT_NONNULL(x)
-#define DANGER(__s)
+#define ASSERT_MBS(__s, __f, __d)
#define VCHECK_0(f)
#define VCHECK_1(f, a)
#define VCHECK_2(f, a, b)