ASanStackFrameLayoutTest.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //===- ASanStackFrameLayoutTest.cpp - Tests for ComputeASanStackFrameLayout===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/Transforms/Utils/ASanStackFrameLayout.h"
  10. #include "llvm/ADT/ArrayRef.h"
  11. #include "gtest/gtest.h"
  12. #include <sstream>
  13. // //
  14. ///////////////////////////////////////////////////////////////////////////////
  15. using namespace llvm;
  16. static std::string
  17. ShadowBytesToString(ArrayRef<uint8_t> ShadowBytes) {
  18. std::ostringstream os;
  19. for (size_t i = 0, n = ShadowBytes.size(); i < n; i++) {
  20. switch (ShadowBytes[i]) {
  21. case kAsanStackLeftRedzoneMagic: os << "L"; break;
  22. case kAsanStackRightRedzoneMagic: os << "R"; break;
  23. case kAsanStackMidRedzoneMagic: os << "M"; break;
  24. default: os << (unsigned)ShadowBytes[i];
  25. }
  26. }
  27. return os.str();
  28. }
  29. static void TestLayout(SmallVector<ASanStackVariableDescription, 10> Vars,
  30. size_t Granularity, size_t MinHeaderSize,
  31. const std::string &ExpectedDescr,
  32. const std::string &ExpectedShadow) {
  33. ASanStackFrameLayout L;
  34. ComputeASanStackFrameLayout(Vars, Granularity, MinHeaderSize, &L);
  35. EXPECT_EQ(ExpectedDescr, L.DescriptionString);
  36. EXPECT_EQ(ExpectedShadow, ShadowBytesToString(L.ShadowBytes));
  37. }
  38. TEST(ASanStackFrameLayout, Test) {
  39. #define VEC1(a) SmallVector<ASanStackVariableDescription, 10>(1, a)
  40. #define VEC(a) \
  41. SmallVector<ASanStackVariableDescription, 10>(a, a + sizeof(a) / sizeof(a[0]))
  42. #define VAR(name, size, alignment) \
  43. ASanStackVariableDescription name##size##_##alignment = { \
  44. #name #size "_" #alignment, \
  45. size, \
  46. alignment, \
  47. 0, \
  48. 0 \
  49. }
  50. VAR(a, 1, 1);
  51. VAR(p, 1, 32);
  52. VAR(p, 1, 256);
  53. VAR(a, 2, 1);
  54. VAR(a, 3, 1);
  55. VAR(a, 4, 1);
  56. VAR(a, 7, 1);
  57. VAR(a, 8, 1);
  58. VAR(a, 9, 1);
  59. VAR(a, 16, 1);
  60. VAR(a, 41, 1);
  61. VAR(a, 105, 1);
  62. TestLayout(VEC1(a1_1), 8, 16, "1 16 1 4 a1_1", "LL1R");
  63. TestLayout(VEC1(a1_1), 64, 64, "1 64 1 4 a1_1", "L1");
  64. TestLayout(VEC1(p1_32), 8, 32, "1 32 1 5 p1_32", "LLLL1RRR");
  65. TestLayout(VEC1(p1_32), 8, 64, "1 64 1 5 p1_32", "LLLLLLLL1RRRRRRR");
  66. TestLayout(VEC1(a1_1), 8, 32, "1 32 1 4 a1_1", "LLLL1RRR");
  67. TestLayout(VEC1(a2_1), 8, 32, "1 32 2 4 a2_1", "LLLL2RRR");
  68. TestLayout(VEC1(a3_1), 8, 32, "1 32 3 4 a3_1", "LLLL3RRR");
  69. TestLayout(VEC1(a4_1), 8, 32, "1 32 4 4 a4_1", "LLLL4RRR");
  70. TestLayout(VEC1(a7_1), 8, 32, "1 32 7 4 a7_1", "LLLL7RRR");
  71. TestLayout(VEC1(a8_1), 8, 32, "1 32 8 4 a8_1", "LLLL0RRR");
  72. TestLayout(VEC1(a9_1), 8, 32, "1 32 9 4 a9_1", "LLLL01RR");
  73. TestLayout(VEC1(a16_1), 8, 32, "1 32 16 5 a16_1", "LLLL00RR");
  74. TestLayout(VEC1(p1_256), 8, 32, "1 256 1 6 p1_256",
  75. "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL1RRR");
  76. TestLayout(VEC1(a41_1), 8, 32, "1 32 41 5 a41_1", "LLLL000001RRRRRR");
  77. TestLayout(VEC1(a105_1), 8, 32, "1 32 105 6 a105_1",
  78. "LLLL00000000000001RRRRRR");
  79. {
  80. ASanStackVariableDescription t[] = {a1_1, p1_256};
  81. TestLayout(VEC(t), 8, 32,
  82. "2 256 1 6 p1_256 272 1 4 a1_1",
  83. "LLLLLLLL" "LLLLLLLL" "LLLLLLLL" "LLLLLLLL" "1M1R");
  84. }
  85. {
  86. ASanStackVariableDescription t[] = {a1_1, a16_1, a41_1};
  87. TestLayout(VEC(t), 8, 32,
  88. "3 32 1 4 a1_1 48 16 5 a16_1 80 41 5 a41_1",
  89. "LLLL" "1M00" "MM00" "0001" "RRRR");
  90. }
  91. #undef VEC1
  92. #undef VEC
  93. #undef VAR
  94. }