maint: improve -fanalyzer malloc checking
* lib/backup-internal.h, lib/backupfile.h:
- * lib/canonicalize.h:
+ * lib/canonicalize.h, lib/dfa.h:
Add malloc-related attributes and include stdlib.h as needed.
+ * lib/dfa.c: Include verify.h.
+ (assume_nonnull): New macro.
+ (dfamust): Use it to pacify GCC.
2021-08-01 Jim Meyering <meyering@fb.com>
#include "flexmember.h"
#include "idx.h"
+#include "verify.h"
#include <assert.h>
#include <ctype.h>
#include <limits.h>
#include <string.h>
+/* Pacify gcc -Wanalyzer-null-dereference in areas where GCC
+ understandably cannot deduce that the input comes from a
+ well-formed regular expression. There's little point to the
+ runtime overhead of 'assert' instead of 'assume_nonnull' when the
+ MMU will check anyway. */
+#define assume_nonnull(x) assume ((x) != NULL)
+
static bool
streq (char const *a, char const *b)
{
case STAR:
case QMARK:
+ assume_nonnull (mp);
resetmust (mp);
break;
{
char **new;
must *rmp = mp;
+ assume_nonnull (rmp);
must *lmp = mp = mp->prev;
+ assume_nonnull (lmp);
idx_t j, ln, rn, n;
/* Guaranteed to be. Unlikely, but ... */
break;
case PLUS:
+ assume_nonnull (mp);
mp->is[0] = '\0';
break;
case END:
+ assume_nonnull (mp);
assert (!mp->prev);
for (idx_t i = 0; mp->in[i] != NULL; i++)
if (strlen (mp->in[i]) > strlen (result))
case CAT:
{
must *rmp = mp;
+ assume_nonnull (rmp);
must *lmp = mp = mp->prev;
+ assume_nonnull (lmp);
/* In. Everything in left, plus everything in
right, plus concatenation of
#include <regex.h>
#include <stdbool.h>
#include <stddef.h>
+#include <stdlib.h>
#ifdef __cplusplus
extern "C" {
/* Needed when Gnulib is not used. */
#ifndef _GL_ATTRIBUTE_MALLOC
-# define _GL_ATTRIBUTE_MALLOC
+# define _GL_ATTRIBUTE_MALLOC
+# define _GL_ATTRIBUTE_DEALLOC_FREE
+# define _GL_ATTRIBUTE_RETURNS_NONNULL
#endif
/* Entry points. */
It should be initialized via dfasyntax or dfacopysyntax before other use.
The returned pointer should be passed directly to free() after
calling dfafree() on it. */
-extern struct dfa *dfaalloc (void) _GL_ATTRIBUTE_MALLOC;
+extern struct dfa *dfaalloc (void)
+ _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE
+ _GL_ATTRIBUTE_RETURNS_NONNULL;
/* DFA options that can be ORed together, for dfasyntax's 4th arg. */
enum