Add mj_markStack and mj_freeStack as public API functions.
Also add asan instrumentation to detect stack frame leakages (i.e. `mj_markStack` without a corresponding `mj_freeStack` in the same caller function). PiperOrigin-RevId: 562625645 Change-Id: I4e3ff66ca0b9d08ed0a95cef45393db8e3053e22
This commit is contained in:
committed by
Copybara-Service
parent
9308e1d383
commit
94a8705ad0
@@ -15,12 +15,23 @@
|
||||
#ifndef MUJOCO_TEST_FIXTURE_H_
|
||||
#define MUJOCO_TEST_FIXTURE_H_
|
||||
|
||||
#include <csetjmp>
|
||||
#include <cstring>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <absl/strings/string_view.h>
|
||||
#include <mujoco/mjdata.h>
|
||||
#include <mujoco/mjmodel.h>
|
||||
#include <mujoco/mujoco.h>
|
||||
|
||||
extern "C" {
|
||||
MJAPI void _mjPRIVATE__set_tls_error_fn(decltype(mju_user_error));
|
||||
MJAPI decltype(mju_user_error) _mjPRIVATE__get_tls_error_fn();
|
||||
}
|
||||
|
||||
namespace mujoco {
|
||||
|
||||
// Installs and uninstalls error callbacks on MuJoCo that fail the currently
|
||||
@@ -44,6 +55,30 @@ class MujocoTest : public ::testing::Test {
|
||||
MujocoErrorTestGuard error_guard;
|
||||
};
|
||||
|
||||
template <typename Return, typename... Args>
|
||||
auto MjuErrorMessageFrom(Return (*func)(Args...)) {
|
||||
thread_local std::jmp_buf current_jmp_buf;
|
||||
thread_local char err_msg[1000];
|
||||
|
||||
auto* old_error_handler = _mjPRIVATE__get_tls_error_fn();
|
||||
auto* new_error_handler = +[](const char* msg) -> void {
|
||||
std::strncpy(err_msg, msg, sizeof(err_msg));
|
||||
std::longjmp(current_jmp_buf, 1);
|
||||
};
|
||||
|
||||
return [func, old_error_handler,
|
||||
new_error_handler](Args... args) -> std::string {
|
||||
if (setjmp(current_jmp_buf) == 0) {
|
||||
err_msg[0] = '\0';
|
||||
_mjPRIVATE__set_tls_error_fn(new_error_handler);
|
||||
func(args...);
|
||||
}
|
||||
|
||||
_mjPRIVATE__set_tls_error_fn(old_error_handler);
|
||||
return err_msg;
|
||||
};
|
||||
}
|
||||
|
||||
// Returns a path to a data file, under the mujoco/test directory.
|
||||
const std::string GetTestDataFilePath(absl::string_view path);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user