Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Wiki Markup
This noncompliant code example is based on the managed string library developed by CERT \[[Burch 2006|AA. Bibliography#Seacord 06]\]. In this example, the managed string type, and functions that operate on this type, are defined in the {{string_m.h}} header file as follows:

Code Block
bgColor#FFCCCC
langc
struct string_mx {
    size_t size;
    size_t maxsize;
    unsigned char strtype;
    char *cstr;
};

typedef struct string_mx string_mx;

/* Function declarations */
extern errno_t strcpy_m(string_mx *s1, const string_mx *s2);
extern errno_t strcat_m(string_mx *s1, const string_mx *s2);
/* etc. */

...

In the external string_m.h file, the string_mx type is defined to be an instance of struct string_mx, which, in turn, is declared as an incomplete type.

Code Block
bgColor#ccccff
langc
struct string_mx;
typedef struct string_mx string_mx;

/* Function declarations */
extern errno_t strcpy_m(string_mx *s1, const string_mx *s2);
extern errno_t strcat_m(string_mx *s1, const string_mx *s2) ;
/* etc. */

In the internal header file, struct string_mx is fully defined but not visible to a user of the data abstraction.

Code Block
bgColor#ccccff
langc
struct string_mx {
    size_t size;
    size_t maxsize;
    unsigned char strtype;
    char *cstr;
};

...