commit 74d8ef602fcccb9e014f812b75178162b6e8508b
parent 5f4a2177d40dac6e12ab9161cb9026f6dbcb89bb
Author: Kyle Milz <kyle@0x30.net>
Date:   Mon,  8 Aug 2016 19:00:25 -0600
src: fix off by one in line buffers
Diffstat:
8 files changed, 42 insertions(+), 41 deletions(-)
diff --git a/src/inst_ast_visitor.cc b/src/inst_ast_visitor.cc
@@ -85,7 +85,7 @@ RewriteASTVisitor::modify_stmt(clang::Stmt *s)
 
 	std::stringstream ss;
 	ss << "(++_citrun_lines["
-		<< m_SM.getPresumedLineNumber(s->getLocStart())
+		<< m_SM.getPresumedLineNumber(s->getLocStart()) - 1
 		<< "], ";
 	if (m_TheRewriter.InsertTextBefore(s->getLocStart(), ss.str()))
 		// writing failed, don't attempt to add ")"
@@ -118,7 +118,7 @@ RewriteASTVisitor::VisitFunctionDecl(clang::FunctionDecl *f)
 	int decl_start = m_SM.getPresumedLineNumber(f->getLocStart());
 	int decl_end = m_SM.getPresumedLineNumber(curly_brace);
 	for (int i = decl_start; i <= decl_end; i++)
-		rewrite_text << "++_citrun_lines[" << i << "];";
+		rewrite_text << "++_citrun_lines[" << i - 1 << "];";
 
 	// Rewrite the function source right after the beginning curly brace.
 	m_TheRewriter.InsertTextBefore(curly_brace, rewrite_text.str());
diff --git a/t/inst_for.t b/t/inst_for.t
@@ -22,10 +22,10 @@ cat <<EOF > for.c.inst_good
 
 int
 main(int argc, char *argv[])
