You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.7 KiB

/*
* Copyright 2002-2019 Intel Corporation.
*
* This software is provided to you as Sample Source Code as defined in the accompanying
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
* section 1.L.
*
* This software and the related documents are provided as is, with no express or implied
* warranties, other than those that are expressly stated in the License.
*/
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <assert.h>
#include "pin.H"
using std::string;
// This PIN tool shall check PIN's memory limit knob
//
#define ALLOC_CHUNK 0x10000
/* ===================================================================== */
/* Commandline Switches */
/* ===================================================================== */
//Output file where to write everything
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool",
"o", "memory_limit.out", "specify output file name");
//have memory addresses within that region
KNOB<ADDRINT> KnobBytesToAllocate(KNOB_MODE_WRITEONCE, "pintool",
"b", "0x10000", "Number of bytes to allocate");
/* ===================================================================== */
/* Globals */
/* ===================================================================== */
//Output file
FILE * out;
VOID OutOfMemory(size_t sz, VOID* arg)
{
fprintf(out, "Failed to allocate dynamic memory: Out of memory!\n");
fclose(out);
exit(3);
}
VOID* AllocateAndCheck(long size)
{
void* p = malloc((size_t)size);
if (NULL == p)
{
fprintf(out, "Failed to allocate dynamic memory with size %lx.\n", size);
fclose(out);
exit(1);
}
return p;
}
// This function allocates number of bytes specified by the -b knobs.
// The bytes are allocated in chunks of size ALLOC_CHUNK.
VOID AppStart(VOID *v)
{
fprintf(out, "Allocating total %lx bytes.\n", (long)KnobBytesToAllocate.Value());
long count = (long)KnobBytesToAllocate.Value() / ALLOC_CHUNK;
long remainder = (long)KnobBytesToAllocate.Value() % ALLOC_CHUNK;
for (long i = 0; i < count; i++)
{
void* p = AllocateAndCheck(ALLOC_CHUNK);
fprintf(out, "Iteration %lx, returned: %p\n", i, p);
}
if (remainder > 0)
{
void* p = AllocateAndCheck(remainder);
fprintf(out, "Last iteration, returned: %p\n", p);
}
fprintf(out, "Test unexpectedly passed (it should fail).\n");
fclose(out);
}
int main(int argc, char * argv[])
{
PIN_InitSymbols();
PIN_Init(argc, argv);
out = fopen(KnobOutputFile.Value().c_str(), "w");
PIN_AddOutOfMemoryFunction(OutOfMemory, NULL);
PIN_AddApplicationStartFunction(AppStart, 0);
// Never returns
PIN_StartProgram();
return 0;
}