* Fix BOUNDED_STRING_CTE macro. In OOR context, it may create invalid constant that triggers
assumption fault. * Fix _equal_p in OOR context for bounded string. This method can be called in OOR context, so the contracts may not be verified.
This commit is contained in:
1 parent
6d9b61c119
commit
78ba83ce42
1 file changed
+28
-9
+28
-9
@@ -1358,12 +1358,13 @@ namespace m_string {
|
|||||||
|
|
||||||
#define BOUNDED_STRINGI_CONTRACT(var, max_size) do { \
|
#define BOUNDED_STRINGI_CONTRACT(var, max_size) do { \
|
||||||
assert(var != NULL); \
|
assert(var != NULL); \
|
||||||
/* Not true with BOUNDED_STRING_CTE macro. See what can be done */ \
|
assert(var->s[max_size] == 0); \
|
||||||
/* assert(var->s[max_size] == 0); */ \
|
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define BOUNDED_STRING_DEF(name, max_size) \
|
#define BOUNDED_STRING_DEF(name, max_size) \
|
||||||
\
|
\
|
||||||
|
typedef char M_C(name, _array_t)[max_size+1]; \
|
||||||
|
\
|
||||||
typedef struct M_C(name, _s) { \
|
typedef struct M_C(name, _s) { \
|
||||||
char s[max_size+1]; \
|
char s[max_size+1]; \
|
||||||
} M_C(name,_t)[1]; \
|
} M_C(name,_t)[1]; \
|
||||||
@@ -1513,7 +1514,7 @@ namespace m_string {
|
|||||||
return strcmp(s->s, str->s); \
|
return strcmp(s->s, str->s); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline int \
|
static inline bool \
|
||||||
M_C(name, _equal_str_p)(const M_C(name,_t) s, const char str[]) \
|
M_C(name, _equal_str_p)(const M_C(name,_t) s, const char str[]) \
|
||||||
{ \
|
{ \
|
||||||
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
||||||
@@ -1521,12 +1522,11 @@ namespace m_string {
|
|||||||
return strcmp(s->s, str) == 0; \
|
return strcmp(s->s, str) == 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline int \
|
static inline bool \
|
||||||
M_C(name, _equal_p)(const M_C(name,_t) s, const M_C(name,_t) str) \
|
M_C(name, _equal_p)(const M_C(name,_t) s, const M_C(name,_t) str) \
|
||||||
{ \
|
{ \
|
||||||
BOUNDED_STRINGI_CONTRACT(s, max_size); \
|
/* _equal_p may be called in context OOR. So contract cannot be verified */ \
|
||||||
BOUNDED_STRINGI_CONTRACT(str, max_size); \
|
return (s->s[max_size] == str->s[max_size]) & (strcmp(s->s, str->s) == 0); \
|
||||||
return strcmp(s->s, str->s) == 0; \
|
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline int \
|
static inline int \
|
||||||
@@ -1675,7 +1675,26 @@ namespace m_string {
|
|||||||
|
|
||||||
/* Init a constant bounded string.
|
/* Init a constant bounded string.
|
||||||
Try to do a clean cast */
|
Try to do a clean cast */
|
||||||
#define BOUNDED_STRING_CTE(name, string) \
|
/* Use of Compound Literals to init a constant string.
|
||||||
((const struct M_C(name, _s) *)M_ASSIGN_CAST(const char*, string))
|
See above */
|
||||||
|
#ifndef __cplusplus
|
||||||
|
#define BOUNDED_STRING_CTE(name, string) \
|
||||||
|
((const struct M_C(name, _s) *)((M_C(name, _array_t)){string}))
|
||||||
|
#else
|
||||||
|
namespace m_string {
|
||||||
|
template <int N>
|
||||||
|
struct m_bounded_string {
|
||||||
|
char s[N];
|
||||||
|
inline m_bounded_string(const char lstr[])
|
||||||
|
{
|
||||||
|
memset(this->s, 0, N);
|
||||||
|
strncpy(this->s, lstr, N-1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#define BOUNDED_STRING_CTE(name, string) \
|
||||||
|
((const struct M_C(name, _s) *)(m_string::m_bounded_string<sizeof (M_C(name, _t))>(string).s))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in new issue
Block a user