Use of M_ASSERT_INDEX
to validate user input.
This commit is contained in:
1 parent
032388b790
commit
27bb62533a
1 file changed
+16
-16
+16
-16
@@ -239,7 +239,7 @@ static inline char
|
|||||||
string_get_char(const string_t v, size_t index)
|
string_get_char(const string_t v, size_t index)
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
M_ASSUME(index < string_size(v));
|
M_ASSERT_INDEX(index, string_size(v));
|
||||||
return string_get_cstr(v)[index];
|
return string_get_cstr(v)[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +259,7 @@ string_empty_p(const string_t v)
|
|||||||
static inline char *
|
static inline char *
|
||||||
stringi_fit2size (string_t v, size_t size_alloc)
|
stringi_fit2size (string_t v, size_t size_alloc)
|
||||||
{
|
{
|
||||||
assert (size_alloc > 0);
|
M_ASSERT_INDEX (0, size_alloc);
|
||||||
// Note: this function may be called in context where the contract
|
// Note: this function may be called in context where the contract
|
||||||
// is not fullfilled.
|
// is not fullfilled.
|
||||||
const size_t old_alloc = string_capacity(v);
|
const size_t old_alloc = string_capacity(v);
|
||||||
@@ -385,7 +385,7 @@ string_set_n(string_t v, const string_t ref, size_t offset, size_t length)
|
|||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
STRINGI_CONTRACT (ref);
|
STRINGI_CONTRACT (ref);
|
||||||
assert (offset <= string_size(ref));
|
M_ASSERT_INDEX (offset, string_size(ref) + 1);
|
||||||
size_t size = M_MIN (string_size(ref) - offset, length);
|
size_t size = M_MIN (string_size(ref) - offset, length);
|
||||||
char *ptr = stringi_fit2size(v, size+1);
|
char *ptr = stringi_fit2size(v, size+1);
|
||||||
memmove(ptr, string_get_cstr(ref) + offset, size);
|
memmove(ptr, string_get_cstr(ref) + offset, size);
|
||||||
@@ -576,7 +576,7 @@ static inline size_t
|
|||||||
string_search_char (const string_t v, char c, size_t start)
|
string_search_char (const string_t v, char c, size_t start)
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
assert (start <= string_size(v));
|
M_ASSERT_INDEX (start, string_size(v) + 1);
|
||||||
const char *p = M_ASSIGN_CAST(const char*,
|
const char *p = M_ASSIGN_CAST(const char*,
|
||||||
strchr(string_get_cstr(v)+start, c));
|
strchr(string_get_cstr(v)+start, c));
|
||||||
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
||||||
@@ -591,7 +591,7 @@ static inline size_t
|
|||||||
string_search_rchar (const string_t v, char c, size_t start)
|
string_search_rchar (const string_t v, char c, size_t start)
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
assert (start <= string_size(v));
|
M_ASSERT_INDEX (start, string_size(v)+1);
|
||||||
// NOTE: Can implement it in a faster way than the libc function
|
// NOTE: Can implement it in a faster way than the libc function
|
||||||
// by scanning backward from the bottom of the string (which is
|
// by scanning backward from the bottom of the string (which is
|
||||||
// possible since we know the size)
|
// possible since we know the size)
|
||||||
@@ -607,7 +607,7 @@ static inline size_t
|
|||||||
string_search_str (const string_t v, const char str[], size_t start)
|
string_search_str (const string_t v, const char str[], size_t start)
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
assert (start <= string_size(v));
|
M_ASSERT_INDEX (start, string_size(v)+1);
|
||||||
M_ASSUME (str != NULL);
|
M_ASSUME (str != NULL);
|
||||||
const char *p = M_ASSIGN_CAST(const char*,
|
const char *p = M_ASSIGN_CAST(const char*,
|
||||||
strstr(string_get_cstr(v)+start, str));
|
strstr(string_get_cstr(v)+start, str));
|
||||||
@@ -621,7 +621,7 @@ static inline size_t
|
|||||||
string_search (const string_t v1, const string_t v2, size_t start)
|
string_search (const string_t v1, const string_t v2, size_t start)
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v2);
|
STRINGI_CONTRACT (v2);
|
||||||
assert (start <= string_size(v1));
|
M_ASSERT_INDEX (start, string_size(v1)+1);
|
||||||
return string_search_str(v1, string_get_cstr(v2), start);
|
return string_search_str(v1, string_get_cstr(v2), start);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -633,7 +633,7 @@ static inline size_t
|
|||||||
string_search_pbrk(const string_t v1, const char first_of[], size_t start)
|
string_search_pbrk(const string_t v1, const char first_of[], size_t start)
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v1);
|
STRINGI_CONTRACT (v1);
|
||||||
assert (start <= string_size(v1));
|
M_ASSERT_INDEX (start, string_size(v1)+1);
|
||||||
M_ASSUME (first_of != NULL);
|
M_ASSUME (first_of != NULL);
|
||||||
const char *p = M_ASSIGN_CAST(const char*,
|
const char *p = M_ASSIGN_CAST(const char*,
|
||||||
strpbrk(string_get_cstr(v1)+start, first_of));
|
strpbrk(string_get_cstr(v1)+start, first_of));
|
||||||
@@ -753,7 +753,7 @@ string_replace (string_t v, const string_t v1, const string_t v2, size_t start)
|
|||||||
return string_replace_str(v, string_get_cstr(v1), string_get_cstr(v2), start);
|
return string_replace_str(v, string_get_cstr(v1), string_get_cstr(v2), start);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace tin the string the sub-string at position 'pos' for 'len' bytes
|
/* Replace in the string the sub-string at position 'pos' for 'len' bytes
|
||||||
into the C string str2. */
|
into the C string str2. */
|
||||||
static inline void
|
static inline void
|
||||||
string_replace_at (string_t v, size_t pos, size_t len, const char str2[])
|
string_replace_at (string_t v, size_t pos, size_t len, const char str2[])
|
||||||
@@ -765,9 +765,9 @@ string_replace_at (string_t v, size_t pos, size_t len, const char str2[])
|
|||||||
const size_t size = string_size(v);
|
const size_t size = string_size(v);
|
||||||
char *ptr;
|
char *ptr;
|
||||||
if (str1_l != str2_l) {
|
if (str1_l != str2_l) {
|
||||||
M_ASSUME (size + str2_l + 1 > str1_l);
|
M_ASSERT_INDEX (str1_l, size + str2_l + 1);
|
||||||
ptr = stringi_fit2size (v, size + str2_l - str1_l + 1);
|
ptr = stringi_fit2size (v, size + str2_l - str1_l + 1);
|
||||||
M_ASSUME (pos + str1_l < size + 1);
|
M_ASSERT_INDEX (pos + str1_l, size + 1);
|
||||||
memmove(&ptr[pos+str2_l], &ptr[pos+str1_l], size - pos - str1_l + 1);
|
memmove(&ptr[pos+str2_l], &ptr[pos+str1_l], size - pos - str1_l + 1);
|
||||||
stringi_set_size(v, size + str2_l - str1_l);
|
stringi_set_size(v, size + str2_l - str1_l);
|
||||||
} else {
|
} else {
|
||||||
@@ -892,7 +892,7 @@ string_fget_word (string_t v, const char separator[], FILE *f)
|
|||||||
int d;
|
int d;
|
||||||
STRINGI_CONTRACT(v);
|
STRINGI_CONTRACT(v);
|
||||||
assert (f != NULL);
|
assert (f != NULL);
|
||||||
assert (1+20+2+strlen(separator)+3 < sizeof buffer);
|
M_ASSERT_INDEX (1+20+2+strlen(separator)+3, sizeof buffer);
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
bool retcode = false;
|
bool retcode = false;
|
||||||
|
|
||||||
@@ -1815,7 +1815,7 @@ namespace m_string {
|
|||||||
M_C(name, _init)(bounded_t s) \
|
M_C(name, _init)(bounded_t s) \
|
||||||
{ \
|
{ \
|
||||||
assert(s != NULL); \
|
assert(s != NULL); \
|
||||||
assert(max_size >= 1); \
|
M_STATIC_ASSERT(max_size >= 1, M_LIB_INTERNAL, "M*LIB: max_size parameter shall be greater than 0."); \
|
||||||
s->s[0] = 0; \
|
s->s[0] = 0; \
|
||||||
s->s[max_size] = 0; \
|
s->s[max_size] = 0; \
|
||||||
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
||||||
@@ -1855,7 +1855,7 @@ namespace m_string {
|
|||||||
M_C(name, _get_char)(const bounded_t s, size_t index) \
|
M_C(name, _get_char)(const bounded_t s, size_t index) \
|
||||||
{ \
|
{ \
|
||||||
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
||||||
assert(index < max_size); \
|
M_ASSERT_INDEX(index, max_size); \
|
||||||
return s->s[index]; \
|
return s->s[index]; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@@ -1906,7 +1906,7 @@ namespace m_string {
|
|||||||
{ \
|
{ \
|
||||||
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
||||||
BOUNDED_STRINGI_CONTRACT(str, max_size); \
|
BOUNDED_STRINGI_CONTRACT(str, max_size); \
|
||||||
assert (offset <= max_size); \
|
M_ASSERT_INDEX (offset, max_size+1); \
|
||||||
M_C(name, _set_strn)(s, str->s+offset, length); \
|
M_C(name, _set_strn)(s, str->s+offset, length); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
@@ -1929,7 +1929,7 @@ namespace m_string {
|
|||||||
{ \
|
{ \
|
||||||
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
||||||
assert (str != NULL); \
|
assert (str != NULL); \
|
||||||
assert (strlen(s->s) <= max_size); \
|
M_ASSERT_INDEX (strlen(s->s), max_size+1); \
|
||||||
m_core_strncat(s->s, str, max_size-strlen(s->s)); \
|
m_core_strncat(s->s, str, max_size-strlen(s->s)); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
|
|||||||
Reference in new issue
Block a user