diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
index 39363cc06dd2044530fa3fd48bbf20958746b4b2..bdbdf4dd6a5c59f1edb46e1c15643acbe2ca9c08 100644
--- a/test/unit/CMakeLists.txt
+++ b/test/unit/CMakeLists.txt
@@ -68,6 +68,7 @@ add_executable(xrow.test xrow.cc unit.c
 target_link_libraries(xrow.test server misc ${MSGPUCK_LIBRARIES})
 
 add_executable(fiber.test fiber.cc unit.c)
+set_source_files_properties(fiber.cc PROPERTIES COMPILE_FLAGS -O0)
 target_link_libraries(fiber.test core)
 
 if (NOT ENABLE_GCOV)
diff --git a/test/unit/fiber.cc b/test/unit/fiber.cc
index eee80df6cef152bf30cda9116e79c848e85e3537..2e75e58337481f6aefb016ccab17434493259ec9 100644
--- a/test/unit/fiber.cc
+++ b/test/unit/fiber.cc
@@ -1,6 +1,7 @@
 #include "memory.h"
 #include "fiber.h"
 #include "unit.h"
+#include "trivia/util.h"
 
 static int
 noop_f(va_list ap)
@@ -48,13 +49,14 @@ cancel_dead_f(va_list ap)
 
 static size_t fiber_stack_size_default;
 
-static void
+static void NOINLINE
 stack_expand(void *ptr)
 {
 	char buf[2048];
-	memset(buf, 0, 2048);
-	long int stack_diff = (long int)(buf - (char *)ptr);
-	if (abs(stack_diff) < (long int)fiber_stack_size_default)
+	memset(buf, 0x45, 2048);
+	ptrdiff_t stack_diff = (buf - (char *)ptr);
+	stack_diff = stack_diff >= 0 ? stack_diff : -stack_diff;
+	if (stack_diff < (ptrdiff_t)fiber_stack_size_default)
 		stack_expand(ptr);
 }