/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact cf600006051826b4c923471a0f502813d5e10f27bc627fac5a7d26c831765364:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 2d 31 30 2d 32 36  /*.** 2018-10-26
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  **.** This progr
0180: 61 6d 20 69 73 20 64 65 73 69 67 6e 65 64 20 66  am is designed f
0190: 6f 72 20 66 75 7a 7a 2d 74 65 73 74 69 6e 67 20  or fuzz-testing 
01a0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
01b0: 66 69 6c 65 73 20 75 73 69 6e 67 0a 2a 2a 20 74  files using.** t
01c0: 68 65 20 2d 66 73 61 6e 69 74 69 7a 65 3d 66 75  he -fsanitize=fu
01d0: 7a 7a 65 72 20 6f 70 74 69 6f 6e 20 6f 66 20 63  zzer option of c
01e0: 6c 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lang..**.** The 
01f0: 2d 66 73 61 6e 69 74 69 7a 65 3d 66 75 7a 7a 65  -fsanitize=fuzze
0200: 72 20 6f 70 74 69 6f 6e 20 63 61 75 73 65 73 20  r option causes 
0210: 61 20 6d 61 69 6e 28 29 20 74 6f 20 62 65 20 69  a main() to be i
0220: 6e 73 65 72 74 65 64 20 61 75 74 6f 6d 61 74 69  nserted automati
0230: 63 61 6c 6c 79 2e 0a 2a 2a 20 54 68 61 74 20 6d  cally..** That m
0240: 61 69 6e 28 29 20 69 6e 76 6f 6b 65 73 20 4c 4c  ain() invokes LL
0250: 56 4d 46 75 7a 7a 65 72 54 65 73 74 4f 6e 65 49  VMFuzzerTestOneI
0260: 6e 70 75 74 28 44 2c 53 29 20 74 6f 20 62 65 20  nput(D,S) to be 
0270: 69 6e 76 6f 6b 65 64 20 72 65 70 65 61 74 65 64  invoked repeated
0280: 6c 79 2e 0a 2a 2a 20 45 61 63 68 20 44 20 69 73  ly..** Each D is
0290: 20 61 20 66 75 7a 7a 65 64 20 64 61 74 61 62 61   a fuzzed databa
02a0: 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 63 6f  se file.  The co
02b0: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
02c0: 72 75 6e 73 20 76 61 72 69 6f 75 73 0a 2a 2a 20  runs various.** 
02d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  SQL statements a
02e0: 67 61 69 6e 73 74 20 74 68 61 74 20 64 61 74 61  gainst that data
02f0: 62 61 73 65 2c 20 74 72 79 69 6e 67 20 74 6f 20  base, trying to 
0300: 70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72  provoke a failur
0310: 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 62 65 73  e..**.** For bes
0320: 74 20 72 65 73 75 6c 74 73 20 74 68 65 20 73 65  t results the se
0330: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
0340: 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68  s should have th
0350: 65 73 65 20 74 61 62 6c 65 73 3a 0a 2a 2a 0a 2a  ese tables:.**.*
0360: 2a 20 20 20 54 61 62 6c 65 20 22 74 31 22 20 77  *   Table "t1" w
0370: 69 74 68 20 63 6f 6c 75 6d 6e 73 20 22 61 22 20  ith columns "a" 
0380: 61 6e 64 20 22 62 22 0a 2a 2a 20 20 20 54 61 62  and "b".**   Tab
0390: 6c 65 73 20 22 74 32 22 20 61 6e 64 20 22 74 33  les "t2" and "t3
03a0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
03b0: 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 61 74 69  umber of compati
03c0: 62 6c 65 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 20  ble columns.**  
03d0: 20 20 20 20 20 22 74 33 22 20 73 68 6f 75 6c 64       "t3" should
03e0: 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e   have a column n
03f0: 61 6d 65 73 20 22 78 22 0a 2a 2a 20 20 20 54 61  ames "x".**   Ta
0400: 62 6c 65 20 22 74 34 22 20 77 69 74 68 20 61 20  ble "t4" with a 
0410: 63 6f 6c 75 6d 6e 20 22 78 22 20 74 68 61 74 20  column "x" that 
0420: 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  is compatible wi
0430: 74 68 20 74 33 2e 78 2e 0a 2a 2a 0a 2a 2a 20 41  th t3.x..**.** A
0440: 6e 79 20 6f 66 20 74 68 65 73 65 20 74 61 62 6c  ny of these tabl
0450: 65 73 20 63 61 6e 20 62 65 20 76 69 72 74 75 61  es can be virtua
0460: 6c 20 74 61 62 6c 65 73 2c 20 66 6f 72 20 65 78  l tables, for ex
0470: 61 6d 70 6c 65 20 46 54 53 20 6f 72 20 52 54 72  ample FTS or RTr
0480: 65 65 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ee tables..**.**
0490: 20 54 6f 20 72 75 6e 20 74 68 69 73 20 74 65 73   To run this tes
04a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6d 6b 64  t:.**.**     mkd
04b0: 69 72 20 64 69 72 0a 2a 2a 20 20 20 20 20 63 70  ir dir.**     cp
04c0: 20 64 62 66 75 7a 7a 32 2d 73 65 65 64 2a 2e 64   dbfuzz2-seed*.d
04d0: 62 20 64 69 72 0a 2a 2a 20 20 20 20 20 63 6c 61  b dir.**     cla
04e0: 6e 67 2d 36 2e 30 20 2d 49 2e 20 2d 67 20 2d 4f  ng-6.0 -I. -g -O
04f0: 31 20 2d 66 73 61 6e 69 74 69 7a 65 3d 66 75 7a  1 -fsanitize=fuz
0500: 7a 65 72 20 5c 0a 2a 2a 20 20 20 20 20 20 20 2d  zer \.**       -
0510: 44 54 48 52 45 41 44 53 41 46 45 3d 30 20 2d 44  DTHREADSAFE=0 -D
0520: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
0530: 53 45 52 49 41 4c 49 5a 45 20 5c 0a 2a 2a 20 20  SERIALIZE \.**  
0540: 20 20 20 20 20 2d 44 53 51 4c 49 54 45 5f 45 4e       -DSQLITE_EN
0550: 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42  ABLE_DBSTAT_VTAB
0560: 20 64 62 66 75 7a 7a 32 2e 63 20 73 71 6c 69 74   dbfuzz2.c sqlit
0570: 65 33 2e 63 20 2d 6c 64 6c 0a 2a 2a 20 20 20 20  e3.c -ldl.**    
0580: 20 2e 2f 61 2e 6f 75 74 20 64 69 72 0a 2a 2f 0a   ./a.out dir.*/.
0590: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
05a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
05b0: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
05c0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
05d0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
05e0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
05f0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  h>.#include <cty
0600: 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  pe.h>.#include <
0610: 73 74 64 69 6e 74 2e 68 3e 0a 23 69 6e 63 6c 75  stdint.h>.#inclu
0620: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 0a  de "sqlite3.h"..
0630: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
0640: 65 20 69 73 20 74 68 65 20 53 51 4c 20 74 68 61  e is the SQL tha
0650: 74 20 69 73 20 72 75 6e 20 61 67 61 69 6e 73 74  t is run against
0660: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0670: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
0680: 68 61 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b  har *azSql[] = {
0690: 0a 20 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67  .  "PRAGMA integ
06a0: 72 69 74 79 5f 63 68 65 63 6b 3b 22 2c 0a 20 20  rity_check;",.  
06b0: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
06c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 22 2c 0a  qlite_master;",.
06d0: 20 20 22 53 45 4c 45 43 54 20 73 75 6d 28 6c 65    "SELECT sum(le
06e0: 6e 67 74 68 28 6e 61 6d 65 29 29 20 46 52 4f 4d  ngth(name)) FROM
06f0: 20 64 62 73 74 61 74 3b 22 2c 0a 20 20 22 55 50   dbstat;",.  "UP
0700: 44 41 54 45 20 74 31 20 53 45 54 20 62 3d 61 2c  DATE t1 SET b=a,
0710: 20 61 3d 62 20 57 48 45 52 45 20 61 3c 62 3b 22   a=b WHERE a<b;"
0720: 2c 0a 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45  ,.  "ALTER TABLE
0730: 20 74 31 20 52 45 4e 41 4d 45 20 54 4f 20 61 6c   t1 RENAME TO al
0740: 6b 6a 61 6c 6b 6a 64 66 69 69 69 77 75 65 72 39  kjalkjdfiiiwuer9
0750: 38 37 6c 6b 6a 77 65 72 38 32 6d 78 39 37 73 66  87lkjwer82mx97sf
0760: 39 38 37 38 38 73 39 37 38 39 73 3b 22 2c 0a 20  98788s9789s;",. 
0770: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33   "INSERT INTO t3
0780: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0790: 32 3b 22 2c 0a 20 20 22 44 45 4c 45 54 45 20 46  2;",.  "DELETE F
07a0: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 78 20 49  ROM t3 WHERE x I
07b0: 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
07c0: 20 74 34 29 3b 22 2c 0a 20 20 22 52 45 49 4e 44   t4);",.  "REIND
07d0: 45 58 3b 22 2c 0a 20 20 22 44 52 4f 50 20 54 41  EX;",.  "DROP TA
07e0: 42 4c 45 20 74 33 3b 22 2c 0a 20 20 22 56 41 43  BLE t3;",.  "VAC
07f0: 55 55 4d 3b 22 2c 0a 7d 3b 0a 0a 2f 2a 20 4f 75  UUM;",.};../* Ou
0800: 74 70 75 74 20 76 65 72 62 6f 73 69 74 79 20 6c  tput verbosity l
0810: 65 76 65 6c 2e 20 20 30 20 6d 65 61 6e 73 20 63  evel.  0 means c
0820: 6f 6d 70 6c 65 74 65 20 73 69 6c 65 6e 63 65 20  omplete silence 
0830: 2a 2f 0a 69 6e 74 20 65 56 65 72 62 6f 73 69 74  */.int eVerbosit
0840: 79 20 3d 20 30 3b 0a 0a 2f 2a 20 54 72 75 65 20  y = 0;../* True 
0850: 74 6f 20 61 63 74 69 76 61 74 65 20 50 52 41 47  to activate PRAG
0860: 4d 41 20 76 64 62 65 5f 64 65 62 75 67 3d 6f 6e  MA vdbe_debug=on
0870: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62   */.static int b
0880: 56 64 62 65 44 65 62 75 67 20 3d 20 30 3b 0a 0a  VdbeDebug = 0;..
0890: 2f 2a 20 6c 69 62 46 75 7a 7a 65 72 20 69 6e 76  /* libFuzzer inv
08a0: 6f 6b 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e  okes this routin
08b0: 65 20 77 69 74 68 20 66 75 7a 7a 65 64 20 64 61  e with fuzzed da
08c0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 28 69 6e  tabase files (in
08d0: 20 61 44 61 74 61 29 2e 0a 2a 2a 20 54 68 69 73   aData)..** This
08e0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 53 51 4c   routine run SQL
08f0: 69 74 65 20 61 67 61 69 6e 73 74 20 74 68 65 20  ite against the 
0900: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
0910: 73 65 20 74 6f 20 73 65 65 20 69 66 20 69 74 0a  se to see if it.
0920: 2a 2a 20 63 61 6e 20 70 72 6f 76 6f 6b 65 20 61  ** can provoke a
0930: 20 66 61 69 6c 75 72 65 20 6f 72 20 6d 61 6c 66   failure or malf
0940: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
0950: 4c 4c 56 4d 46 75 7a 7a 65 72 54 65 73 74 4f 6e  LLVMFuzzerTestOn
0960: 65 49 6e 70 75 74 28 63 6f 6e 73 74 20 75 69 6e  eInput(const uin
0970: 74 38 5f 74 20 2a 61 44 61 74 61 2c 20 73 69 7a  t8_t *aData, siz
0980: 65 5f 74 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  e_t nByte){.  un
0990: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 0a  signed char *a;.
09a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
09b0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
09c0: 3b 0a 0a 20 20 69 66 28 20 65 56 65 72 62 6f 73  ;..  if( eVerbos
09d0: 69 74 79 3e 3d 31 20 29 7b 0a 20 20 20 20 70 72  ity>=1 ){.    pr
09e0: 69 6e 74 66 28 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  intf("**********
09f0: 2a 2a 2a 2a 20 6e 42 79 74 65 3d 25 64 20 2a 2a  **** nByte=%d **
0a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22  *************\n"
0a10: 2c 20 28 69 6e 74 29 6e 42 79 74 65 29 3b 0a 20  , (int)nByte);. 
0a20: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
0a30: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
0a40: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
0a50: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
0a60: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
0a70: 6e 28 30 2c 20 26 64 62 29 3b 0a 20 20 69 66 28  n(0, &db);.  if(
0a80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   rc ) return 1;.
0a90: 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    a = sqlite3_ma
0aa0: 6c 6c 6f 63 36 34 28 6e 42 79 74 65 2b 31 29 3b  lloc64(nByte+1);
0ab0: 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 72 65  .  if( a==0 ) re
0ac0: 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 63 70 79  turn 1;.  memcpy
0ad0: 28 61 2c 20 61 44 61 74 61 2c 20 6e 42 79 74 65  (a, aData, nByte
0ae0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73  );.  sqlite3_des
0af0: 65 72 69 61 6c 69 7a 65 28 64 62 2c 20 22 6d 61  erialize(db, "ma
0b00: 69 6e 22 2c 20 61 2c 20 6e 42 79 74 65 2c 20 6e  in", a, nByte, n
0b10: 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 53 51  Byte,.        SQ
0b20: 4c 49 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  LITE_DESERIALIZE
0b30: 5f 52 45 53 49 5a 45 41 42 4c 45 20 7c 0a 20 20  _RESIZEABLE |.  
0b40: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 53        SQLITE_DES
0b50: 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f 4e 43  ERIALIZE_FREEONC
0b60: 4c 4f 53 45 29 3b 0a 20 20 69 66 28 20 62 56 64  LOSE);.  if( bVd
0b70: 62 65 44 65 62 75 67 20 29 7b 0a 20 20 20 20 73  beDebug ){.    s
0b80: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
0b90: 22 50 52 41 47 4d 41 20 76 64 62 65 5f 64 65 62  "PRAGMA vdbe_deb
0ba0: 75 67 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29  ug=ON", 0, 0, 0)
0bb0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
0bc0: 20 69 3c 73 69 7a 65 6f 66 28 61 7a 53 71 6c 29   i<sizeof(azSql)
0bd0: 2f 73 69 7a 65 6f 66 28 61 7a 53 71 6c 5b 30 5d  /sizeof(azSql[0]
0be0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
0bf0: 20 65 56 65 72 62 6f 73 69 74 79 3e 3d 31 20 29   eVerbosity>=1 )
0c00: 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  {.      printf("
0c10: 25 73 5c 6e 22 2c 20 61 7a 53 71 6c 5b 69 5d 29  %s\n", azSql[i])
0c20: 3b 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28 73  ;.      fflush(s
0c30: 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  tdout);.    }.  
0c40: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
0c50: 62 2c 20 61 7a 53 71 6c 5b 69 5d 2c 20 30 2c 20  b, azSql[i], 0, 
0c60: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  0, 0);.  }.  rc 
0c70: 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  = sqlite3_close(
0c80: 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  db);.  if( rc!=S
0c90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0ca0: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
0cb0: 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29  "sqlite3_close()
0cc0: 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
0cd0: 72 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  rc);.  }.  if( s
0ce0: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
0cf0: 65 64 28 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  ed()!=0 ){.    i
0d00: 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  nt nAlloc = 0;. 
0d10: 20 20 20 69 6e 74 20 6e 4e 6f 74 55 73 65 64 20     int nNotUsed 
0d20: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
0d30: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
0d40: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
0d50: 4e 54 2c 20 26 6e 41 6c 6c 6f 63 2c 20 26 6e 4e  NT, &nAlloc, &nN
0d60: 6f 74 55 73 65 64 2c 20 30 29 3b 0a 20 20 20 20  otUsed, 0);.    
0d70: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
0d80: 4d 65 6d 6f 72 79 20 6c 65 61 6b 3a 20 25 6c 6c  Memory leak: %ll
0d90: 64 20 62 79 74 65 73 20 69 6e 20 25 64 20 61 6c  d bytes in %d al
0da0: 6c 6f 63 61 74 69 6f 6e 73 5c 6e 22 2c 0a 20 20  locations\n",.  
0db0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
0dc0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 2c  3_memory_used(),
0dd0: 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 65 78   nAlloc);.    ex
0de0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
0df0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
0e00: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
0e10: 72 20 6f 66 20 22 76 22 20 63 68 61 72 61 63 74  r of "v" charact
0e20: 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e 67 2e  ers in a string.
0e30: 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
0e40: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 63  ere.** are any c
0e50: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
0e60: 20 73 74 72 69 6e 67 20 6f 74 68 65 72 20 74 68   string other th
0e70: 61 6e 20 22 76 22 2e 0a 2a 2f 0a 73 74 61 74 69  an "v"..*/.stati
0e80: 63 20 69 6e 74 20 6e 75 6d 62 65 72 4f 66 56 43  c int numberOfVC
0e90: 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  har(const char *
0ea0: 7a 29 7b 0a 20 20 69 6e 74 20 4e 20 3d 20 30 3b  z){.  int N = 0;
0eb0: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26  .  while( z[0] &
0ec0: 26 20 7a 5b 30 5d 3d 3d 27 76 27 20 29 7b 0a 20  & z[0]=='v' ){. 
0ed0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 4e 2b 2b 3b     z++;.    N++;
0ee0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 5b  .  }.  return z[
0ef0: 30 5d 3d 3d 30 20 3f 20 4e 20 3a 20 30 3b 0a 7d  0]==0 ? N : 0;.}
0f00: 0a 0a 2f 2a 20 6c 69 62 46 75 7a 7a 65 72 20 69  ../* libFuzzer i
0f10: 6e 76 6f 6b 65 73 20 74 68 69 73 20 72 6f 75 74  nvokes this rout
0f20: 69 6e 65 20 6f 6e 63 65 20 77 68 65 6e 20 74 68  ine once when th
0f30: 65 20 65 78 65 63 75 74 61 62 6c 65 20 73 74 61  e executable sta
0f40: 72 74 73 2c 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  rts, to.** proce
0f50: 73 73 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  ss the command-l
0f60: 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  ine arguments..*
0f70: 2f 0a 69 6e 74 20 4c 4c 56 4d 46 75 7a 7a 65 72  /.int LLVMFuzzer
0f80: 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 20 2a  Initialize(int *
0f90: 70 41 72 67 63 2c 20 63 68 61 72 20 2a 2a 2a 70  pArgc, char ***p
0fa0: 41 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Argv){.  int i, 
0fb0: 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 61 72 67 63  j, n;.  int argc
0fc0: 20 3d 20 2a 70 41 72 67 63 3b 0a 20 20 63 68 61   = *pArgc;.  cha
0fd0: 72 20 2a 2a 61 72 67 76 20 3d 20 2a 70 41 72 67  r **argv = *pArg
0fe0: 76 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 31 3b 20  v;.  for(i=j=1; 
0ff0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1000: 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76    char *z = argv
1010: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [i];.    if( z[0
1020: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
1030: 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  z++;.      if( z
1040: 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [0]=='-' ) z++;.
1050: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
1060: 27 76 27 20 26 26 20 28 6e 20 3d 20 6e 75 6d 62  'v' && (n = numb
1070: 65 72 4f 66 56 43 68 61 72 28 7a 29 29 3e 30 20  erOfVChar(z))>0 
1080: 29 7b 0a 20 20 20 20 20 20 20 20 65 56 65 72 62  ){.        eVerb
1090: 6f 73 69 74 79 20 2b 3d 20 6e 3b 0a 20 20 20 20  osity += n;.    
10a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
10b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10c0: 73 74 72 63 6d 70 28 7a 2c 22 76 64 62 65 2d 64  strcmp(z,"vdbe-d
10d0: 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ebug")==0 ){.   
10e0: 20 20 20 20 20 62 56 64 62 65 44 65 62 75 67 20       bVdbeDebug 
10f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
1100: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
1110: 20 20 20 7d 0a 20 20 20 20 61 72 67 76 5b 6a 2b     }.    argv[j+
1120: 2b 5d 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  +] = argv[i];.  
1130: 7d 0a 20 20 61 72 67 76 5b 6a 5d 20 3d 20 30 3b  }.  argv[j] = 0;
1140: 0a 20 20 2a 70 41 72 67 63 20 3d 20 6a 3b 0a 20  .  *pArgc = j;. 
1150: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
1160: 66 64 65 66 20 53 54 41 4e 44 41 4c 4f 4e 45 0a  fdef STANDALONE.
1170: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
1180: 74 69 72 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d  tire file into m
1190: 65 6d 6f 72 79 2e 20 20 53 70 61 63 65 20 74 6f  emory.  Space to
11a0: 20 68 6f 6c 64 20 74 68 65 20 66 69 6c 65 20 63   hold the file c
11b0: 6f 6d 65 73 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c  omes.** from mal
11c0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
11d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11e0: 72 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63  readFile(const c
11f0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
1200: 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45  *pnByte){.  FILE
1210: 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61   *in = fopen(zNa
1220: 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e  me, "rb");.  lon
1230: 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20  g nIn;.  size_t 
1240: 6e 52 65 61 64 3b 0a 20 20 75 6e 73 69 67 6e 65  nRead;.  unsigne
1250: 64 20 63 68 61 72 20 2a 70 42 75 66 3b 0a 20 20  d char *pBuf;.  
1260: 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
1270: 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e  rn 0;.  fseek(in
1280: 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  , 0, SEEK_END);.
1290: 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e    nIn = ftell(in
12a0: 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29 3b  );.  rewind(in);
12b0: 0a 20 20 70 42 75 66 20 3d 20 6d 61 6c 6c 6f 63  .  pBuf = malloc
12c0: 28 20 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28  ( nIn+1 );.  if(
12d0: 20 70 42 75 66 3d 3d 30 20 29 7b 20 66 63 6c 6f   pBuf==0 ){ fclo
12e0: 73 65 28 69 6e 29 3b 20 72 65 74 75 72 6e 20 30  se(in); return 0
12f0: 3b 20 7d 0a 20 20 6e 52 65 61 64 20 3d 20 66 72  ; }.  nRead = fr
1300: 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31  ead(pBuf, nIn, 1
1310: 2c 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  , in);.  fclose(
1320: 69 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  in);.  if( nRead
1330: 21 3d 31 20 29 7b 0a 20 20 20 20 66 72 65 65 28  !=1 ){.    free(
1340: 70 42 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72  pBuf);.    retur
1350: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b  n 0;.  }.  pBuf[
1360: 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  nIn] = 0;.  if( 
1370: 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65  pnByte ) *pnByte
1380: 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e   = nIn;.  return
1390: 20 70 42 75 66 3b 0a 7d 0a 23 65 6e 64 69 66 20   pBuf;.}.#endif 
13a0: 2f 2a 20 53 54 41 4e 44 41 4c 4f 4e 45 20 2a 2f  /* STANDALONE */
13b0: 0a 0a 23 69 66 64 65 66 20 53 54 41 4e 44 41 4c  ..#ifdef STANDAL
13c0: 4f 4e 45 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74  ONE.int main(int
13d0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
13e0: 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gv){.  int i;.  
13f0: 4c 4c 56 4d 46 75 7a 7a 65 72 49 6e 69 74 69 61  LLVMFuzzerInitia
1400: 6c 69 7a 65 28 26 61 72 67 63 2c 20 26 61 72 67  lize(&argc, &arg
1410: 76 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  v);.  for(i=1; i
1420: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1440: 70 49 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  pIn;.    int nIn
1450: 3b 0a 20 20 20 20 70 49 6e 20 3d 20 72 65 61 64  ;.    pIn = read
1460: 46 69 6c 65 28 61 72 67 76 5b 69 5d 2c 20 26 6e  File(argv[i], &n
1470: 49 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  In);.    if( pIn
1480: 20 29 7b 0a 20 20 20 20 20 20 4c 4c 56 4d 46 75   ){.      LLVMFu
1490: 7a 7a 65 72 54 65 73 74 4f 6e 65 49 6e 70 75 74  zzerTestOneInput
14a0: 28 28 63 6f 6e 73 74 20 75 69 6e 74 38 5f 74 2a  ((const uint8_t*
14b0: 29 70 49 6e 2c 20 28 73 69 7a 65 5f 74 29 6e 49  )pIn, (size_t)nI
14c0: 6e 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 70  n);.      free(p
14d0: 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  In);.    }.  }. 
14e0: 20 69 66 28 20 65 56 65 72 62 6f 73 69 74 79 3e   if( eVerbosity>
14f0: 30 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  0 ){.    printf(
1500: 22 53 51 4c 69 74 65 20 25 73 5c 6e 22 2c 20 73  "SQLite %s\n", s
1510: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1520: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
1530: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 53   0;.}.#endif /*S
1540: 54 41 4e 44 41 4c 4f 4e 45 2a 2f 0a              TANDALONE*/.