34 #include <gtest/gtest.h>
38 std::string
env(
const char* n) {
const char* v = getenv(n);
return v ? v :
""; }
40 std::string r =
env(
"CCTLIB_ROOT");
41 return r.empty() ?
"../.." : r;
50 const std::vector<std::string>& toolArgs,
51 const std::string& victim,
52 std::string* stderrOut) {
53 std::string pin =
pin_root() +
"/pin";
54 std::vector<char*> argv;
55 argv.push_back(
const_cast<char*
>(pin.c_str()));
56 argv.push_back(
const_cast<char*
>(
"-t"));
57 argv.push_back(
const_cast<char*
>(tool.c_str()));
58 for (
auto&
a : toolArgs) argv.push_back(
const_cast<char*
>(
a.c_str()));
59 argv.push_back(
const_cast<char*
>(
"--"));
60 argv.push_back(
const_cast<char*
>(victim.c_str()));
61 argv.push_back(
nullptr);
63 char errPath[] =
"/tmp/cct_shape_stderr_XXXXXX";
64 int errFd = mkstemp(errPath);
65 if (errFd < 0)
return -1;
68 if (pid < 0) { close(errFd);
return -1; }
70 int devnull = open(
"/dev/null", O_WRONLY);
71 if (devnull >= 0) { dup2(devnull, 1); close(devnull); }
72 dup2(errFd, 2); close(errFd);
73 execv(pin.c_str(), argv.data());
77 if (waitpid(pid, &
status, 0) < 0) { close(errFd); unlink(errPath);
return -1; }
80 lseek(errFd, 0, SEEK_SET);
84 while ((n = read(errFd,
buf,
sizeof(
buf))) > 0) {
85 stderrOut->append(
buf, n);
92 return -128 - WTERMSIG(
status);
102 {
"rec_multi_direct" },
103 {
"rec_indirect_only" },
104 {
"rec_mixed_direct_indirect" },
107 {
"rec_baseline_nonrec" },
115 ASSERT_FALSE(
pin_root().empty()) <<
"PIN_ROOT required";
116 ASSERT_EQ(0, chdir(root_.c_str())) <<
"chdir(" << root_ <<
") failed";
121 const auto& v = GetParam();
122 std::string tool = root_ +
"/clients/obj-intel64/cct_shape_check.so";
123 std::string victim = root_ +
"/tests/gtest/obj/apps/recursion/" + v.name;
124 ASSERT_EQ(0, access(tool.c_str(), F_OK)) << tool <<
" missing";
125 ASSERT_EQ(0, access(victim.c_str(), F_OK)) << victim <<
" missing";
130 <<
"victim=" << v.name <<
" rc=" << rc
131 <<
"\n---- cct_shape_check stderr ----\n" << errText
132 <<
"---- end stderr ----";
138 [](
const testing::TestParamInfo<RecursionShape::ParamType>& info) {
139 return std::string(info.param.name);
static uint64_t buf[ITERS]
std::string cctlib_root()
INSTANTIATE_TEST_SUITE_P(Victims, RecursionShape, ::testing::ValuesIn(kVictims), [](const testing::TestParamInfo< RecursionShape::ParamType > &info) { return std::string(info.param.name);})
const VictimSpec kVictims[]
int run_pin_capture(const std::string &tool, const std::vector< std::string > &toolArgs, const std::string &victim, std::string *stderrOut)
std::string env(const char *n)
TEST_P(RecursionShape, CctShapeAssertionsPass)