Set active Instruction in SimpleWrapper interceptors, strdup, and strtok.
Add tests for using pointers to static data.
Represent static locals as GlobalVariables rather than as Locals. This ensures that they are visible throughout their lifetime, and that each Function call is not shown as having its own copy of the static local.

Also highlight the associated Decl when the user moves the mouse over a GlobalVariable in the graph viewer.
Correctly find prior Instruction events (not just PreInstruction) when using seec-print -E.
Remove strtok() DetectCalls entry because it is handled by an interceptor.
Update interceptor handling to handle indirect calls / bitcasting. This method is similar to using ReplaceAllUsesWith, but does not replace non-Constant uses within the interceptor itself (allowing user-defined interceptors to easily call the original function).
Test use of pointers to string literals.
Get the start address of the owning region when determining the pointer object for a GlobalVariable, rather than simply using the GlobalVariable's runtime address. This handles programs where string literals are merged (i.e. the runtime address for one string literal may be within the region occupied by a larger string literal, and thus is not a valid pointer object).

When adding GlobalVariable runtime addresses to the address->GV lookup, delete smaller intervals that will be completely overriden by a newer GlobalVariable's interval. If two GlobalVariable intervals overlap (i.e. neither completely covers the other) then assert, for now, because our pointer object tracking won't be able to handle this (updates required!).

Fix handling of returning pointer object information to check that the Function's *return* type is a pointer, rather than the Function's type.
Add interceptor alias for __isoc99_scanf -> scanf and __isoc99_fscanf -> fscanf. These all direct to the same implementation of fscanf/scanf, but students shouldn't be using non-standard extensions anyway.
Correct fdopen interceptor to acquire the streams lock on the TraceThreadListener rather than getting a StreamsAccessor directly from the ProcessListener (this was causing the subsequent call to recordStreamOpen() to deadlock).
Remove unnecessary acquisition of StreamsAccessor objects in execl, execlp, and execle.
Ensure that RTValues are assigned when tracing is disabled (by setting the offset to 0 rather than noOffset()).
Set in-memory pointer object information for the initial state of global variables that contain pointers.
Rename TraceProcessListener::dataLayout() to getDataLayout() to bring it in line with ProcessState.
Make getCurrentRuntimeValueAs<uintptr> calculate the value of constant GetElementPtr expressions, if it is able to (i.e. the value of the base pointer is known).

This requires source types to additionally support the method:
  llvm::DataLayout const &getDataLayout();
Correct strtok interceptor to set the returned pointer's target object to match the target object of the string that is being tokenized, rather than using the first argument (which would fail when the first argument was NULL).

Add a simple test for printing the strings returned by strtok.
Update comments in strtok interceptor.
Revisit the size Expr of all VariableArrayType nodes when mapping Clang ASTs, because we sometimes did not see the size Expr as it appears in the final AST.
Simply ignore null Values on LocalState and ParamState objects.
Some work towards supporting arrays with variably sized element types.

Add the option to pass a seec::trace::FunctionState to getValue() for in-memory values, defining the function that "owns" the value (e.g. the function that a local or parameter is contained in).

Store a reference to the seec_clang::MappedModule on ValueStoreImpl, so that it can be used within associated Values.

Attempt to caculate the size of variable length array element types when creating new in-memory array Values (ValueByMemoryForArray), by getting the runtime value of each VariableArrayType's size Expr.