run-string.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <ccan/ptr_valid/ptr_valid.h>
  2. /* Include the C files directly. */
  3. #include <ccan/ptr_valid/ptr_valid.c>
  4. #include <ccan/tap/tap.h>
  5. #include <sys/mman.h>
  6. int main(void)
  7. {
  8. char *page;
  9. struct ptr_valid_batch *batch = malloc(sizeof *batch);
  10. /* This is how many tests you plan to run */
  11. plan_tests(14);
  12. page = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE,
  13. MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
  14. strcpy(page, "hello");
  15. ok1(ptr_valid_read(page));
  16. ok1(ptr_valid_write(page));
  17. ok1(ptr_valid_string(page));
  18. ok1(ptr_valid_batch_start(batch));
  19. ok1(ptr_valid_batch_string(batch, page));
  20. ptr_valid_batch_end(batch);
  21. /* Check invalid case. */
  22. munmap(page, getpagesize());
  23. ok1(!ptr_valid_string(page));
  24. ok1(ptr_valid_batch_start(batch));
  25. ok1(!ptr_valid_batch_string(batch, page));
  26. ptr_valid_batch_end(batch);
  27. /* Check for overrun. */
  28. page = mmap(NULL, getpagesize()*2, PROT_READ|PROT_WRITE,
  29. MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
  30. munmap(page + getpagesize(), getpagesize());
  31. memset(page, 'a', getpagesize());
  32. ok1(!ptr_valid_string(page));
  33. ok1(ptr_valid_batch_start(batch));
  34. ok1(!ptr_valid_batch_string(batch, page));
  35. ptr_valid_batch_end(batch);
  36. page[getpagesize()-1] = '\0';
  37. ok1(ptr_valid_string(page));
  38. ok1(ptr_valid_batch_start(batch));
  39. ok1(ptr_valid_batch_string(batch, page));
  40. ptr_valid_batch_end(batch);
  41. munmap(page, getpagesize());
  42. free(batch);
  43. /* This exits depending on whether all tests passed */
  44. return exit_status();
  45. }