Index: src/Common/DebugMalloc.cc
===================================================================
--- src/Common/DebugMalloc.cc	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
+++ src/Common/DebugMalloc.cc	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
@@ -0,0 +1,71 @@
+#if 0
+#include <dlfcn.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+bool recursion = false;
+
+static char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+static union {
+    void *addr;
+    unsigned char bytes[sizeof(void *)];
+};
+
+struct Mallocmsg {
+    const char start[9];
+    char addr[16];
+    const char sep[3];
+    char size[16];
+    const char end[1];
+} mallocmsg = {
+    'm', 'a', 'l', 'l', 'o', 'c', ' ', '0', 'x',
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ' ', '0', 'x',
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    '\n'
+};
+
+void * malloc( size_t size ) {
+    if ( recursion ) { write( STDERR_FILENO, "recursion\n", 10 ); abort(); }
+    recursion = true;
+    __typeof__( ::malloc ) *libc_malloc = (__typeof__( ::malloc ) *)dlsym(RTLD_NEXT, "malloc");
+    addr = (void *)size;
+    for ( int i = 0, j = 7; i < 16; i += 2, j -= 1 ) {
+    	mallocmsg.size[i] = hex[bytes[j] >> 4];
+    	mallocmsg.size[i + 1] = hex[bytes[j] & 0x0f];
+    } // for
+    addr = libc_malloc( size );
+    for ( int i = 0, j = 7; i < 16; i += 2, j -= 1 ) {
+	mallocmsg.addr[i] = hex[bytes[j] >> 4];
+	mallocmsg.addr[i + 1] = hex[bytes[j] & 0x0f];
+    } // for
+    write( STDERR_FILENO, &mallocmsg, sizeof(mallocmsg) );
+    recursion = false;
+    return addr;
+}
+
+struct Freemsg {
+    const char start[7];
+    char addr[16];
+    const char end[1];
+} freemsg = {
+    'f', 'r', 'e', 'e', ' ', '0', 'x',
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    '\n'
+};
+
+void free( void * x ) {
+    if ( recursion ) { write( STDERR_FILENO, "recursion\n", 10 ); abort(); }
+    recursion = true;
+    __typeof__( ::free ) *libc_free = (__typeof__( ::free ) *)dlsym(RTLD_NEXT, "free");
+    addr = x;
+    for ( int i = 0, j = 7; i < 16; i += 2, j -= 1 ) {
+	freemsg.addr[i] = hex[bytes[j] >> 4];
+	freemsg.addr[i + 1] = hex[bytes[j] & 0x0f];
+    } // for
+    write( STDERR_FILENO, &freemsg, sizeof(freemsg) );
+    recursion = false;
+    libc_free( addr );
+}
+#endif // 0
Index: src/Common/SemanticError.h
===================================================================
--- src/Common/SemanticError.h	(revision 3b5e3aa51253132ef5997e89adcb625c6e88b6ae)
+++ src/Common/SemanticError.h	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  8 14:38:53 2015
-// Update Count     : 4
+// Last Modified On : Sat Sep 24 15:13:42 2016
+// Update Count     : 5
 //
 
@@ -46,5 +46,4 @@
 }
 
-
 #endif // SEMANTICERROR_H
 
Index: src/Common/module.mk
===================================================================
--- src/Common/module.mk	(revision 3b5e3aa51253132ef5997e89adcb625c6e88b6ae)
+++ src/Common/module.mk	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
@@ -11,9 +11,10 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Thu Aug 18 13:29:04 2016
-## Update Count     : 2
+## Last Modified On : Tue Sep 27 11:06:38 2016
+## Update Count     : 4
 ###############################################################################
 
 SRC += Common/SemanticError.cc \
        Common/UniqueName.cc \
+       Common/DebugMalloc.cc \
        Common/Assert.cc
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 3b5e3aa51253132ef5997e89adcb625c6e88b6ae)
+++ src/Makefile.am	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:51:46 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Sat Aug 20 11:13:12 2016
-## Update Count     : 71
+## Last Modified On : Sat Sep 24 15:03:52 2016
+## Update Count     : 73
 ###############################################################################
 
@@ -40,5 +40,5 @@
 cfa_cpplib_PROGRAMS = driver/cfa-cpp
 driver_cfa_cpp_SOURCES = ${SRC}
-driver_cfa_cpp_LDADD = ${LEXLIB}			# yywrap
+driver_cfa_cpp_LDADD = ${LEXLIB} -ldl			# yywrap
 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -rdynamic -I${abs_top_srcdir}/src/include
 
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 3b5e3aa51253132ef5997e89adcb625c6e88b6ae)
+++ src/Makefile.in	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
@@ -98,4 +98,5 @@
 	Common/driver_cfa_cpp-SemanticError.$(OBJEXT) \
 	Common/driver_cfa_cpp-UniqueName.$(OBJEXT) \
