summaryrefslogtreecommitdiff
blob: 0e4f61fca8160b1f8dda7537527378a0e61aed7c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
From 52e252f5d6dc6d10fd85a45b0774bb0b29d5f989 Mon Sep 17 00:00:00 2001
From: Michel Machado <michel@digirati.com.br>
Date: Mon, 4 Jan 2016 13:22:18 -0500
Subject: [PATCH] f3read: avoid compiler warning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When using -O2, GCC was issuing the following warning:

cc -O2 -std=c99 -Wall -Wextra -pedantic -MMD -ggdb -c -o f3read.o f3read.c
f3read.c: In function ‘validate_file’:
f3read.c:95:3: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
   offset = *((uint64_t *) sector);
   ^
---
 f3read.c | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)

diff --git a/f3read.c b/f3read.c
index 1514365..2dc6942 100644
--- a/f3read.c
+++ b/f3read.c
@@ -42,12 +42,12 @@ static void validate_file(const char *path, int number,
 {
 	char *full_fn;
 	const char *filename;
-	uint8_t sector[SECTOR_SIZE], *p, *ptr_end;
+	const int num_int64 = SECTOR_SIZE >> 3;
+	uint64_t sector[num_int64];
 	FILE *f;
 	int fd;
-	int offset_match, error_count;
 	size_t sectors_read;
-	uint64_t offset, expected_offset;
+	uint64_t expected_offset;
 	int final_errno;
 	struct timeval t1, t2;
 	/* Progress time. */
@@ -84,32 +84,24 @@ static void validate_file(const char *path, int number,
 	/* Help the kernel to help us. */
 	assert(!posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL));
 
-	ptr_end = sector + SECTOR_SIZE;
 	sectors_read = fread(sector, SECTOR_SIZE, 1, f);
 	final_errno = errno;
 	expected_offset = (uint64_t)number * GIGABYTES;
 	while (sectors_read > 0) {
 		uint64_t rn;
+		int error_count, i;
 
 		assert(sectors_read == 1);
-		offset = *((uint64_t *) sector);
-		offset_match = offset == expected_offset;
 
-		rn = offset;
-		p = sector + sizeof(offset);
+		rn = sector[0];
 		error_count = 0;
-		for (; error_count <= TOLERANCE && p < ptr_end;
-			p += sizeof(rn)) {
+		for (i = 1; error_count <= TOLERANCE && i < num_int64; i++) {
 			rn = random_number(rn);
-			if (rn != *((__typeof__(rn) *) p))
+			if (rn != sector[i])
 				error_count++;
 		}
 
-		sectors_read = fread(sector, SECTOR_SIZE, 1, f);
-		final_errno = errno;
-		expected_offset += SECTOR_SIZE;
-
-		if (offset_match) {
+		if (expected_offset == sector[0]) {
 			if (error_count == 0)
 				(*ptr_ok)++;
 			else if (error_count <= TOLERANCE)
@@ -121,6 +113,10 @@ static void validate_file(const char *path, int number,
 		else
 			(*ptr_corrupted)++;
 
+		sectors_read = fread(sector, SECTOR_SIZE, 1, f);
+		final_errno = errno;
+		expected_offset += SECTOR_SIZE;
+
 		if (progress) {
 			struct timeval pt2;
 			assert(!gettimeofday(&pt2, NULL));