diff --git a/apps/avifdec.c b/apps/avifdec.c
index b0bdca7..79ca30c 100644
--- a/apps/avifdec.c
+++ b/apps/avifdec.c
@@ -41,8 +41,13 @@
 static int info(const char * inputFilename)
 {
     avifDecoder * decoder = avifDecoderCreate();
-    avifDecoderSetIOFile(decoder, inputFilename);
-    avifResult result = avifDecoderParse(decoder);
+    avifResult result = avifDecoderSetIOFile(decoder, inputFilename);
+    if (result != AVIF_RESULT_OK) {
+        fprintf(stderr, "Cannot open file for read: %s\n", inputFilename);
+        avifDecoderDestroy(decoder);
+        return 1;
+    }
+    result = avifDecoderParse(decoder);
     if (result == AVIF_RESULT_OK) {
         printf("Image decoded: %s\n", inputFilename);
 
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 32a900e..b5215a9 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -242,11 +242,12 @@
     }
 
     fseek(f, 0, SEEK_END);
-    size_t fileSize = (size_t)ftell(f);
-    if (!fileSize) {
+    long pos = ftell(f);
+    if (pos <= 0) {
         fclose(f);
         return AVIF_FALSE;
     }
+    size_t fileSize = (size_t)pos;
     fseek(f, 0, SEEK_SET);
 
     avifRWDataRealloc(raw, fileSize);
@@ -449,14 +450,14 @@
         } else if (!strcmp(arg, "--exif")) {
             NEXTARG();
             if (!readEntireFile(arg, &exifOverride)) {
-                fprintf(stderr, "ERROR: Unable to read Exif content: %s\n", arg);
+                fprintf(stderr, "ERROR: Unable to read Exif metadata: %s\n", arg);
                 returnCode = 1;
                 goto cleanup;
             }
         } else if (!strcmp(arg, "--xmp")) {
             NEXTARG();
             if (!readEntireFile(arg, &xmpOverride)) {
-                fprintf(stderr, "ERROR: Unable to read XMP content: %s\n", arg);
+                fprintf(stderr, "ERROR: Unable to read XMP metadata: %s\n", arg);
                 returnCode = 1;
                 goto cleanup;
             }
diff --git a/tests/aviftest.c b/tests/aviftest.c
index d7bdea6..86b6406 100644
--- a/tests/aviftest.c
+++ b/tests/aviftest.c
@@ -273,18 +273,19 @@
     avifIOTestReader * reader = (avifIOTestReader *)io;
 
     // Sanitize/clamp incoming request
-    if (offset >= reader->rodata.size) {
-        offset = 0;
-        size = 0;
+    if (offset > reader->rodata.size) {
+        // The offset is past the end of the buffer.
+        return AVIF_RESULT_IO_ERROR;
     }
-    if ((offset + size) > reader->rodata.size) {
-        size = reader->rodata.size - offset;
+    uint64_t availableSize = reader->rodata.size - offset;
+    if (size > availableSize) {
+        size = availableSize;
     }
 
-    if (offset >= reader->availableBytes) {
+    if (offset > reader->availableBytes) {
         return AVIF_RESULT_WAITING_ON_IO;
     }
-    if ((offset + size) > reader->availableBytes) {
+    if (size > (reader->availableBytes - offset)) {
         return AVIF_RESULT_WAITING_ON_IO;
     }
 
@@ -320,8 +321,8 @@
     static const char * ioSuffix = "/io/";
 
     char ioDir[FILENAME_MAX_LENGTH + 1];
-    int dataDirLen = (int)strlen(dataDir);
-    int ioSuffixLen = (int)strlen(ioSuffix);
+    size_t dataDirLen = strlen(dataDir);
+    size_t ioSuffixLen = strlen(ioSuffix);
 
     if ((dataDirLen + ioSuffixLen) > FILENAME_MAX_LENGTH) {
         printf("Path too long: %s\n", dataDir);
@@ -329,7 +330,7 @@
     }
     strcpy(ioDir, dataDir);
     strcat(ioDir, ioSuffix);
-    int ioDirLen = (int)strlen(ioDir);
+    size_t ioDirLen = strlen(ioDir);
 
     int retCode = 0;
 
@@ -339,7 +340,7 @@
     const char * filename = nextFilename(ioDir, "avif", &nfd);
     for (; filename != NULL; filename = nextFilename(ioDir, "avif", &nfd)) {
         char fullFilename[FILENAME_MAX_LENGTH + 1];
-        int filenameLen = (int)strlen(filename);
+        size_t filenameLen = strlen(filename);
         if ((ioDirLen + filenameLen) > FILENAME_MAX_LENGTH) {
             printf("Path too long: %s\n", filename);
             return 1;
@@ -426,7 +427,8 @@
     fprintf(stderr,
             "Syntax: aviftest [options] dataDir [testFilter]\n"
             "Options:\n"
-            "    -g : Generate tests\n");
+            "    -g : Generate Encode/Decode tests\n"
+            "    --io-only : Run IO tests only\n");
 }
 
 int main(int argc, char * argv[])