+	Common/driver_cfa_cpp-Interpose.$(OBJEXT) \
 	Common/driver_cfa_cpp-Assert.$(OBJEXT) \
 	ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) \
@@ -359,5 +360,6 @@
 	CodeGen/CodeGenerator.cc CodeGen/GenType.cc \
 	CodeGen/FixNames.cc CodeGen/OperatorTable.cc \
-	Common/SemanticError.cc Common/UniqueName.cc Common/Assert.cc \
+	Common/SemanticError.cc Common/UniqueName.cc \
+	Common/Interpose.cc Common/Assert.cc \
 	ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \
 	ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \
@@ -414,5 +416,5 @@
 cfa_cpplibdir = ${libdir}
 driver_cfa_cpp_SOURCES = ${SRC}
-driver_cfa_cpp_LDADD = ${LEXLIB}			# yywrap
+driver_cfa_cpp_LDADD = ${LEXLIB} -ldl			# yywrap
 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -rdynamic -I${abs_top_srcdir}/src/include
 all: $(BUILT_SOURCES)
@@ -514,4 +516,6 @@
 	Common/$(DEPDIR)/$(am__dirstamp)
 Common/driver_cfa_cpp-UniqueName.$(OBJEXT): Common/$(am__dirstamp) \
+	Common/$(DEPDIR)/$(am__dirstamp)
+Common/driver_cfa_cpp-Interpose.$(OBJEXT): Common/$(am__dirstamp) \
 	Common/$(DEPDIR)/$(am__dirstamp)
 Common/driver_cfa_cpp-Assert.$(OBJEXT): Common/$(am__dirstamp) \
@@ -789,4 +793,5 @@
 	-rm -f CodeGen/driver_cfa_cpp-OperatorTable.$(OBJEXT)
 	-rm -f Common/driver_cfa_cpp-Assert.$(OBJEXT)
+	-rm -f Common/driver_cfa_cpp-Interpose.$(OBJEXT)
 	-rm -f Common/driver_cfa_cpp-SemanticError.$(OBJEXT)
 	-rm -f Common/driver_cfa_cpp-UniqueName.$(OBJEXT)
@@ -895,4 +900,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@CodeGen/$(DEPDIR)/driver_cfa_cpp-OperatorTable.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Assert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Interpose.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-SemanticError.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-UniqueName.Po@am__quote@
@@ -1132,4 +1138,18 @@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-UniqueName.obj `if test -f 'Common/UniqueName.cc'; then $(CYGPATH_W) 'Common/UniqueName.cc'; else $(CYGPATH_W) '$(srcdir)/Common/UniqueName.cc'; fi`
 
