Ticket #4635: save_binary_bug.cpp

File save_binary_bug.cpp, 1.1 KB (added by Mark Heuser <mlheuser@…>, 12 years ago)

Linux/C++ program.

Line 
1#include <stdio.h> // for printf()
2
3#include <unistd.h> // for getpagesize()
4#include <sys/mman.h> // for mmap()
5
6#include <sstream>
7
8#include <boost/archive/text_oarchive.hpp>
9
10int
11main(int argc, char**argv)
12{
13 // Get the page size.
14 int pageSize = ::getpagesize();
15 ::printf("pageSize = %d\n", pageSize);
16
17 // Allocate a page of zeroes in a lonely part of the address space.
18 char* addr = (char*) ::mmap(0, pageSize, PROT_READ|PROT_WRITE,
19 MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
20 ::printf("addr = %p\n", addr);
21
22 // Serialize the last few bytes of the page.
23 std::stringstream str;
24 boost::archive::text_oarchive oar(str);
25 oar.save_binary(addr + (pageSize-8), 8);
26
27 return 0;
28
29 //These cause an address fault:
30 //oar.save_binary(addr + (pageSize-4), 4);
31 //oar.save_binary(addr + (pageSize-8), 8);
32 //oar.save_binary(addr + (pageSize-16), 16);
33 //oar.save_binary(addr, pageSize);
34
35 //These don't:
36 //oar.save_binary(addr + (pageSize-9), 8);
37 //oar.save_binary(addr + (pageSize-8), 7);
38 //oar.save_binary(addr + (pageSize-17), 16);
39 //oar.save_binary(addr + (pageSize-16), 15);
40 //oar.save_binary(addr, pageSize-1);
41}