-{citrun_start();++_citrun_lines[3];++_citrun_lines[4];++_citrun_lines[5];
+{citrun_start();++_citrun_lines[2];++_citrun_lines[3];++_citrun_lines[4];
 	for (;;);
 
-	for (argc = 0; (++_citrun_lines[8], argc < 10); argc++)
+	for (argc = 0; (++_citrun_lines[7], argc < 10); argc++)
 		argv++;
 }
 EOF
diff --git a/t/inst_if.t b/t/inst_if.t
@@ -29,18 +29,18 @@ cat <<EOF > if.c.inst_good
 
 int
 main(int argc, char *argv[])
-{citrun_start();++_citrun_lines[3];++_citrun_lines[4];++_citrun_lines[5];
-	if ((++_citrun_lines[6], argc == 1))
-		return (++_citrun_lines[7], 1);
+{citrun_start();++_citrun_lines[2];++_citrun_lines[3];++_citrun_lines[4];
+	if ((++_citrun_lines[5], argc == 1))
+		return (++_citrun_lines[6], 1);
 	else
-		(++_citrun_lines[9], exit(14));
+		(++_citrun_lines[8], exit(14));
 
-	if ((++_citrun_lines[11], (argc = 2)))
-		return (++_citrun_lines[12], 5);
-	if ((++_citrun_lines[13], argc && argc + 1))
-		return (++_citrun_lines[14], 0);
+	if ((++_citrun_lines[10], (argc = 2)))
+		return (++_citrun_lines[11], 5);
+	if ((++_citrun_lines[12], argc && argc + 1))
+		return (++_citrun_lines[13], 0);
 	else
-		(++_citrun_lines[16], exit(0));
+		(++_citrun_lines[15], exit(0));
 }
 EOF
 
diff --git a/t/inst_return.t b/t/inst_return.t
@@ -19,16 +19,16 @@ int main(void) {
 EOF
 
 cat <<EOF > return.c.inst_good
-int foo() {++_citrun_lines[1];
-	return (++_citrun_lines[2], 0);
+int foo() {++_citrun_lines[0];
+	return (++_citrun_lines[1], 0);
 }
 
-int main(void) {citrun_start();++_citrun_lines[5];
-	return (++_citrun_lines[6], 10);
+int main(void) {citrun_start();++_citrun_lines[4];
+	return (++_citrun_lines[5], 10);
 
-	return (++_citrun_lines[8], 10 + 10);
+	return (++_citrun_lines[7], 10 + 10);
 
-	return (++_citrun_lines[10], (++_citrun_lines[10], foo()));
+	return (++_citrun_lines[9], (++_citrun_lines[9], foo()));
 }
 EOF
 
diff --git a/t/inst_switch.t b/t/inst_switch.t
@@ -24,17 +24,17 @@ EOF
 cat <<EOF > switch.c.inst_good
 int
 main(void)
-{citrun_start();++_citrun_lines[1];++_citrun_lines[2];++_citrun_lines[3];
+{citrun_start();++_citrun_lines[0];++_citrun_lines[1];++_citrun_lines[2];
 	int i;
 
-	switch ((++_citrun_lines[6], i)) {
+	switch ((++_citrun_lines[5], i)) {
 	case 0:
 		break;
 	case 1:
 		break;
 	}
 
-	return (++_citrun_lines[13], 0);
+	return (++_citrun_lines[12], 0);
 }
 EOF
 
diff --git a/t/inst_while.t b/t/inst_while.t
@@ -19,12 +19,12 @@ EOF
 cat <<EOF > while.c.inst_good
 int
 main(int argc, char *argv[])
-{citrun_start();++_citrun_lines[1];++_citrun_lines[2];++_citrun_lines[3];
-	while ((++_citrun_lines[4], argc < 17))
+{citrun_start();++_citrun_lines[0];++_citrun_lines[1];++_citrun_lines[2];
+	while ((++_citrun_lines[3], argc < 17))
 		argc++;
 
-	while ((++_citrun_lines[7], (argc && argv)));
-	return (++_citrun_lines[8], 0);
+	while ((++_citrun_lines[6], (argc && argv)));
+	return (++_citrun_lines[7], 0);
 }
 EOF
 
diff --git a/t/rt_counters_increase.t b/t/rt_counters_increase.t
@@ -49,7 +49,7 @@ ok( keys %$data == 1, "single dynamic data key" );
 my ($exec_lines1) = values %$data;
 
 # Only lines 8 - 12 in the source code above are executing
-for (8..12) {
+for (7..11) {
 	# Runtime sends execution differences.
 	cmp_ok( $exec_lines1->[$_], ">", 0, "line $_ executed nonzero times" );
 }
diff --git a/t/rt_dynamic.t b/t/rt_dynamic.t
@@ -1,5 +1,5 @@
 use strict;
-use Test::More tests => 106;
+use Test::More tests => 107;
 use Test::Project;
 use Test::Viewer;
 use Time::HiRes qw( usleep );
@@ -69,21 +69,22 @@ my $data = $viewer->get_dynamic_data();
 my ($s0, $s1, $s2) = sort keys %$data;
 
 my @lines = @{ $data->{$s0} };
-is( $lines[$_], 0, "src 0 line $_ check" ) for (1..6);
-is( $lines[$_], 1, "src 0 line $_ check" ) for (7..9);
-is( $lines[$_], 0, "src 0 line $_ check" ) for (10..11);
-is( $lines[12], 1, "src 0 line 14 check" );
-is( $lines[$_], 0, "src 0 line $_ check" ) for (13..14);
-is( $lines[15], 1, "src 0 line 15 check" );
-is( $lines[16], 0, "src 0 line 16 check" );
-is( $lines[17], 2, "src 0 line 17 check" );
-is( $lines[$_], 0, "src 0 line $_ check" ) for (18..19);
+is( $lines[$_], 0, "src 0 line $_ check" ) for (0..5);
+is( $lines[$_], 1, "src 0 line $_ check" ) for (6..8);
+is( $lines[$_], 0, "src 0 line $_ check" ) for (9..10);
+is( $lines[11], 1, "src 0 line 11 check" );
+is( $lines[$_], 0, "src 0 line $_ check" ) for (12..13);
+is( $lines[14], 1, "src 0 line 14 check" );
+is( $lines[15], 0, "src 0 line 15 check" );
+is( $lines[16], 2, "src 0 line 16 check" );
+is( $lines[$_], 0, "src 0 line $_ check" ) for (17..18);
 
 my @lines = @{ $data->{$s1} };
-is( $lines[0], 0, "src 1 line 0 check" );
-cmp_ok ( $lines[$_], ">", 1, "src 1 line $_ check" ) for (1..3);
-cmp_ok ( $lines[$_], ">", 10, "src 1 line $_ check" ) for (4..7);
-is( $lines[8], 0, "src 1 line 8 check" );
+cmp_ok ( $lines[$_], ">", 1, "src 1 line $_ check" ) for (0..2);
+cmp_ok ( $lines[$_], ">", 10, "src 1 line $_ check" ) for (3..6);
+is( $lines[7], 0, "src 1 line 7 check" );
+cmp_ok( $lines[8], ">", 10, "src 1 line 8 check" );
+is( $lines[9],		0, "src 1 line 9 check" );
 
 my @lines = @{ $data->{$s2} };
 is( $lines[$_], 0, "src 2 line $_ check" ) for (0..8);