Fix printing of unreadable struct iovec

* io.c (tprint_iov_upto): If the first element of iovec array is
unreadable, print its address without array markup.
* tests/readv.c (main): Check it.
diff --git a/io.c b/io.c
index 2075d20..aac93ea 100644
--- a/io.c
+++ b/io.c
@@ -86,17 +86,23 @@
 	} else {
 		abbrev_end = end;
 	}
-	tprints("[");
+	if (addr >= abbrev_end) {
+		tprints("[...]");
+		return;
+	}
 	for (cur = addr; cur < end; cur += sizeof_iov) {
-		if (cur > addr)
+		if (cur > addr) {
 			tprints(", ");
-		if (cur >= abbrev_end) {
-			tprints("...");
-			break;
+			if (cur >= abbrev_end) {
+				tprints("...");
+				break;
+			}
 		}
 		if (umove_ulong_array_or_printaddr(tcp, cur, iov,
 						   ARRAY_SIZE(iov)))
 			break;
+		if (cur <= addr)
+			tprints("[");
 		tprints("{");
 		if (decode_iov) {
 			unsigned long len = iov[1];
@@ -108,7 +114,8 @@
 			printaddr(iov[0]);
 		tprintf(", %lu}", iov[1]);
 	}
-	tprints("]");
+	if (cur > addr)
+		tprints("]");
 }
 
 void
diff --git a/tests/readv.c b/tests/readv.c
index ce765ec..b0603c2 100644
--- a/tests/readv.c
+++ b/tests/readv.c
@@ -60,7 +60,7 @@
 	void *w2 = tail_memdup(w2_c, LENGTH_OF(w2_c));
 
 	assert(writev(1, efault, 42) == -1);
-	tprintf("writev(1, [%p], 42) = -1 EFAULT (%m)\n", efault);
+	tprintf("writev(1, %p, 42) = -1 EFAULT (%m)\n", efault);
 
 	assert(readv(0, efault, 42) == -1);
 	tprintf("readv(0, %p, 42) = -1 EFAULT (%m)\n", efault);