...
Code Block |
---|
|
const char *p;
void dont_do_this(void) {
const char c_str[] = "This will change";
p = c_str; /* Dangerous */
/* ... */
}
void innocuous(void) {
const char c_str[] = "Surprise, surprise";
}
/* ... */
dont_do_this();
innocuous();
/* p might be pointing to "Surprise, surprise" */
|
...
Code Block |
---|
|
void this_is_OK(void) {
const char c_str[] = "Everything OK";
const char *p = c_str;
/* ... */
}
/* p is inaccessible outside the scope of string c_str */
|
...
Code Block |
---|
|
const char *p;
void is_this_OK(void) {
const char c_str[] = "Everything OK?";
p = c_str;
/* ... */
p = NULL;
}
|
Noncompliant Code Example (Return Values)
...
Code Block |
---|
|
char *init_array(void) {
char array[10];
/* Initialize array */
return array;
}
|
Some compilers generate a warning when a pointer to an automatic variable is returned from a function, as in this example. Compile your code at high warning levels and resolve any warnings. (See MSC00-C. Compile cleanly at high warning levels.)
...
Code Block |
---|
|
void init_array(char array[]) {
/* Initialize array */
return;
}
int main(int argc, char *argv[]) {
char array[10];
init_array(array);
/* ... */
return 0;
}
|
Noncompliant Code
...
Code Block |
---|
|
void squirrel_away(char **ptr_param) {
char local[10];
/* Initialize array */
*ptr_param = local;
}
void rodent() {
char *ptr;
squirrel_away(&ptr);
/* ptr is live but invalid here */
}
|
...
Code Block |
---|
|
char local[10];
void squirrel_away(char **ptr_param) {
/* Initialize array */
*ptr_param = local;
}
void rodent() {
char *ptr;
squirrel_away(&ptr);
/* ptr is live and valid here */
}
|
...