LCOV - code coverage report
Current view: top level - seahorn/lib - nd_fuzz.c (source / functions) Hit Total Coverage
Test: all_fuzz.info Lines: 109 126 86.5 %
Date: 2021-04-23 16:28:21 Functions: 13 17 76.5 %

          Line data    Source code
       1             : /** Definitions of nd() functions for fuzzing */
       2             : 
       3             : #include <assert.h>
       4             : #include <stdbool.h>
       5             : #include <stdint.h>
       6             : #include <stdio.h>
       7             : #include <string.h>
       8             : 
       9             : #include <setjmp.h>
      10             : 
      11             : /** Global access to fuzz data */
      12             : uint8_t *g_fuzz_data;
      13             : size_t g_fuzz_data_size;
      14             : uint8_t *g_fuzz_data_iterator;
      15             : 
      16             : /** jmp environment */
      17             : jmp_buf g_jmp_buf;
      18             : 
      19             : #define UPDATE_FUZZ_ITERATOR(TYPE)                                             \
      20    64024575 :   if (g_fuzz_data_iterator + sizeof(TYPE) - g_fuzz_data >= g_fuzz_data_size) { \
      21     2068591 :     longjmp(g_jmp_buf, 1);                                             \
      22     2068591 :   }
      23             : 
      24    10208048 : bool nd_bool(void) {
      25    10208048 :   bool res;
      26    10208048 : 
      27    10208048 :   UPDATE_FUZZ_ITERATOR(bool)
      28    10208048 :   memcpy(&res, g_fuzz_data_iterator, sizeof(bool));
      29    10146824 :   g_fuzz_data_iterator += sizeof(bool);
      30    10146824 : 
      31    10146824 :   return res;
      32    10208048 : }
      33             : 
      34      471681 : int nd_int(void) {
      35      471681 :   int res;
      36      471681 : 
      37      471681 :   UPDATE_FUZZ_ITERATOR(int);
      38      462514 :   memcpy(&res, g_fuzz_data_iterator, sizeof(int));
      39      462514 :   g_fuzz_data_iterator += sizeof(int);
      40      462514 : 
      41      462514 :   return res;
      42      471681 : }
      43             : 
      44     2186908 : uint8_t nd_uint8_t(void) {
      45     2186908 :   uint8_t res;
      46     2186908 : 
      47     2186908 :   UPDATE_FUZZ_ITERATOR(uint8_t);
      48     2142269 :   memcpy(&res, g_fuzz_data_iterator, sizeof(uint8_t));
      49     2142269 :   g_fuzz_data_iterator += sizeof(uint8_t);
      50     2142269 : 
      51     2142269 :   return res;
      52     2186908 : }
      53             : 
      54      143152 : uint16_t nd_uint16_t(void) {
      55      143152 :   uint16_t res;
      56      143152 : 
      57      143152 :   UPDATE_FUZZ_ITERATOR(uint16_t);
      58      140981 :   memcpy(&res, g_fuzz_data_iterator, sizeof(uint16_t));
      59      140981 :   g_fuzz_data_iterator += sizeof(uint16_t);
      60      140981 : 
      61      140981 :   return res;
      62      143152 : }
      63             : 
      64      400548 : uint32_t nd_uint32_t(void) {
      65      400548 :   uint32_t res;
      66      400548 : 
      67      400548 :   UPDATE_FUZZ_ITERATOR(uint32_t);
      68      388598 :   memcpy(&res, g_fuzz_data_iterator, sizeof(uint32_t));
      69      388598 :   g_fuzz_data_iterator += sizeof(uint32_t);
      70      388598 : 
      71      388598 :   return res;
      72      400548 : }
      73             : 
      74      821617 : uint64_t nd_uint64_t(void) {
      75      821617 :   uint64_t res;
      76      821617 : 
      77      821617 :   UPDATE_FUZZ_ITERATOR(uint64_t);
      78      774328 :   memcpy(&res, g_fuzz_data_iterator, sizeof(uint64_t));
      79      774328 :   g_fuzz_data_iterator += sizeof(uint64_t);
      80      774328 : 
      81      774328 :   return res;
      82      821617 : }
      83             : 
      84    48311768 : size_t nd_size_t(void) {
      85    48311768 :   size_t res;
      86    48311768 : 
      87    48311768 :   UPDATE_FUZZ_ITERATOR(size_t);
      88    46582440 :   memcpy(&res, g_fuzz_data_iterator, sizeof(size_t));
      89    46582440 :   g_fuzz_data_iterator += sizeof(size_t);
      90    46582440 : 
      91    46582440 :   return res;
      92    48311768 : }
      93             : 
      94     1480853 : void *nd_voidp(void) {
      95     1480853 :   void *res;
      96     1480853 : 
      97     1480853 :   UPDATE_FUZZ_ITERATOR(res);
      98     1318030 :   memcpy(&res, g_fuzz_data_iterator, sizeof(res));
      99     1318030 :   g_fuzz_data_iterator += sizeof(res);
     100     1318030 : 
     101     1318030 :   return res;
     102     1480853 : }
     103             : 
     104    10277709 : void memhavoc(void *ptr, size_t size) {
     105    10277709 :   if (!ptr) {
     106           0 :     return;
     107           0 :   }
     108    10277709 :   if (g_fuzz_data_iterator + size - g_fuzz_data >= g_fuzz_data_size) {
     109      544093 :     longjmp(g_jmp_buf, 1);
     110      544093 :   }
     111     9733616 : 
     112     9733616 :   memcpy(ptr, g_fuzz_data_iterator, size);
     113     9733616 :   g_fuzz_data_iterator += size;
     114     9733616 : }
     115             : 
     116           0 : void __VERIFIER_assert(bool v) {
     117           0 :   /* fprintf(stdout, "CHECK ASSERT\n"); */
     118           0 :   fflush(stdout);
     119           0 : 
     120           0 :   return assert(v);
     121           0 : }
     122             : 
     123    38015089 : void __SEA_assume(bool v) {
     124    38015089 :   // -- if assumption fails, jump back to LLVMFuzzerTestOneInput
     125    38015089 :   if (!v) {
     126    10883625 :     longjmp(g_jmp_buf, 1);
     127    10883625 :   }
     128    38015089 : }
     129             : 
     130    38015089 : void __VERIFIER_assume(int v) {
     131    38015089 :   __SEA_assume(v);
     132    38015089 : }
     133             : 
     134           0 : void __VERIFIER_error(void) {
     135           0 :   fprintf(stdout, "ERROR REACHED\n");
     136           0 :   fflush(stdout);
     137           0 :   assert(0);
     138           0 : }
     139             : 
     140             : /** expected entry of verification harness */
     141             : extern int _main(void);
     142             : 
     143    19550000 : int LLVMFuzzerTestOneInput(uint8_t *Data, size_t Size) {
     144    19550000 :   g_fuzz_data = Data;
     145    19550000 :   g_fuzz_data_size = Size;
     146    19550000 :   g_fuzz_data_iterator = g_fuzz_data;
     147    19550000 : 
     148    19550000 :   if (setjmp(g_jmp_buf)) {
     149    13496309 :     // assumption failed, abort
     150    13496309 :     return 0;
     151    13496309 :   }
     152     6053691 :   _main();
     153     6053691 : 
     154     6053691 :   return 0;
     155     6053691 : }
     156             : 
     157           0 : bool nd_malloc_is_fail(void) { return nd_bool(); }
     158             : 
     159           0 : int nondet_compare(const void* a, const void *b) {
     160           0 :   return nd_int();
     161           0 : }
     162             : 
     163             : /* nd_linked_list_node - special function for returning a symbolic value of
     164             :  * the linked list node pointer.
     165             : */
     166     1330853 : struct aws_linked_list_node *nd_linked_list_node(void) {
     167     1330853 :   return (struct aws_linked_list_node *)nd_voidp();
     168     1330853 : }

Generated by: LCOV version 1.13