Add simple input parameter checks to every function.
authorMatthias Bolte <matthias.bolte@googlemail.com>
Sun, 5 Apr 2009 19:09:01 +0000 (21:09 +0200)
committerMatthias Bolte <matthias.bolte@googlemail.com>
Sun, 5 Apr 2009 19:09:01 +0000 (21:09 +0200)
Signed-off-by: Matthias Bolte <matthias.bolte@googlemail.com>

HACKING
cli/command.c
cli/core.c
cli/help.c
cli/option.c
cli/token.c
misc/assert.c
misc/error.c
misc/list.c
misc/memory.c
misc/string.c

diff --git a/HACKING b/HACKING
index f0b3d6e..3cbee37 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -10,5 +10,7 @@
 - read http://dl.fefe.de/optimizer-isec.pdf
 - use enums for constant values instead of defines, because enum values are
   visible by name in gdb
+- use VSC__ASSERT for basic input parameter checks in each function to
+  automatically spot simple errors
 - write code in a way so that valgrind is happy
 - ...
index 5cd08d4..29a8f28 100644 (file)
@@ -39,6 +39,8 @@ _vsc_cli_command_info_lookup (const char *command_name)
 {
        int i;
 
+       VSC__ASSERT (command_name != NULL);
+
        for (i = 0; _vsc_cli_command_infos[i] != NULL; i++) {
                if (strcmp (command_name, _vsc_cli_command_infos[i]->name) == 0) {
                        return _vsc_cli_command_infos[i];
@@ -51,6 +53,8 @@ _vsc_cli_command_info_lookup (const char *command_name)
 static void
 _command_free (struct VscCliCommand **command)
 {
+       VSC__ASSERT (command != NULL);
+
        if (*command != NULL) {
                vsc_cli_option_list_free (&(*command)->option_list);
        }
@@ -66,6 +70,7 @@ _command_duplicate (struct VscError *error,
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (command != NULL);
 
        command_duplicate = vsc_memdup (error, command,
                                        sizeof (struct VscCliCommand));
@@ -100,6 +105,8 @@ _vsc_cli_command_list_append (struct VscError *error,
 {
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (command_list != NULL);
+       VSC__ASSERT (command != NULL);
 
        vsc_list_append
           (error, (struct VscList **) command_list,
@@ -115,6 +122,8 @@ _vsc_cli_command_list_append (struct VscError *error,
 void
 vsc_cli_command_list_free (struct VscCliCommand **command_list)
 {
+       VSC__ASSERT (command_list != NULL);
+
        vsc_list_free ((struct VscList **) command_list,
                       (VscList_FreeFunction) _command_free);
 }
@@ -134,6 +143,12 @@ vsc_cli_command_parse (struct VscError *error,
        int data_option_index = 0;/*
        int dash_count = 0;*/
 
+       VSC__ASSERT (error != NULL);
+       VSC__ASSERT (! error->occured);
+       VSC__ASSERT (input != NULL);
+       VSC__ASSERT (input_tail != NULL);
+       VSC__ASSERT (command != NULL);
+
        *input_tail = input;
 
        memset (command, 0, sizeof (struct VscCliCommand));
index 1d6debf..0bc4fbd 100644 (file)
@@ -44,6 +44,10 @@ vsc_cli_init (struct VscError *error,
 {
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (name != NULL);
+       VSC__ASSERT (help != NULL);
+       VSC__ASSERT (option_infos != NULL);
+       VSC__ASSERT (command_infos != NULL);
 
        if (_initialized) {
                VSC__ERROR1 (error, VSC__ERROR_CODE__INVALID_CALL,
@@ -81,13 +85,15 @@ struct VscCliOption * /* option_list */
 vsc_cli_parse_option_list (struct VscError *error, const char *input,
                            const char **input_tail)
 {
-       VSC__ASSERT (error != NULL);
-       VSC__ASSERT (! error->occured);
-
        int num_options_parsed;
        struct VscCliOption option;
        struct VscCliOption *option_list = NULL;
 
+       VSC__ASSERT (error != NULL);
+       VSC__ASSERT (! error->occured);
+       VSC__ASSERT (input != NULL);
+       VSC__ASSERT (input_tail != NULL);
+
        *input_tail = input;
 
        while (*input_tail != NULL && **input_tail != '\0') {
@@ -125,12 +131,14 @@ struct VscCliCommand * /* command_list */
 vsc_cli_parse_command_list (struct VscError *error, const char *input,
                             const char **input_tail)
 {
-       VSC__ASSERT (error != NULL);
-       VSC__ASSERT (! error->occured);
-
        struct VscCliCommand command;
        struct VscCliCommand *command_list = NULL;
 
+       VSC__ASSERT (error != NULL);
+       VSC__ASSERT (! error->occured);
+       VSC__ASSERT (input != NULL);
+       VSC__ASSERT (input_tail != NULL);
+
        *input_tail = input;
 
        while (*input_tail != NULL && **input_tail != '\0') {
@@ -167,6 +175,7 @@ vsc_cli_run_command_list (struct VscError *error,
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (command_list != NULL);
 
        for (command = (struct VscCliCommand *) command_list; command != NULL;
             command = command->next) {
index 0d13820..b976241 100644 (file)
@@ -61,6 +61,7 @@ _help (struct VscError *error, const struct VscCliOption *option_list,
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (option_list != NULL);
 
        command_name = vsc_cli_option_get_string (option_list, "command");
 
index f9385d2..480df63 100644 (file)
@@ -38,6 +38,8 @@ _vsc_cli_option_syntax (const struct VscCliOptionInfo *option_info,
        static char buffer2[256];
        static char buffer3[512];
 
+       VSC__ASSERT (option_info != NULL);
+
        switch (option_info->type) {
        case VSC_CLI__OPTION_TYPE__DATA:
                snprintf (buffer3, 512, "<%s>", option_info->long_name);
@@ -92,6 +94,10 @@ _vsc_cli_option_parse (struct VscError *error,
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (option_infos != NULL);
+       VSC__ASSERT (input != NULL);
+       VSC__ASSERT (input_tail != NULL);
+       VSC__ASSERT (option != NULL);
 
        *input_tail = input;
 
@@ -245,6 +251,8 @@ _option_get (const struct VscCliOption *option_list,
 {
        const struct VscCliOption *option;
 
+       VSC__ASSERT (option_long_name != NULL);
+
        for (option = option_list; option != NULL; option = option->next) {
                if (strcmp (option->info->long_name, option_long_name) == 0) {
                        return option;
@@ -267,6 +275,9 @@ vsc_cli_option_get_number (const struct VscCliOption *option_list,
 {
        const struct VscCliOption *option;
 
+       VSC__ASSERT (option_list != NULL);
+       VSC__ASSERT (option_long_name != NULL);
+
        if (found != NULL) {
                *found = TRUE;
        }
@@ -286,11 +297,14 @@ vsc_cli_option_get_number (const struct VscCliOption *option_list,
 
 const char *
 vsc_cli_option_get_string (const struct VscCliOption *option_list,
-                           const char *name)
+                           const char *option_long_name)
 {
        const struct VscCliOption *option;
 
-       option = _option_get (option_list, name);
+       VSC__ASSERT (option_list != NULL);
+       VSC__ASSERT (option_long_name != NULL);
+
+       option = _option_get (option_list, option_long_name);
 
        if (option == NULL) {
                return NULL;
@@ -305,6 +319,9 @@ _vsc_cli_option_infos_lookup (const struct VscCliOptionInfo *option_infos,
 {
        int i;
 
+       VSC__ASSERT (option_infos != NULL);
+       VSC__ASSERT (option_name != NULL);
+
        for (i = 0; option_infos[i].long_name != NULL; i++) {
                if (option_infos[i].type == VSC_CLI__OPTION_TYPE__DATA) {
                        continue;
@@ -330,6 +347,9 @@ _vsc_cli_option_infos_lookup_data (const struct VscCliOptionInfo *option_infos,
 {
        int i;
 
+       VSC__ASSERT (option_infos != NULL);
+       VSC__ASSERT (position >= 0);
+
        for (i = 0; option_infos[i].long_name != NULL; i++) {
                if (option_infos[i].type == VSC_CLI__OPTION_TYPE__DATA) {
                        if (position > 0) {
@@ -346,6 +366,8 @@ _vsc_cli_option_infos_lookup_data (const struct VscCliOptionInfo *option_infos,
 static void
 _option_free (struct VscCliOption **option)
 {
+       VSC__ASSERT (option != NULL);
+
        if (*option != NULL) {
                vsc_free (&(*option)->string);
        }
@@ -360,6 +382,7 @@ _option_duplicate (struct VscError *error, const struct VscCliOption *option)
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (option != NULL);
 
        option_duplicate = vsc_memdup (error, option, sizeof (struct VscCliOption));
 
@@ -393,6 +416,8 @@ _option_match (struct VscList *item, void *match_data)
        struct VscCliOption *option = (struct VscCliOption *) item;
        const char *option_long_name = (const char *) match_data;
 
+       VSC__ASSERT (item != NULL);
+
        return strcmp (option->info->long_name, option_long_name) == 0;
 }
 
@@ -403,6 +428,8 @@ _vsc_cli_option_list_append (struct VscError *error,
 {
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (option_list != NULL);
+       VSC__ASSERT (option != NULL);
 
        vsc_list_append
           (error, (struct VscList **) option_list,
@@ -418,6 +445,8 @@ _vsc_cli_option_list_append (struct VscError *error,
 void
 vsc_cli_option_list_free (struct VscCliOption **option_list)
 {
+       VSC__ASSERT (option_list != NULL);
+
        vsc_list_free ((struct VscList **) option_list,
                       (VscList_FreeFunction) _option_free);
 }
@@ -430,6 +459,7 @@ _vsc_cli_option_list_duplicate (struct VscError *error,
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (option_list != NULL);
 
        option_list_duplicate = (struct VscCliOption *)
           vsc_list_duplicate
@@ -449,6 +479,8 @@ struct VscCliOption *
 _vsc_cli_option_list_lookup (const struct VscCliOption *option_list,
                              const char *option_long_name)
 {
+       VSC__ASSERT (option_long_name != NULL);
+
        return (struct VscCliOption *)
                  vsc_list_lookup
                     ((struct VscList *) option_list,
index 5ce9726..826653d 100644 (file)
@@ -35,6 +35,9 @@ _vsc_cli_token_parse (struct VscError *error, const char *input, char **token,
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (input != NULL);
+       VSC__ASSERT (token != NULL);
+       VSC__ASSERT (input_tail != NULL);
 
        *token = NULL;
 
index 82c4aa3..0e883ff 100644 (file)
@@ -32,6 +32,11 @@ vsc_assert_failed (const char *file, int line, const char *function,
        struct timeval timestamp;
        struct tm time_info;
 
+       VSC__ASSERT (file != NULL);
+       VSC__ASSERT (line >= 0);
+       VSC__ASSERT (function != NULL);
+       VSC__ASSERT (condition != NULL);
+
        gettimeofday (&timestamp, NULL);
        localtime_r (&timestamp.tv_sec, &time_info);
 
index f6c80f4..919bfe6 100644 (file)
@@ -52,6 +52,9 @@ _error_report_v (struct VscError *error, enum VscErrorCode code,
        VSC__ASSERT (! error->occured);
        VSC__ASSERT (error->message == NULL);
        VSC__ASSERT (code != VSC__ERROR_CODE__UNDEFINED);
+       VSC__ASSERT (file != NULL);
+       VSC__ASSERT (line >= 0);
+       VSC__ASSERT (function != NULL);
 
        error->occured = TRUE;
        error->code = code;
@@ -220,6 +223,13 @@ vsc_error_report (struct VscError *error, enum VscErrorCode code,
 {
        va_list args;
 
+       VSC__ASSERT (error != NULL);
+       VSC__ASSERT (! error->occured);
+       VSC__ASSERT (code != VSC__ERROR_CODE__UNDEFINED);
+       VSC__ASSERT (file != NULL);
+       VSC__ASSERT (line >= 0);
+       VSC__ASSERT (function != NULL);
+
        va_start (args, message);
        _error_report_v (error, code, file, line, function, message, args);
        va_end (args);
@@ -237,6 +247,9 @@ vsc_error_append_report (struct VscError *error, enum VscErrorCode code,
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (error->occured);
        VSC__ASSERT (code != VSC__ERROR_CODE__UNDEFINED);
+       VSC__ASSERT (file != NULL);
+       VSC__ASSERT (line >= 0);
+       VSC__ASSERT (function != NULL);
 
        error_last = (struct VscError *)
                        vsc_list_get_last ((struct VscList *) error);
index 1f39673..d9ab7c2 100644 (file)
@@ -59,6 +59,9 @@ vsc_list_append (struct VscError *error, struct VscList **list,
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (list != NULL);
+       VSC__ASSERT (item != NULL);
+       VSC__ASSERT (duplicate_function != NULL);
 
        duplicate = duplicate_function (error, item);
 
@@ -83,6 +86,12 @@ vsc_list_duplicate (struct VscError *error, const struct VscList *list,
        struct VscList *item = NULL;
        struct VscList *list_duplicate = NULL;
 
+       VSC__ASSERT (error != NULL);
+       VSC__ASSERT (! error->occured);
+       VSC__ASSERT (list != NULL);
+       VSC__ASSERT (duplicate_function != NULL);
+       VSC__ASSERT (free_function != NULL);
+
        for (item = (struct VscList *) list; item != NULL; item = item->next) {
                vsc_list_append (error, &list_duplicate, item, duplicate_function);
 
@@ -110,6 +119,8 @@ vsc_list_lookup (const struct VscList *list,
 {
        struct VscList *item = NULL;
 
+       VSC__ASSERT (match_function != NULL);
+
        for (item = (struct VscList *) list; item != NULL; item = item->next) {
                if (match_function (item, match_data)) {
                        return item;
@@ -133,6 +144,10 @@ vsc_list_remove (struct VscList **list, struct VscList *item,
        struct VscList *previous_item = NULL;
        struct VscList *current_item = NULL;
 
+       VSC__ASSERT (list != NULL);
+       VSC__ASSERT (item != NULL);
+       VSC__ASSERT (free_function != NULL);
+
        for (current_item = *list; current_item != NULL;
             current_item = current_item->next) {
                if (current_item == item) {
@@ -166,6 +181,9 @@ vsc_list_free (struct VscList **list, VscList_FreeFunction free_function)
        struct VscList *item;
        struct VscList *next_item;
 
+       VSC__ASSERT (list != NULL);
+       VSC__ASSERT (free_function != NULL);
+
        if (*list == NULL) {
                return;
        }
index 1796631..33e6e23 100644 (file)
@@ -32,6 +32,7 @@ vsc_alloc (struct VscError *error, size_t size)
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (size > 0);
 
        ptr = calloc (1, size);
 
@@ -68,6 +69,8 @@ vsc_memdup (struct VscError *error, const void *ptr, size_t size)
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (ptr != NULL);
+       VSC__ASSERT (size > 0);
 
        duplicate = vsc_alloc (error, size);
 
index a071c6d..12628fd 100644 (file)
@@ -33,6 +33,7 @@ vsc_strdup (struct VscError *error, const char *string)
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (string != NULL);
 
        string_duplicate = strdup (string);
 
@@ -84,6 +85,7 @@ vsc_strtoi (struct VscError *error, const char *string, char **tail, int base)
 
        VSC__ASSERT (error != NULL);
        VSC__ASSERT (! error->occured);
+       VSC__ASSERT (string != NULL);
 
        errno = 0;
        value = strtol (string, &temp, base);