expr.utf8 = mode.utf8; /* utf8 may be set by parse() */
- if (expr.utf8 && !isValidUtf8(expression)) {
+ const size_t len = strlen(expression);
+ if (expr.utf8 && !isValidUtf8(expression, len)) {
throw ParseError("Expression is not valid UTF-8.");
}
return true;
}
-bool isValidUtf8(const char *expression) {
+bool isValidUtf8(const char *expression, const size_t len) {
if (!expression) {
return true;
}
- const size_t len = strlen(expression);
const u8 *s = (const u8 *)expression;
u32 val;
#ifndef PARSER_UTF8_VALIDATE_H
#define PARSER_UTF8_VALIDATE_H
+#include <cstddef> // size_t
+
namespace ue2 {
/** \brief Validate that the given expression is well-formed UTF-8. */
-bool isValidUtf8(const char *expression);
+bool isValidUtf8(const char *expression, const size_t len);
} // namespace ue2
// is undefined.
if (utf8) {
auto is_invalid_utf8 = [](const Corpus &corpus) {
- return !isValidUtf8(corpus.data.c_str());
+ return !isValidUtf8(corpus.data.c_str(), corpus.data.size());
};
c.erase(remove_if(begin(c), end(c), is_invalid_utf8), end(c));
}
TEST_P(ValidUtf8Test, check) {
const auto &info = GetParam();
SCOPED_TRACE(testing::Message() << "String is: " << printable(info.str));
- ASSERT_EQ(info.is_valid, isValidUtf8(info.str.c_str()));
+ ASSERT_EQ(info.is_valid, isValidUtf8(info.str.c_str(), info.str.size()));
}