]> diplodocus.org Git - nmh/commitdiff
Add gcc's nonnull function attribute.
authorRalph Corderoy <ralph@inputplus.co.uk>
Sat, 26 Aug 2017 18:19:16 +0000 (19:19 +0100)
committerRalph Corderoy <ralph@inputplus.co.uk>
Sat, 26 Aug 2017 18:19:16 +0000 (19:19 +0100)
Apply it to some prototypes to get started.

h/mh.h
h/prototypes.h

diff --git a/h/mh.h b/h/mh.h
index 3093df1..bebe8b8 100644 (file)
--- a/h/mh.h
+++ b/h/mh.h
@@ -38,6 +38,7 @@ typedef unsigned char  boolean;  /* not int so we can pack in a structure */
 #define ALLOC_SIZE(...) __attribute__((alloc_size(__VA_ARGS__)))
 #define CONST __attribute__((const))
 #define MALLOC __attribute__((malloc))
+#define NONNULL(...) __attribute__((nonnull(__VA_ARGS__)))
 #define NMH_UNUSED(i) (void) i
 #else
 #define NORETURN
@@ -45,6 +46,7 @@ typedef unsigned char  boolean;  /* not int so we can pack in a structure */
 #define ALLOC_SIZE(...)
 #define CONST
 #define MALLOC
+#define NONNULL(...)
 #define NMH_UNUSED(i) i
 #endif
 
@@ -68,24 +70,24 @@ typedef unsigned char  boolean;  /* not int so we can pack in a structure */
 typedef struct charstring *charstring_t;
 
 charstring_t charstring_create (size_t);
-charstring_t charstring_copy (const charstring_t);
+charstring_t charstring_copy (const charstring_t) NONNULL(1);
 void charstring_free (charstring_t);
 /* Append a single-byte character: */
-void charstring_push_back (charstring_t, const char);
+void charstring_push_back (charstring_t, const char) NONNULL(1);
 /* Append possibly multi-byte character(s): */
-void charstring_push_back_chars (charstring_t, const char [], size_t, size_t);
-void charstring_append (charstring_t, const charstring_t);
-void charstring_append_cstring (charstring_t, const char []);
-void charstring_clear (charstring_t);
+void charstring_push_back_chars (charstring_t, const char [], size_t, size_t) NONNULL(1);
+void charstring_append (charstring_t, const charstring_t) NONNULL(2);
+void charstring_append_cstring (charstring_t, const char []) NONNULL(2);
+void charstring_clear (charstring_t) NONNULL(1);
 /* Don't store return value of charstring_buffer() and use later after
    intervening push_back's; use charstring_buffer_copy() instead. */
-const char *charstring_buffer (const charstring_t);
+const char *charstring_buffer (const charstring_t) NONNULL(1);
 /* User is responsible for free'ing result of buffer copy. */
-char *charstring_buffer_copy (const charstring_t);
-size_t charstring_bytes (const charstring_t);
-size_t charstring_chars (const charstring_t);
+char *charstring_buffer_copy (const charstring_t) NONNULL(1);
+size_t charstring_bytes (const charstring_t) NONNULL(1);
+size_t charstring_chars (const charstring_t) NONNULL(1);
 /* Length of the last character in the charstring. */
-int charstring_last_char_len (const charstring_t);
+int charstring_last_char_len (const charstring_t) NONNULL(1);
 
 /*
  * user context/profile structure
@@ -209,33 +211,33 @@ struct bvector {
 typedef struct bvector *bvector_t;
 
 bvector_t bvector_create (void);
-void bvector_init(struct bvector *bv);
-void bvector_copy (bvector_t, bvector_t);
-void bvector_free (bvector_t);
-void bvector_fini(struct bvector *bv);
-void bvector_clear (bvector_t, size_t);
-void bvector_clear_all (bvector_t);
-void bvector_set (bvector_t, size_t);
-unsigned int bvector_at (bvector_t, size_t);
-unsigned long bvector_first_bits (bvector_t);
+void bvector_init(struct bvector *bv) NONNULL(1);
+void bvector_copy (bvector_t, bvector_t) NONNULL(1, 2);
+void bvector_free (bvector_t) NONNULL(1);
+void bvector_fini(struct bvector *bv) NONNULL(1);
+void bvector_clear (bvector_t, size_t) NONNULL(1);
+void bvector_clear_all (bvector_t) NONNULL(1);
+void bvector_set (bvector_t, size_t) NONNULL(1);
+unsigned int bvector_at (bvector_t, size_t) NONNULL(1);
+unsigned long bvector_first_bits (bvector_t) NONNULL(1);
 
 typedef struct svector *svector_t;
 
 svector_t svector_create (size_t);
-void svector_free (svector_t);
-char *svector_push_back (svector_t, char *);
-char *svector_at (svector_t, size_t);
-char **svector_find(svector_t, const char *);
-char **svector_strs (svector_t);
-size_t svector_size (svector_t);
+void svector_free (svector_t) NONNULL(1);
+char *svector_push_back (svector_t, char *) NONNULL(1);
+char *svector_at (svector_t, size_t) NONNULL(1);
+char **svector_find(svector_t, const char *) NONNULL(1);
+char **svector_strs (svector_t) NONNULL(1);
+size_t svector_size (svector_t) NONNULL(1);
 
 typedef struct ivector *ivector_t;
 
 ivector_t ivector_create (size_t);
-void ivector_free (ivector_t);
-int ivector_push_back (ivector_t, int);
-int ivector_at (ivector_t, size_t);
-int *ivector_atp (ivector_t, size_t);
+void ivector_free (ivector_t) NONNULL(1);
+int ivector_push_back (ivector_t, int) NONNULL(1);
+int ivector_at (ivector_t, size_t) NONNULL(1);
+int *ivector_atp (ivector_t, size_t) NONNULL(1);
 
 /*
  * Primary structure of folder/message information
index 29ca1dd..92ed8ef 100644 (file)
@@ -7,7 +7,7 @@
 /*
  * prototype from config.h
  */
-char *etcpath(char *);
+char *etcpath(char *) NONNULL(1);
 
 /*
  * prototypes from the nmh subroutine library
@@ -21,13 +21,13 @@ void adios (const char *, const char *, ...) CHECK_PRINTF(2, 3) NORETURN;
 void admonish (char *, char *, ...) CHECK_PRINTF(2, 3);
 void advertise (const char *, char *, const char *, va_list) CHECK_PRINTF(3, 0);
 void advise (const char *, const char *, ...) CHECK_PRINTF(2, 3);
-char **argsplit (char *, char **, int *);
-void argsplit_msgarg (struct msgs_array *, char *, char **);
-void argsplit_insert (struct msgs_array *, char *, char **);
+char **argsplit (char *, char **, int *) NONNULL(1, 2);
+void argsplit_msgarg (struct msgs_array *, char *, char **) NONNULL(1, 2, 3);
+void argsplit_insert (struct msgs_array *, char *, char **) NONNULL(1, 2, 3);
 void arglist_free (char *, char **);
-void ambigsw (const char *, const struct swit *);
-int atooi(char *);
-char **brkstring (char *, char *, char *);
+void ambigsw (const char *, const struct swit *) NONNULL(1, 2);
+int atooi(char *) NONNULL(1);
+char **brkstring (char *, char *, char *) NONNULL(1);
 
 /*
  * Check to see if we can display a given character set natively.