1. A method for automatically separating data of different data types in a memory of a computer during execution of a software program, the data types comprising a trusted data type and an untrusted data type, the program comprising a set of allocation instructions, the method comprising: for each allocation instruction of the set, performing the following: linking the allocation instruction to at least one data source; generating context information specific to the given allocation instruction; evaluating the at least one data source to determine the data type; and associating the data type with the context information; assigning, in the memory, mutually separated memory regions, comprising: for each of the data types, a memory region for storing any data of the respective data type; and an additional memory region for storing any data which cannot be uniquely assigned to one of the data types, wherein the additional memory region further comprises a memory region for storing any data which cannot be stored in separated memory regions; for each allocation instruction of the set, allocating memory for storing data from the at least one data source, comprising: evaluating the context information specific to the given allocation instruction; and based on the evaluation of the context information, allocating the memory for storing data from the at least one data source in the memory region for storing data of the data type associated with the context information; intercepting a write access to the additional memory region; evaluating the data source for the write access to determine the data type; based on the evaluation of the data source for the write access, assigning the allocation instruction corresponding to the write access to one of the memory regions; and redirecting the write access to the memory region assigned to the allocation instruction; wherein the method further comprises compiling a source code of the program, wherein the source code comprises calls to functions of the program, and at least part of the evaluation is based on the source code as a compile-time evaluation, wherein the compile-time evaluation comprises: for each call, determining the data types of any data to be provided to the memory; for each function determined to comprise a pointer capable of providing untrusted data to the memory, performing a points-to analysis for each pointer of the function pointing to the memory to determine all allocation instructions using the pointer; performing a static value-flow analysis on an output of the points-to analysis to determine a value flow graph of the program; and for each node of the value flow graph, generating the context information by performing a context-sensitive backward traversal.