...
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 |
---|
|
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 |
---|
|
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 |
---|
|
struct string_mx {
size_t size;
size_t maxsize;
unsigned char strtype;
char *cstr;
};
|
...