...
Code Block |
---|
|
#include <stdio.h>
void func(void) {
char str[3] = "abc";
printf("%s\n", str);
}
|
Compliant Solution
This compliant solution does not specify the bound of the character array in the array declaration. If the array bound is omitted, the compiler allocates sufficient storage to store the entire string literal, including the terminating null character.
Code Block |
---|
|
#include <stdio.h>
void func(void) {
char str[] = "abc";
printf("%s\n", str);
} |
Noncompliant Code Example
This code example is noncompliant because the wide character sequence cur_msg
will not be null-terminated when passed to wcslen()
. This will occur if lessen_memory_usage()
is invoked while cur_msg_size
still has its initial value of 1024.
Code Block |
---|
|
#include <stdlib.h>
#include <wchar.h>
wchar_t *cur_msg = NULL;
size_t cur_msg_size = 1024;
size_t cur_msg_len = 0;
void lessen_memory_usage(void) {
wchar_t *temp;
size_t temp_size;
/* ... */
if (cur_msg != NULL) {
temp_size = cur_msg_size / 2 + 1;
temp = realloc(cur_msg, temp_size * sizeof(wchar_t));
// temp & cur_msg might not be null-terminated
if (temp == NULL) {
/* Handle error */
}
cur_msg = temp;
cur_msg_size = temp_size;
cur_msg_len = wcslen(cur_msg); // error
}
} |
Compliant Solution
In this compliant solution, cur_msg
will always be null-terminated when passed to wcslen()
.
Code Block |
---|
|
#include <stdlib.h>
#include <wchar.h>
wchar_t *cur_msg = NULL;
size_t cur_msg_size = 1024;
size_t cur_msg_len = 0;
void lessen_memory_usage(void) {
wchar_t *temp;
size_t temp_size;
/* ... */
if (cur_msg != NULL) {
temp_size = cur_msg_size / 2 + 1;
temp = realloc(cur_msg, temp_size * sizeof(wchar_t));
// temp & cur_msg might not be null-terminated
if (temp == NULL) {
/* Handle error */
}
cur_msg = temp;
// cur_msg now properly null-terminated
cur_msg[temp_size - 1] = L'\0';
cur_msg_size = temp_size;
cur_msg_len = wcslen(cur_msg);
}
} |
...