mirror of
				https://github.com/glebarez/go-sqlite.git
				synced 2025-11-01 03:22:33 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| ** This is a test interface for the ossfuzz.c module.  The ossfuzz.c module
 | |
| ** is an adaptor for OSS-FUZZ.  (https://github.com/google/oss-fuzz)
 | |
| **
 | |
| ** This program links against ossfuzz.c.  It reads files named on the
 | |
| ** command line and passes them one by one into ossfuzz.c.
 | |
| */
 | |
| #include <stddef.h>
 | |
| #if !defined(_MSC_VER)
 | |
| # include <stdint.h>
 | |
| #endif
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include "sqlite3.h"
 | |
| 
 | |
| #if defined(_MSC_VER)
 | |
| typedef unsigned char uint8_t;
 | |
| #endif
 | |
| 
 | |
| /*
 | |
| ** The entry point in ossfuzz.c that this routine will be calling
 | |
| */
 | |
| int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
 | |
| 
 | |
| /* Must match equivalent #defines in ossfuzz.c */
 | |
| #define FUZZ_SQL_TRACE       0x0001   /* Set an sqlite3_trace() callback */
 | |
| #define FUZZ_SHOW_MAX_DELAY  0x0002   /* Show maximum progress callback delay */
 | |
| #define FUZZ_SHOW_ERRORS     0x0004   /* Show SQL errors */
 | |
| extern void ossfuzz_set_debug_flags(unsigned);
 | |
| 
 | |
| 
 | |
| 
 | |
| /*
 | |
| ** Read files named on the command-line and invoke the fuzzer for
 | |
| ** each one.
 | |
| */
 | |
| int main(int argc, char **argv){
 | |
|   FILE *in;
 | |
|   int i;
 | |
|   int nErr = 0;
 | |
|   uint8_t *zBuf = 0;
 | |
|   size_t sz;
 | |
|   unsigned mDebug = 0;
 | |
| 
 | |
|   for(i=1; i<argc; i++){
 | |
|     const char *zFilename = argv[i];
 | |
|     if( zFilename[0]=='-' ){
 | |
|       if( zFilename[1]=='-' ) zFilename++;
 | |
|       if( strcmp(zFilename, "-show-errors")==0 ){
 | |
|         mDebug |= FUZZ_SHOW_ERRORS;
 | |
|         ossfuzz_set_debug_flags(mDebug);
 | |
|       }else
 | |
|       if( strcmp(zFilename, "-show-max-delay")==0 ){
 | |
|         mDebug |= FUZZ_SHOW_MAX_DELAY;
 | |
|         ossfuzz_set_debug_flags(mDebug);
 | |
|       }else
 | |
|       if( strcmp(zFilename, "-sql-trace")==0 ){
 | |
|         mDebug |= FUZZ_SQL_TRACE;
 | |
|         ossfuzz_set_debug_flags(mDebug);
 | |
|       }else
 | |
|       {
 | |
|         printf("unknown option \"%s\"\n", argv[i]);
 | |
|         printf("should be one of: --show-errors --show-max-delay"
 | |
|                " --sql-trace\n");
 | |
|         exit(1);
 | |
|       }
 | |
|       continue;
 | |
|     }
 | |
|     in = fopen(zFilename, "rb");
 | |
|     if( in==0 ){
 | |
|       fprintf(stderr, "cannot open \"%s\"\n", zFilename);
 | |
|       nErr++;
 | |
|       continue;
 | |
|     }
 | |
|     fseek(in, 0, SEEK_END);
 | |
|     sz = ftell(in);
 | |
|     rewind(in);
 | |
|     zBuf = realloc(zBuf, sz);
 | |
|     if( zBuf==0 ){
 | |
|       fprintf(stderr, "cannot malloc() for %d bytes\n", (int)sz);
 | |
|       exit(1);
 | |
|     }
 | |
|     if( fread(zBuf, sz, 1, in)!=1 ){
 | |
|       fprintf(stderr, "cannot read %d bytes from \"%s\"\n",
 | |
|                        (int)sz, zFilename);
 | |
|       nErr++;
 | |
|     }else{
 | |
|       printf("%s... ", zFilename);
 | |
|       if( mDebug ) printf("\n");
 | |
|       fflush(stdout);
 | |
|       (void)LLVMFuzzerTestOneInput(zBuf, sz);
 | |
|       if( mDebug ) printf("%s: ", zFilename);
 | |
|       printf("ok\n");
 | |
|     }
 | |
|     fclose(in);
 | |
|   }
 | |
|   free(zBuf);
 | |
|   return nErr;
 | |
| }
 | 
