From 28665145704c47a6f2be3cf137b3ee4eb9305b99 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 26 Dec 2015 20:32:31 +0000 Subject: [PATCH] [CRT_APITEST] Add another test for strlen, that tests, whether the direction flag in ELFAGS has been modified. While clearing it is legitimate to do according to the ABI, the native implementation does not change it, so we don't want to do it either. svn path=/trunk/; revision=70429 --- rostests/apitests/crt/strlen.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) 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)