*/
static void *null_context;
static void *autofree_context;
+static unsigned int flags;
/* used to enable fill of memory on free, which can be useful for
* catching use after free errors when valgrind is too slow
talloc_log_fn = log_fn;
}
+int talloc_set_flag(unsigned int flag)
+{
+ if (flag != TALLOC_FLAG_WARN_MAY_REFERENCE) {
+ return -1;
+ }
+ flags |= flag;
+ return 0;
+}
+
+int talloc_unset_flag(unsigned int flag)
+{
+ if (flag != TALLOC_FLAG_WARN_MAY_REFERENCE) {
+ return -1;
+ }
+ flags |= ~flag;
+ return 0;
+}
+
static void talloc_log(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);
static void talloc_log(const char *fmt, ...)
{
if (unlikely(ptr == NULL)) return NULL;
tc = talloc_chunk_from_ptr(ptr);
+ if ((flags & TALLOC_FLAG_WARN_MAY_REFERENCE) && !(tc->flags & TALLOC_FLAG_MAY_REF)) {
+ talloc_log("talloc_reference on non-may_reference pointer at %s)", location);
+ }
+
handle = (struct talloc_reference_handle *)_talloc_named_const(context,
sizeof(struct talloc_reference_handle),
TALLOC_MAGIC_REFERENCE);
* talloc_may_reference(a);
* @endcode
*
- * @see talloc_reference()
+ * @see talloc_reference(), talloc_set_flag()
*/
void *talloc_may_reference(const void *ptr);
*/
void talloc_enable_leak_report_full(void);
+#define TALLOC_FLAG_WARN_MAY_REFERENCE 0x1
+/**
+ * @brief Set a global flag which alters talloc's behavior.
+ *
+ * 0 is returned if the flag is known, -1 otherwise.
+ *
+ * Flag is one of the following:
+ * TALLOC_FLAG_WARN_MAY_REFERENCE:
+ * Warn if talloc_reference() is called on a pointer without talloc_may_reference()
+ * being called first.
+ */
+int talloc_set_flag(unsigned int flag);
+
+/**
+ * @brief Remove a global flag which alters talloc's behavior.
+ *
+ * 0 is returned if the flag is known, -1 otherwise.
+ */
+int talloc_unset_flag(unsigned int flag);
+
/* @} ******************************************************************/
void talloc_set_abort_fn(void (*abort_fn)(const char *reason));