Newer
Older
// SPDX-License-Identifier: LGPL-3.0-or-later
// Copyright © 2022 Florian Fischer
#include <array>

Florian Schmaus
committed
#include <cstdint>
#include <cstdlib>

Florian Schmaus
committed
#include <iostream>

Florian Schmaus
committed
#include "Runtime.hpp"

Florian Schmaus
committed
static auto recur(uintptr_t depth, int val) -> int {
if (depth == UINTPTR_MAX) return val;

Florian Schmaus
committed
constexpr size_t stack_user_size = 1024;
std::array<int, stack_user_size> stack_user;
for (int& i : stack_user) {
// NOLINTNEXTLINE(cert-msc32-c,cert-msc51-cpp)
i = rand();

Florian Schmaus
committed
int res = recur(depth + 1, stack_user[stack_user_size - 1]);
for (int i : stack_user) {
res += i;

Florian Schmaus
committed
return res;
}
void emperTest() {
// This test should exit(EXIT_SUCCESS) if EMPER successfully
// detected a stack guard-page hit.
Runtime::setGuardPageTouchCausesExitSuccess();

Florian Schmaus
committed
int res = recur(0, 0);
// This should never return a result.
std::cerr << "ERROR: Got result: " << res;
// This should never be reached, instead the guard page should have been hit.
exit(EXIT_FAILURE);