Merge fixes from trunk. All changes are on makefiles and test scripts.
[sqlite.git] / test / ossshell.c
blob00cc3391c894f48afda1ae2cd1d4d3a8ac78b3ed
1 /*
2 ** This is a test interface for the ossfuzz.c module. The ossfuzz.c module
3 ** is an adaptor for OSS-FUZZ. (https://github.com/google/oss-fuzz)
4 **
5 ** This program links against ossfuzz.c. It reads files named on the
6 ** command line and passes them one by one into ossfuzz.c.
7 */
8 #include <stddef.h>
9 #include <stdint.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include "sqlite3.h"
16 ** The entry point in ossfuzz.c that this routine will be calling
18 int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
20 /* Must match equivalent #defines in ossfuzz.c */
21 #define FUZZ_SQL_TRACE 0x0001 /* Set an sqlite3_trace() callback */
22 #define FUZZ_SHOW_MAX_DELAY 0x0002 /* Show maximum progress callback delay */
23 #define FUZZ_SHOW_ERRORS 0x0004 /* Show SQL errors */
24 extern void ossfuzz_set_debug_flags(unsigned);
29 ** Read files named on the command-line and invoke the fuzzer for
30 ** each one.
32 int main(int argc, char **argv){
33 FILE *in;
34 int i;
35 int nErr = 0;
36 uint8_t *zBuf = 0;
37 size_t sz;
38 unsigned mDebug = 0;
40 for(i=1; i<argc; i++){
41 const char *zFilename = argv[i];
42 if( zFilename[0]=='-' ){
43 if( zFilename[1]=='-' ) zFilename++;
44 if( strcmp(zFilename, "-show-errors")==0 ){
45 mDebug |= FUZZ_SHOW_ERRORS;
46 ossfuzz_set_debug_flags(mDebug);
47 }else
48 if( strcmp(zFilename, "-show-max-delay")==0 ){
49 mDebug |= FUZZ_SHOW_MAX_DELAY;
50 ossfuzz_set_debug_flags(mDebug);
51 }else
52 if( strcmp(zFilename, "-sql-trace")==0 ){
53 mDebug |= FUZZ_SQL_TRACE;
54 ossfuzz_set_debug_flags(mDebug);
55 }else
57 printf("unknown option \"%s\"\n", argv[i]);
58 printf("should be one of: --show-errors --show-max-delay"
59 " --sql-trace\n");
60 exit(1);
62 continue;
64 in = fopen(zFilename, "rb");
65 if( in==0 ){
66 fprintf(stderr, "cannot open \"%s\"\n", zFilename);
67 nErr++;
68 continue;
70 fseek(in, 0, SEEK_END);
71 sz = ftell(in);
72 rewind(in);
73 zBuf = realloc(zBuf, sz);
74 if( zBuf==0 ){
75 fprintf(stderr, "cannot malloc() for %d bytes\n", (int)sz);
76 exit(1);
78 if( fread(zBuf, sz, 1, in)!=1 ){
79 fprintf(stderr, "cannot read %d bytes from \"%s\"\n",
80 (int)sz, zFilename);
81 nErr++;
82 }else{
83 printf("%s... ", zFilename);
84 if( mDebug ) printf("\n");
85 fflush(stdout);
86 (void)LLVMFuzzerTestOneInput(zBuf, sz);
87 if( mDebug ) printf("%s: ", zFilename);
88 printf("ok\n");
90 fclose(in);
92 free(zBuf);
93 return nErr;