test_check.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. // (C) Copyright 2009 Robert Ramey
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. // See http://www.boost.org for most recent version including documentation.
  6. // note: this is a compile only test.
  7. #include <sstream>
  8. #include <boost/config.hpp> // BOOST_STATIC_CONST
  9. #include <boost/serialization/static_warning.hpp>
  10. #include <boost/serialization/tracking.hpp>
  11. #include <boost/serialization/level.hpp>
  12. #include <boost/serialization/version.hpp>
  13. #include <boost/serialization/nvp.hpp>
  14. #include <boost/archive/text_iarchive.hpp>
  15. #include <boost/archive/text_oarchive.hpp>
  16. // track_selectivly with class information in the archive
  17. // is unsafe when used with a pointer and should trigger a warning
  18. struct check1 {
  19. template<class Archive>
  20. void serialize(Archive & ar, const unsigned int version);
  21. check1(){}
  22. };
  23. BOOST_CLASS_IMPLEMENTATION(check1, boost::serialization::object_serializable)
  24. BOOST_CLASS_TRACKING(check1, boost::serialization::track_selectively)
  25. // the combination of versioning + no class information
  26. // should trigger a warning
  27. struct check2 {
  28. template<class Archive>
  29. void serialize(Archive & ar, const unsigned int version);
  30. check2(){}
  31. };
  32. BOOST_CLASS_IMPLEMENTATION(check2, boost::serialization::object_serializable)
  33. BOOST_CLASS_VERSION(check2, 1)
  34. // use track always to turn off warning tested above
  35. BOOST_CLASS_TRACKING(check2, boost::serialization::track_always)
  36. // serializing a type marked as "track_never" through a pointer
  37. // is likely an error
  38. struct check3 {
  39. template<class Archive>
  40. void serialize(Archive & ar, const unsigned int version);
  41. check3(){}
  42. };
  43. BOOST_CLASS_TRACKING(check3, boost::serialization::track_never)
  44. template<class T>
  45. int f(){
  46. BOOST_STATIC_WARNING(T::value);
  47. BOOST_STATIC_ASSERT(T::value);
  48. return 0;
  49. }
  50. /////////////////////////////////////////////////////////////////////////
  51. // compilation of this program should show a total of 10 warning messages
  52. int main(int /* argc */, char * /* argv */[]){
  53. std::stringstream s;
  54. {
  55. boost::archive::text_oarchive oa(s);
  56. check1 const c1_out;
  57. oa << c1_out;
  58. check1 c1_non_const_out;
  59. oa << c1_non_const_out; // warn check_object_tracking
  60. check1 * const c1_ptr_out = 0;
  61. oa << c1_ptr_out; // warn check_pointer_level
  62. check2 const * c2_ptr_out;
  63. oa << c2_ptr_out; // error check_object_versioning
  64. check3 * const c3_ptr_out = 0;
  65. oa << c3_ptr_out; // warning check_pointer_tracking
  66. check2 const c2_out;
  67. oa << c2_out; // error check_object_versioning
  68. }
  69. {
  70. boost::archive::text_iarchive ia(s);
  71. check1 const c1_in;
  72. ia >> c1_in; // check_const_loading
  73. check1 * c1_ptr_in = 0;
  74. ia >> c1_ptr_in; // warn check_pointer_level
  75. check2 * c2_ptr_in;
  76. ia >> c2_ptr_in; // error check_object_versioning
  77. check3 * c3_ptr_in = 0;
  78. ia >> c3_ptr_in; // warning check_pointer_tracking
  79. check2 c2_in;
  80. ia >> c2_in; // error check_object_versioning
  81. }
  82. {
  83. boost::archive::text_oarchive oa(s);
  84. check1 const c1_out;
  85. oa << BOOST_SERIALIZATION_NVP(c1_out);
  86. check1 c1_non_const_out;
  87. oa << BOOST_SERIALIZATION_NVP(c1_non_const_out); // warn check_object_tracking
  88. check1 * const c1_ptr_out = 0;
  89. oa << BOOST_SERIALIZATION_NVP(c1_ptr_out); // warn check_pointer_level
  90. check2 const * c2_ptr_out;
  91. oa << BOOST_SERIALIZATION_NVP(c2_ptr_out); // error check_object_versioning
  92. check3 * const c3_ptr_out = 0;
  93. oa << BOOST_SERIALIZATION_NVP(c3_ptr_out); // warning check_pointer_tracking
  94. check2 const c2_out;
  95. oa << BOOST_SERIALIZATION_NVP(c2_out); // error check_object_versioning
  96. }
  97. {
  98. boost::archive::text_iarchive ia(s);
  99. check1 const c1_in;
  100. ia >> BOOST_SERIALIZATION_NVP(c1_in); // check_const_loading
  101. check1 * c1_ptr_in = 0;
  102. ia >> BOOST_SERIALIZATION_NVP(c1_ptr_in); // warn check_pointer_level
  103. check2 * c2_ptr_in;
  104. ia >> BOOST_SERIALIZATION_NVP(c2_ptr_in); // error check_object_versioning
  105. check3 * c3_ptr_in = 0;
  106. ia >> BOOST_SERIALIZATION_NVP(c3_ptr_in); // warning check_pointer_tracking
  107. check2 c2_in;
  108. ia >> BOOST_SERIALIZATION_NVP(c2_in); // error check_object_versioning
  109. }
  110. return 0;
  111. }