+Common/driver_cfa_cpp-Interpose.o: Common/Interpose.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Common/driver_cfa_cpp-Interpose.o -MD -MP -MF Common/$(DEPDIR)/driver_cfa_cpp-Interpose.Tpo -c -o Common/driver_cfa_cpp-Interpose.o `test -f 'Common/Interpose.cc' || echo '$(srcdir)/'`Common/Interpose.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) Common/$(DEPDIR)/driver_cfa_cpp-Interpose.Tpo Common/$(DEPDIR)/driver_cfa_cpp-Interpose.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='Common/Interpose.cc' object='Common/driver_cfa_cpp-Interpose.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Interpose.o `test -f 'Common/Interpose.cc' || echo '$(srcdir)/'`Common/Interpose.cc
+
+Common/driver_cfa_cpp-Interpose.obj: Common/Interpose.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Common/driver_cfa_cpp-Interpose.obj -MD -MP -MF Common/$(DEPDIR)/driver_cfa_cpp-Interpose.Tpo -c -o Common/driver_cfa_cpp-Interpose.obj `if test -f 'Common/Interpose.cc'; then $(CYGPATH_W) 'Common/Interpose.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Interpose.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) Common/$(DEPDIR)/driver_cfa_cpp-Interpose.Tpo Common/$(DEPDIR)/driver_cfa_cpp-Interpose.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='Common/Interpose.cc' object='Common/driver_cfa_cpp-Interpose.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Interpose.obj `if test -f 'Common/Interpose.cc'; then $(CYGPATH_W) 'Common/Interpose.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Interpose.cc'; fi`
+
 Common/driver_cfa_cpp-Assert.o: Common/Assert.cc
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Common/driver_cfa_cpp-Assert.o -MD -MP -MF Common/$(DEPDIR)/driver_cfa_cpp-Assert.Tpo -c -o Common/driver_cfa_cpp-Assert.o `test -f 'Common/Assert.cc' || echo '$(srcdir)/'`Common/Assert.cc
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 3b5e3aa51253132ef5997e89adcb625c6e88b6ae)
+++ src/Parser/DeclarationNode.cc	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Sep 24 11:12:52 2016
-// Update Count     : 627
+// Last Modified On : Mon Sep 26 22:18:40 2016
+// Update Count     : 640
 //
 
@@ -92,6 +92,6 @@
 
 	newnode->variable.name = variable.name ? new string( *variable.name ) : nullptr;
+	newnode->variable.tyClass = variable.tyClass;
 	newnode->variable.assertions = maybeClone( variable.assertions );
-	newnode->variable.tyClass = variable.tyClass;
 
 	newnode->attr.name = attr.name ? new string( *attr.name ) : nullptr;
@@ -148,8 +148,7 @@
 }
 
-DeclarationNode * DeclarationNode::newFunction( std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body, bool newStyle ) {
+DeclarationNode * DeclarationNode::newFunction( string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body, bool newStyle ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->name = name;
-
 	newnode->type = new TypeData( TypeData::Function );
 	newnode->type->function.params = param;
@@ -222,8 +221,8 @@
 } // DeclarationNode::newLength
 
-DeclarationNode * DeclarationNode::newFromTypedef( std::string * name ) {
+DeclarationNode * DeclarationNode::newFromTypedef( string * name ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::SymbolicInst );
-	newnode->type->symbolic.name = name ? new string( *name ) : nullptr;
+	newnode->type->symbolic.name = name;
 	newnode->type->symbolic.isTypedef = true;
 	newnode->type->symbolic.params = nullptr;
@@ -231,10 +230,10 @@
 } // DeclarationNode::newFromTypedef
 
-DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
+DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Aggregate );
 	newnode->type->aggregate.kind = kind;
 	if ( name ) {
-		newnode->type->aggregate.name = new string( *name );
+		newnode->type->aggregate.name = name;
 	} else {											// anonymous aggregate ?
 		newnode->type->aggregate.name = new string( anonymous.newName() );
@@ -246,10 +245,9 @@
 } // DeclarationNode::newAggregate
 
-DeclarationNode * DeclarationNode::newEnum( std::string * name, DeclarationNode * constants ) {
-	DeclarationNode * newnode = new DeclarationNode;
-	newnode->name = name;
+DeclarationNode * DeclarationNode::newEnum( string * name, DeclarationNode * constants ) {
+	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Enum );
 	if ( name ) {
-		newnode->type->enumeration.name = new string( *name );
+		newnode->type->enumeration.name = name;
 	} else {											// anonymous aggregate ?
 		newnode->type->enumeration.name = new string( anonymous.newName() );
@@ -259,5 +257,5 @@
 } // DeclarationNode::newEnum
 
-DeclarationNode * DeclarationNode::newEnumConstant( std::string * name, ExpressionNode * constant ) {
+DeclarationNode * DeclarationNode::newEnumConstant( string * name, ExpressionNode * constant ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->name = name;
@@ -267,5 +265,5 @@
 } // DeclarationNode::newEnumConstant
 
-DeclarationNode * DeclarationNode::newName( std::string * name ) {
+DeclarationNode * DeclarationNode::newName( string * name ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->name = name;
@@ -273,8 +271,8 @@
 } // DeclarationNode::newName
 
-DeclarationNode * DeclarationNode::newFromTypeGen( std::string * name, ExpressionNode * params ) {
+DeclarationNode * DeclarationNode::newFromTypeGen( string * name, ExpressionNode * params ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::SymbolicInst );
-	newnode->type->symbolic.name = name ? new string( *name ) : nullptr;
+	newnode->type->symbolic.name = name;
 	newnode->type->symbolic.isTypedef = false;
 	newnode->type->symbolic.actuals = params;
@@ -282,15 +280,13 @@
 } // DeclarationNode::newFromTypeGen
 
-DeclarationNode * DeclarationNode::newTypeParam( TypeClass tc, std::string * name ) {
-	DeclarationNode * newnode = new DeclarationNode;
-	newnode->name = name;
-//	newnode->type = new TypeData( TypeData::Variable );
+DeclarationNode * DeclarationNode::newTypeParam( TypeClass tc, string * name ) {
+	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = nullptr;
 	newnode->variable.tyClass = tc;
-	newnode->variable.name = newnode->name ? new string( *newnode->name ) : nullptr;
+	newnode->variable.name = name;
 	return newnode;
 } // DeclarationNode::newTypeParam
 
-DeclarationNode * DeclarationNode::newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts ) {
+DeclarationNode * DeclarationNode::newTrait( const string * name, DeclarationNode * params, DeclarationNode * asserts ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Aggregate );
@@ -302,5 +298,5 @@
 } // DeclarationNode::newTrait
 
-DeclarationNode * DeclarationNode::newTraitUse( const std::string * name, ExpressionNode * params ) {
+DeclarationNode * DeclarationNode::newTraitUse( const string * name, ExpressionNode * params ) {
 	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::AggregateInst );
@@ -312,11 +308,10 @@
 } // DeclarationNode::newTraitUse
 
-DeclarationNode * DeclarationNode::newTypeDecl( std::string * name, DeclarationNode * typeParams ) {
-	DeclarationNode * newnode = new DeclarationNode;
-	newnode->name = name;
+DeclarationNode * DeclarationNode::newTypeDecl( string * name, DeclarationNode * typeParams ) {
+	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = new TypeData( TypeData::Symbolic );
 	newnode->type->symbolic.isTypedef = false;
 	newnode->type->symbolic.params = typeParams;
-	newnode->type->symbolic.name = newnode->name;
+	newnode->type->symbolic.name = name;
 	return newnode;
 } // DeclarationNode::newTypeDecl
@@ -377,7 +372,6 @@
 } // DeclarationNode::newBuiltinType
 
-DeclarationNode * DeclarationNode::newAttr( std::string * name, ExpressionNode * expr ) {
-	DeclarationNode * newnode = new DeclarationNode;
-//	newnode->type = new TypeData( TypeData::Attr );
+DeclarationNode * DeclarationNode::newAttr( string * name, ExpressionNode * expr ) {
+	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = nullptr;
 	newnode->attr.name = name;
@@ -386,7 +380,6 @@
 }
 
-DeclarationNode * DeclarationNode::newAttr( std::string * name, DeclarationNode * type ) {
-	DeclarationNode * newnode = new DeclarationNode;
-//	newnode->type = new TypeData( TypeData::Attr );
+DeclarationNode * DeclarationNode::newAttr( string * name, DeclarationNode * type ) {
+	DeclarationNode * newnode = new DeclarationNode;
 	newnode->type = nullptr;
 	newnode->attr.name = name;
@@ -520,15 +513,15 @@
 					dst->basictype = src->basictype;
 				} else if ( src->basictype != DeclarationNode::NoBasicType )
-					throw SemanticError( std::string( "conflicting type specifier " ) + DeclarationNode::basicTypeName[ src->basictype ] + " in type: ", src );
+					throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::basicTypeName[ src->basictype ] + " in type: ", src );
 
 				if ( dst->complextype == DeclarationNode::NoComplexType ) {
 					dst->complextype = src->complextype;
 				} else if ( src->complextype != DeclarationNode::NoComplexType )
-					throw SemanticError( std::string( "conflicting type specifier " ) + DeclarationNode::complexTypeName[ src->complextype ] + " in type: ", src );
+					throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::complexTypeName[ src->complextype ] + " in type: ", src );
 
 				if ( dst->signedness == DeclarationNode::NoSignedness ) {
 					dst->signedness = src->signedness;
 				} else if ( src->signedness != DeclarationNode::NoSignedness )
-					throw SemanticError( std::string( "conflicting type specifier " ) + DeclarationNode::signednessName[ src->signedness ] + " in type: ", src );
+					throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::signednessName[ src->signedness ] + " in type: ", src );
 
 				if ( dst->length == DeclarationNode::NoLength ) {
@@ -537,5 +530,5 @@
 					dst->length = DeclarationNode::LongLong;
 				} else if ( src->length != DeclarationNode::NoLength )
-					throw SemanticError( std::string( "conflicting type specifier " ) + DeclarationNode::lengthName[ src->length ] + " in type: ", src );
+					throw SemanticError( string( "conflicting type specifier " ) + DeclarationNode::lengthName[ src->length ] + " in type: ", src );
 			} // if
 			break;
@@ -643,5 +636,5 @@
 }
 
-DeclarationNode * DeclarationNode::addName( std::string * newname ) {
+DeclarationNode * DeclarationNode::addName( string * newname ) {
 	assert( ! name );
 	name = newname;
Index: src/libcfa/memcheck.awk
===================================================================
--- src/libcfa/memcheck.awk	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
+++ src/libcfa/memcheck.awk	(revision fb114fa1d887767d09a2bcdf85b3046939ea4791)
@@ -0,0 +1,26 @@
+#!/usr/bin/nawk -f
+
+BEGIN {
+	print "Freed but not allocated:"
+}
+
+/malloc/ {
+	alloc[ $2 ] = $3;
+}
+
+/free/ {
+	if ( $2 in alloc ) {
+		delete alloc[ $2 ];
+	} else {
+		print $2;
+	} # if
+}
+
+END {
+	print "Allocated but not freed:"
+	for ( i in alloc ) {
+		print i, alloc[ i ];
+		total += alloc[ i ]
+	} # for
+	print "total", total;
+}
