Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Code formatting

...

Code Block
bgColor#FFCCCC
langc
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
bgColor#ccccff
langc
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
bgColor#ccccff
langc
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
bgColor#FFCCCC
langc
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
bgColor#ccccff
langc
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
bgColor#FFcccc
langc
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
bgColor#ccccff
langc
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 */
}

...