Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.82 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdint.h>
  3. #include <assert.h>
  4.  
  5. typedef int8_t* fsm_id;
  6. typedef uint64_t a_size;
  7.  
  8. typedef enum {
  9. FSM_STATE_ALLOCATED,
  10. FSM_STATE_FREED,
  11. FSM_STATE_ERROR,
  12. FSM_STATE_NONE
  13. } fsm_state;
  14.  
  15. typedef enum {
  16. FSM_ALPHABET_FREE,
  17. FSM_ALPHABET_MALLOC,
  18. } fsm_alphabet;
  19.  
  20. // finite state machine
  21. typedef struct {
  22. fsm_id id;
  23. a_size size;
  24. fsm_state state;
  25. } fsm;
  26.  
  27.  
  28. // FSM list type
  29. typedef struct fsm_list_node{
  30. fsm *fsm;
  31. struct fsm_list_node *next;
  32. } fsm_list_node;
  33.  
  34. static fsm_list_node *fsm_list = NULL;
  35.  
  36. static void __INSTR_fsm_list_append(fsm_list_node *node) {
  37. fsm_list_node *cur = fsm_list;
  38.  
  39. while((cur) && (cur->next)) {
  40. cur = cur->next;
  41. }
  42.  
  43. if (cur == NULL) {
  44. cur = node;
  45. fsm_list = node;
  46. } else {
  47. cur->next = node;
  48. }
  49. }
  50.  
  51. static fsm* __INSTR_fsm_create(fsm_id id, fsm_state state) {
  52. fsm *new_fsm = (fsm *) malloc(sizeof(fsm));
  53. new_fsm->id = id;
  54. new_fsm->state = state;
  55.  
  56. fsm_list_node *node = (fsm_list_node *) malloc(sizeof(fsm_list_node));
  57. node->next = NULL;
  58. node->fsm = new_fsm;
  59.  
  60. __INSTR_fsm_list_append(node);
  61. return new_fsm;
  62. }
  63.  
  64. static fsm* __INSTR_fsm_list_search(fsm_id id) {
  65. fsm_list_node *cur = fsm_list;
  66.  
  67. while(cur) {
  68. /* check wether 'id' is a pointer to
  69. * some memory that we registred, that is if it points
  70. * to some memory region in range [cur.id, cur.id + size] */
  71. if (cur->fsm->id == id) {
  72. // if (cur->fsm->id <= id
  73. // && id < cur->fsm->id + cur->fsm->size) {
  74. return cur->fsm;
  75. }
  76. cur = cur->next;
  77. }
  78.  
  79. return NULL;
  80. }
  81.  
  82. // FSM manipulation
  83.  
  84. static fsm_state fsm_transition_table[4][2] = {{ FSM_STATE_FREED, FSM_STATE_ALLOCATED }, // allocated
  85. { FSM_STATE_ERROR, FSM_STATE_ALLOCATED }, // freed
  86. { FSM_STATE_ERROR, FSM_STATE_ERROR }, // error
  87. { FSM_STATE_NONE, FSM_STATE_NONE}};
  88.  
  89. static void __INSTR_fsm_change_state(fsm_id id, fsm_alphabet action) {
  90.  
  91. // there is no FSM for NULL
  92. if (id == 0) {
  93. return;
  94. }
  95.  
  96. fsm *m = __INSTR_fsm_list_search(id);
  97. if (m != NULL) {
  98. if(action == FSM_ALPHABET_FREE && m->id != id){
  99. assert(0 && "free on non-allocated memory");
  100. __VERIFIER_error();
  101. }
  102. m->state = fsm_transition_table[m->state][action];
  103. } else {
  104. if (action == FSM_ALPHABET_FREE) {
  105. assert(0 && "free on non-allocated memory");
  106. __VERIFIER_error();
  107. }
  108. m = __INSTR_fsm_create(id, FSM_STATE_ALLOCATED);
  109. }
  110.  
  111. if (m != NULL && m->state == FSM_STATE_ERROR) {
  112. assert(0 && "double free");
  113. __VERIFIER_error();
  114. }
  115. }
  116. static fsm* __INSTR_remember(fsm_id id, a_size size, int num) {
  117. fsm *new_rec = (fsm *) malloc(sizeof(fsm));
  118. new_rec->id = id;
  119. new_rec->size = size * num;
  120. new_rec->state = FSM_STATE_NONE;
  121.  
  122. fsm_list_node *node = (fsm_list_node *) malloc(sizeof(fsm_list_node));
  123. node->next = NULL;
  124. node->fsm = new_rec;
  125.  
  126. __INSTR_fsm_list_append(node);
  127.  
  128. return new_rec;
  129. }
  130.  
  131. static void __INSTR_remember_malloc_size(fsm_id id, size_t size) {
  132. fsm *m = __INSTR_fsm_list_search(id);
  133. if (m != NULL) {
  134. m->size = size;
  135. }
  136. }
  137.  
  138. static void __INSTR_check_range(fsm_id id, int range) {
  139. fsm *r = __INSTR_fsm_list_search(id);
  140.  
  141. if (r != NULL) {
  142. /* (id - rec->id) is the offset into allocated memory
  143. * it must be possitive, since id >= rec->id */
  144. if ((a_size)(id - r->id + range) > r->size) {
  145. assert(0 && "memset/memcpy out of range");
  146. __VERIFIER_error();
  147. }
  148.  
  149. // this memory was already freed
  150. if(r->state == FSM_STATE_FREED) {
  151. assert(0 && "memset/memcpy on freed memory");
  152. __VERIFIER_error();
  153. }
  154. } else {
  155. /* we register all memory allocations, so if we
  156. * haven't found the allocation, then this is
  157. * invalid pointer */
  158. assert(0 && "memset/memcpy on invalid pointer");
  159. __VERIFIER_error();
  160. }
  161. }
  162.  
  163. int main(void) {
  164. int i = 0;
  165. void *mem = __VERIFIER_nondet_pointer();
  166. __INSTR_fsm_change_state(mem, 1);
  167. __INSTR_remember_malloc_size(mem, 119);
  168. __INSTR_check_range(mem, 119);
  169.  
  170. return 0;
  171. }
  172. 175,1 Konec
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement