diff --git a/rostests/apitests/crt/strlen.c b/rostests/apitests/crt/strlen.c index ed88c048ec6..84345c16127 100644 --- a/rostests/apitests/crt/strlen.c +++ b/rostests/apitests/crt/strlen.c @@ -23,12 +23,18 @@ GCC_builtin_strlen(const char *str) } #endif +#define EFLAGS_DF 0x400L + typedef size_t (*PFN_STRLEN)(const char *); void Test_strlen(PFN_STRLEN pstrlen) { size_t len; +#if defined(_M_IX86) || defined(_M_AMD64) + volatile uintptr_t eflags; + char *teststr = "a\0bcdefghijk"; +#endif /* basic parameter tests */ StartSeh() @@ -37,6 +43,21 @@ Test_strlen(PFN_STRLEN pstrlen) (void)len; ok_int((int)pstrlen("test"), 4); + +#if defined(_M_IX86) || defined(_M_AMD64) + eflags = __readeflags(); + __writeeflags(eflags | EFLAGS_DF); + len = pstrlen(teststr + 4); + eflags = __readeflags(); + ok((eflags & EFLAGS_DF) != 0, "Direction flag in ELFAGS was changed."); + + /* Only test this for the exported versions, intrinsics might do it + differently. It's up to us to not do fishy stuff! */ + if (pstrlen == strlen) + { + ok(len == 8, "Should not have gone backwards (got len %i)", (int)len); + } +#endif } START_TEST(strlen)