if take address of local, move to heap.
heuristic to not print bogus strings.
fix one error message format.

R=ken
OCL=23849
CL=23851
diff --git a/src/runtime/string.c b/src/runtime/string.c
index b31e7cc..e708d02 100644
--- a/src/runtime/string.c
+++ b/src/runtime/string.c
@@ -17,6 +17,20 @@
 	return l;
 }
 
+int32 maxstring;
+
+string
+gostringsize(int32 l)
+{
+	string s;
+
+	s = mal(sizeof(s->len)+l+1);
+	s->len = l;
+	if(l > maxstring)
+		maxstring = l;
+	return s;
+}
+
 string
 gostring(byte *str)
 {
@@ -24,8 +38,7 @@
 	string s;
 
 	l = findnull(str);
-	s = mal(sizeof(s->len)+l+1);
-	s->len = l;
+	s = gostringsize(l);
 	mcpy(s->str, str, l+1);
 	return s;
 }
@@ -46,8 +59,7 @@
 
 	l = s1->len + s2->len;
 
-	s3 = mal(sizeof(s3->len)+l);
-	s3->len = l;
+	s3 = gostringsize(l);
 	mcpy(s3->str, s1->str, s1->len);
 	mcpy(s3->str+s1->len, s2->str, s2->len);
 
@@ -139,8 +151,7 @@
 	}
 
 	l = hindex-lindex;
-	so = mal(sizeof(so->len)+l);
-	so->len = l;
+	so = gostringsize(l);
 	mcpy(so->str, si->str+lindex, l);
 	FLUSH(&so);
 }
@@ -164,7 +175,7 @@
 void
 sys·intstring(int64 v, string s)
 {
-	s = mal(sizeof(s->len)+8);
+	s = gostringsize(8);
 	s->len = runetochar(s->str, v);
 	FLUSH(&s);
 }
@@ -172,8 +183,7 @@
 void
 sys·byteastring(byte *a, int32 l, string s)
 {
-	s = mal(sizeof(s->len)+l);
-	s->len = l;
+	s = gostringsize(l);
 	mcpy(s->str, a, l);
 	FLUSH(&s);
 }
@@ -181,8 +191,7 @@
 void
 sys·arraystring(Array b, string s)
 {
-	s = mal(sizeof(s->len)+b.nel);
-	s->len = b.nel;
+	s = gostringsize(b.nel);
 	mcpy(s->str, b.array, s->len);
 	FLUSH(&s);
 }