|
From: <sv...@va...> - 2007-01-10 15:42:25
|
Author: sewardj
Date: 2007-01-10 15:42:15 +0000 (Wed, 10 Jan 2007)
New Revision: 6502
Log:
Generate valid XML even for very long fn names - always ensure tags
have matching closing tags.
Modified:
trunk/coregrind/m_debuginfo/debuginfo.c
Modified: trunk/coregrind/m_debuginfo/debuginfo.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_debuginfo/debuginfo.c 2007-01-10 13:04:52 UTC (rev =
6501)
+++ trunk/coregrind/m_debuginfo/debuginfo.c 2007-01-10 15:42:15 UTC (rev =
6502)
@@ -744,38 +744,73 @@
}
=20
=20
-/* Print into buf info on code address, function name and filename */
+/* VG_(describe_IP): print into buf info on code address, function
+ name and filename. */
=20
+/* Copy str into buf starting at n, but not going past buf[n_buf-1]
+ and always ensuring that buf is zero-terminated. */
+
static Int putStr ( Int n, Int n_buf, Char* buf, Char* str )=20
{
+ vg_assert(n_buf > 0);
+ vg_assert(n >=3D 0 && n < n_buf);
for (; n < n_buf-1 && *str !=3D 0; n++,str++)
buf[n] =3D *str;
+ vg_assert(n >=3D 0 && n < n_buf);
buf[n] =3D '\0';
return n;
}
-static Int putStrEsc ( Int n, Int n_buf, Char* buf, Char* str )=20
+
+/* Same as putStr, but escaping chars for XML output, and
+ also not adding more than count chars to n_buf. */
+
+static Int putStrEsc ( Int n, Int n_buf, Int count, Char* buf, Char* str=
)=20
{
Char alt[2];
+ vg_assert(n_buf > 0);
+ vg_assert(count >=3D 0 && count < n_buf);
+ vg_assert(n >=3D 0 && n < n_buf);
for (; *str !=3D 0; str++) {
+ vg_assert(count >=3D 0);
+ if (count <=3D 0)
+ goto done;
switch (*str) {
- case '&': n =3D putStr( n, n_buf, buf, "&"); break;
- case '<': n =3D putStr( n, n_buf, buf, "<"); break;
- case '>': n =3D putStr( n, n_buf, buf, ">"); break;
- default: alt[0] =3D *str;
- alt[1] =3D 0;
- n =3D putStr( n, n_buf, buf, alt );
- break;
+ case '&':=20
+ if (count < 5) goto done;
+ n =3D putStr( n, n_buf, buf, "&");=20
+ count -=3D 5;
+ break;
+ case '<':=20
+ if (count < 4) goto done;
+ n =3D putStr( n, n_buf, buf, "<");=20
+ count -=3D 4;
+ break;
+ case '>':=20
+ if (count < 4) goto done;
+ n =3D putStr( n, n_buf, buf, ">");=20
+ count -=3D 4;
+ break;
+ default:
+ if (count < 1) goto done;
+ alt[0] =3D *str;
+ alt[1] =3D 0;
+ n =3D putStr( n, n_buf, buf, alt );
+ count -=3D 1;
+ break;
}
}
+ done:
+ vg_assert(count >=3D 0); /* should not go -ve in loop */
+ vg_assert(n >=3D 0 && n < n_buf);
return n;
}
=20
Char* VG_(describe_IP)(Addr eip, Char* buf, Int n_buf)
{
# define APPEND(_str) \
- n =3D putStr(n, n_buf, buf, _str);
-# define APPEND_ESC(_str) \
- n =3D putStrEsc(n, n_buf, buf, _str);
+ n =3D putStr(n, n_buf, buf, _str)
+# define APPEND_ESC(_count,_str) \
+ n =3D putStrEsc(n, n_buf, (_count), buf, (_str))
# define BUF_LEN 4096
=20
UInt lineno;=20
@@ -802,7 +837,12 @@
HChar* maybe_newline =3D human_readable ? "\n " : "";
HChar* maybe_newline2 =3D human_readable ? "\n " : "";
=20
- /* Print in XML format, dumping in as much info as we know. */
+ /* Print in XML format, dumping in as much info as we know.
+ Ensure all tags are balanced even if the individual strings
+ are too long. Allocate 1/10 of BUF_LEN to the object name,
+ 6/10s to the function name, 1/10 to the directory name and
+ 1/10 to the file name, leaving 1/10 for all the fixed-length
+ stuff. */
APPEND("<frame>");
VG_(sprintf)(ibuf,"<ip>0x%llx</ip>", (ULong)eip);
APPEND(maybe_newline);
@@ -810,25 +850,25 @@
if (know_objname) {
APPEND(maybe_newline);
APPEND("<obj>");
- APPEND_ESC(buf_obj);
+ APPEND_ESC(1*BUF_LEN/10, buf_obj);
APPEND("</obj>");
}
if (know_fnname) {
APPEND(maybe_newline);
APPEND("<fn>");
- APPEND_ESC(buf_fn);
+ APPEND_ESC(6*BUF_LEN/10, buf_fn);
APPEND("</fn>");
}
if (know_srcloc) {
if (know_dirinfo) {
APPEND(maybe_newline);
APPEND("<dir>");
- APPEND(buf_dirname);
+ APPEND_ESC(1*BUF_LEN/10, buf_dirname);
APPEND("</dir>");
}
APPEND(maybe_newline);
APPEND("<file>");
- APPEND_ESC(buf_srcloc);
+ APPEND_ESC(1*BUF_LEN/10, buf_srcloc);
APPEND("</file>");
APPEND(maybe_newline);
APPEND("<line>");
|