overflow_kunit.c 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  1. // SPDX-License-Identifier: GPL-2.0 OR MIT
  2. /*
  3. * Test cases for arithmetic overflow checks. See:
  4. * "Running tests with kunit_tool" at Documentation/dev-tools/kunit/start.rst
  5. * ./tools/testing/kunit/kunit.py run overflow [--raw_output]
  6. */
  7. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  8. #include <kunit/device.h>
  9. #include <kunit/test.h>
  10. #include <linux/device.h>
  11. #include <linux/kernel.h>
  12. #include <linux/mm.h>
  13. #include <linux/module.h>
  14. #include <linux/overflow.h>
  15. #include <linux/slab.h>
  16. #include <linux/types.h>
  17. #include <linux/vmalloc.h>
  18. #define SKIP(cond, reason) do { \
  19. if (cond) { \
  20. kunit_skip(test, reason); \
  21. return; \
  22. } \
  23. } while (0)
  24. /*
  25. * Clang 11 and earlier generate unwanted libcalls for signed output
  26. * on unsigned input.
  27. */
  28. #if defined(CONFIG_CC_IS_CLANG) && __clang_major__ <= 11
  29. # define SKIP_SIGN_MISMATCH(t) SKIP(t, "Clang 11 unwanted libcalls")
  30. #else
  31. # define SKIP_SIGN_MISMATCH(t) do { } while (0)
  32. #endif
  33. /*
  34. * Clang 13 and earlier generate unwanted libcalls for 64-bit tests on
  35. * 32-bit hosts.
  36. */
  37. #if defined(CONFIG_CC_IS_CLANG) && __clang_major__ <= 13 && \
  38. BITS_PER_LONG != 64
  39. # define SKIP_64_ON_32(t) SKIP(t, "Clang 13 unwanted libcalls")
  40. #else
  41. # define SKIP_64_ON_32(t) do { } while (0)
  42. #endif
  43. #define DEFINE_TEST_ARRAY_TYPED(t1, t2, t) \
  44. static const struct test_ ## t1 ## _ ## t2 ## __ ## t { \
  45. t1 a; \
  46. t2 b; \
  47. t sum, diff, prod; \
  48. bool s_of, d_of, p_of; \
  49. } t1 ## _ ## t2 ## __ ## t ## _tests[]
  50. #define DEFINE_TEST_ARRAY(t) DEFINE_TEST_ARRAY_TYPED(t, t, t)
  51. DEFINE_TEST_ARRAY(u8) = {
  52. {0, 0, 0, 0, 0, false, false, false},
  53. {1, 1, 2, 0, 1, false, false, false},
  54. {0, 1, 1, U8_MAX, 0, false, true, false},
  55. {1, 0, 1, 1, 0, false, false, false},
  56. {0, U8_MAX, U8_MAX, 1, 0, false, true, false},
  57. {U8_MAX, 0, U8_MAX, U8_MAX, 0, false, false, false},
  58. {1, U8_MAX, 0, 2, U8_MAX, true, true, false},
  59. {U8_MAX, 1, 0, U8_MAX-1, U8_MAX, true, false, false},
  60. {U8_MAX, U8_MAX, U8_MAX-1, 0, 1, true, false, true},
  61. {U8_MAX, U8_MAX-1, U8_MAX-2, 1, 2, true, false, true},
  62. {U8_MAX-1, U8_MAX, U8_MAX-2, U8_MAX, 2, true, true, true},
  63. {1U << 3, 1U << 3, 1U << 4, 0, 1U << 6, false, false, false},
  64. {1U << 4, 1U << 4, 1U << 5, 0, 0, false, false, true},
  65. {1U << 4, 1U << 3, 3*(1U << 3), 1U << 3, 1U << 7, false, false, false},
  66. {1U << 7, 1U << 7, 0, 0, 0, true, false, true},
  67. {48, 32, 80, 16, 0, false, false, true},
  68. {128, 128, 0, 0, 0, true, false, true},
  69. {123, 234, 101, 145, 110, true, true, true},
  70. };
  71. DEFINE_TEST_ARRAY(u16) = {
  72. {0, 0, 0, 0, 0, false, false, false},
  73. {1, 1, 2, 0, 1, false, false, false},
  74. {0, 1, 1, U16_MAX, 0, false, true, false},
  75. {1, 0, 1, 1, 0, false, false, false},
  76. {0, U16_MAX, U16_MAX, 1, 0, false, true, false},
  77. {U16_MAX, 0, U16_MAX, U16_MAX, 0, false, false, false},
  78. {1, U16_MAX, 0, 2, U16_MAX, true, true, false},
  79. {U16_MAX, 1, 0, U16_MAX-1, U16_MAX, true, false, false},
  80. {U16_MAX, U16_MAX, U16_MAX-1, 0, 1, true, false, true},
  81. {U16_MAX, U16_MAX-1, U16_MAX-2, 1, 2, true, false, true},
  82. {U16_MAX-1, U16_MAX, U16_MAX-2, U16_MAX, 2, true, true, true},
  83. {1U << 7, 1U << 7, 1U << 8, 0, 1U << 14, false, false, false},
  84. {1U << 8, 1U << 8, 1U << 9, 0, 0, false, false, true},
  85. {1U << 8, 1U << 7, 3*(1U << 7), 1U << 7, 1U << 15, false, false, false},
  86. {1U << 15, 1U << 15, 0, 0, 0, true, false, true},
  87. {123, 234, 357, 65425, 28782, false, true, false},
  88. {1234, 2345, 3579, 64425, 10146, false, true, true},
  89. };
  90. DEFINE_TEST_ARRAY(u32) = {
  91. {0, 0, 0, 0, 0, false, false, false},
  92. {1, 1, 2, 0, 1, false, false, false},
  93. {0, 1, 1, U32_MAX, 0, false, true, false},
  94. {1, 0, 1, 1, 0, false, false, false},
  95. {0, U32_MAX, U32_MAX, 1, 0, false, true, false},
  96. {U32_MAX, 0, U32_MAX, U32_MAX, 0, false, false, false},
  97. {1, U32_MAX, 0, 2, U32_MAX, true, true, false},
  98. {U32_MAX, 1, 0, U32_MAX-1, U32_MAX, true, false, false},
  99. {U32_MAX, U32_MAX, U32_MAX-1, 0, 1, true, false, true},
  100. {U32_MAX, U32_MAX-1, U32_MAX-2, 1, 2, true, false, true},
  101. {U32_MAX-1, U32_MAX, U32_MAX-2, U32_MAX, 2, true, true, true},
  102. {1U << 15, 1U << 15, 1U << 16, 0, 1U << 30, false, false, false},
  103. {1U << 16, 1U << 16, 1U << 17, 0, 0, false, false, true},
  104. {1U << 16, 1U << 15, 3*(1U << 15), 1U << 15, 1U << 31, false, false, false},
  105. {1U << 31, 1U << 31, 0, 0, 0, true, false, true},
  106. {-2U, 1U, -1U, -3U, -2U, false, false, false},
  107. {-4U, 5U, 1U, -9U, -20U, true, false, true},
  108. };
  109. DEFINE_TEST_ARRAY(u64) = {
  110. {0, 0, 0, 0, 0, false, false, false},
  111. {1, 1, 2, 0, 1, false, false, false},
  112. {0, 1, 1, U64_MAX, 0, false, true, false},
  113. {1, 0, 1, 1, 0, false, false, false},
  114. {0, U64_MAX, U64_MAX, 1, 0, false, true, false},
  115. {U64_MAX, 0, U64_MAX, U64_MAX, 0, false, false, false},
  116. {1, U64_MAX, 0, 2, U64_MAX, true, true, false},
  117. {U64_MAX, 1, 0, U64_MAX-1, U64_MAX, true, false, false},
  118. {U64_MAX, U64_MAX, U64_MAX-1, 0, 1, true, false, true},
  119. {U64_MAX, U64_MAX-1, U64_MAX-2, 1, 2, true, false, true},
  120. {U64_MAX-1, U64_MAX, U64_MAX-2, U64_MAX, 2, true, true, true},
  121. {1ULL << 31, 1ULL << 31, 1ULL << 32, 0, 1ULL << 62, false, false, false},
  122. {1ULL << 32, 1ULL << 32, 1ULL << 33, 0, 0, false, false, true},
  123. {1ULL << 32, 1ULL << 31, 3*(1ULL << 31), 1ULL << 31, 1ULL << 63, false, false, false},
  124. {1ULL << 63, 1ULL << 63, 0, 0, 0, true, false, true},
  125. {1000000000ULL /* 10^9 */, 10000000000ULL /* 10^10 */,
  126. 11000000000ULL, 18446744064709551616ULL, 10000000000000000000ULL,
  127. false, true, false},
  128. {-15ULL, 10ULL, -5ULL, -25ULL, -150ULL, false, false, true},
  129. };
  130. DEFINE_TEST_ARRAY(s8) = {
  131. {0, 0, 0, 0, 0, false, false, false},
  132. {0, S8_MAX, S8_MAX, -S8_MAX, 0, false, false, false},
  133. {S8_MAX, 0, S8_MAX, S8_MAX, 0, false, false, false},
  134. {0, S8_MIN, S8_MIN, S8_MIN, 0, false, true, false},
  135. {S8_MIN, 0, S8_MIN, S8_MIN, 0, false, false, false},
  136. {-1, S8_MIN, S8_MAX, S8_MAX, S8_MIN, true, false, true},
  137. {S8_MIN, -1, S8_MAX, -S8_MAX, S8_MIN, true, false, true},
  138. {-1, S8_MAX, S8_MAX-1, S8_MIN, -S8_MAX, false, false, false},
  139. {S8_MAX, -1, S8_MAX-1, S8_MIN, -S8_MAX, false, true, false},
  140. {-1, -S8_MAX, S8_MIN, S8_MAX-1, S8_MAX, false, false, false},
  141. {-S8_MAX, -1, S8_MIN, S8_MIN+2, S8_MAX, false, false, false},
  142. {1, S8_MIN, -S8_MAX, -S8_MAX, S8_MIN, false, true, false},
  143. {S8_MIN, 1, -S8_MAX, S8_MAX, S8_MIN, false, true, false},
  144. {1, S8_MAX, S8_MIN, S8_MIN+2, S8_MAX, true, false, false},
  145. {S8_MAX, 1, S8_MIN, S8_MAX-1, S8_MAX, true, false, false},
  146. {S8_MIN, S8_MIN, 0, 0, 0, true, false, true},
  147. {S8_MAX, S8_MAX, -2, 0, 1, true, false, true},
  148. {-4, -32, -36, 28, -128, false, false, true},
  149. {-4, 32, 28, -36, -128, false, false, false},
  150. };
  151. DEFINE_TEST_ARRAY(s16) = {
  152. {0, 0, 0, 0, 0, false, false, false},
  153. {0, S16_MAX, S16_MAX, -S16_MAX, 0, false, false, false},
  154. {S16_MAX, 0, S16_MAX, S16_MAX, 0, false, false, false},
  155. {0, S16_MIN, S16_MIN, S16_MIN, 0, false, true, false},
  156. {S16_MIN, 0, S16_MIN, S16_MIN, 0, false, false, false},
  157. {-1, S16_MIN, S16_MAX, S16_MAX, S16_MIN, true, false, true},
  158. {S16_MIN, -1, S16_MAX, -S16_MAX, S16_MIN, true, false, true},
  159. {-1, S16_MAX, S16_MAX-1, S16_MIN, -S16_MAX, false, false, false},
  160. {S16_MAX, -1, S16_MAX-1, S16_MIN, -S16_MAX, false, true, false},
  161. {-1, -S16_MAX, S16_MIN, S16_MAX-1, S16_MAX, false, false, false},
  162. {-S16_MAX, -1, S16_MIN, S16_MIN+2, S16_MAX, false, false, false},
  163. {1, S16_MIN, -S16_MAX, -S16_MAX, S16_MIN, false, true, false},
  164. {S16_MIN, 1, -S16_MAX, S16_MAX, S16_MIN, false, true, false},
  165. {1, S16_MAX, S16_MIN, S16_MIN+2, S16_MAX, true, false, false},
  166. {S16_MAX, 1, S16_MIN, S16_MAX-1, S16_MAX, true, false, false},
  167. {S16_MIN, S16_MIN, 0, 0, 0, true, false, true},
  168. {S16_MAX, S16_MAX, -2, 0, 1, true, false, true},
  169. };
  170. DEFINE_TEST_ARRAY(s32) = {
  171. {0, 0, 0, 0, 0, false, false, false},
  172. {0, S32_MAX, S32_MAX, -S32_MAX, 0, false, false, false},
  173. {S32_MAX, 0, S32_MAX, S32_MAX, 0, false, false, false},
  174. {0, S32_MIN, S32_MIN, S32_MIN, 0, false, true, false},
  175. {S32_MIN, 0, S32_MIN, S32_MIN, 0, false, false, false},
  176. {-1, S32_MIN, S32_MAX, S32_MAX, S32_MIN, true, false, true},
  177. {S32_MIN, -1, S32_MAX, -S32_MAX, S32_MIN, true, false, true},
  178. {-1, S32_MAX, S32_MAX-1, S32_MIN, -S32_MAX, false, false, false},
  179. {S32_MAX, -1, S32_MAX-1, S32_MIN, -S32_MAX, false, true, false},
  180. {-1, -S32_MAX, S32_MIN, S32_MAX-1, S32_MAX, false, false, false},
  181. {-S32_MAX, -1, S32_MIN, S32_MIN+2, S32_MAX, false, false, false},
  182. {1, S32_MIN, -S32_MAX, -S32_MAX, S32_MIN, false, true, false},
  183. {S32_MIN, 1, -S32_MAX, S32_MAX, S32_MIN, false, true, false},
  184. {1, S32_MAX, S32_MIN, S32_MIN+2, S32_MAX, true, false, false},
  185. {S32_MAX, 1, S32_MIN, S32_MAX-1, S32_MAX, true, false, false},
  186. {S32_MIN, S32_MIN, 0, 0, 0, true, false, true},
  187. {S32_MAX, S32_MAX, -2, 0, 1, true, false, true},
  188. };
  189. DEFINE_TEST_ARRAY(s64) = {
  190. {0, 0, 0, 0, 0, false, false, false},
  191. {0, S64_MAX, S64_MAX, -S64_MAX, 0, false, false, false},
  192. {S64_MAX, 0, S64_MAX, S64_MAX, 0, false, false, false},
  193. {0, S64_MIN, S64_MIN, S64_MIN, 0, false, true, false},
  194. {S64_MIN, 0, S64_MIN, S64_MIN, 0, false, false, false},
  195. {-1, S64_MIN, S64_MAX, S64_MAX, S64_MIN, true, false, true},
  196. {S64_MIN, -1, S64_MAX, -S64_MAX, S64_MIN, true, false, true},
  197. {-1, S64_MAX, S64_MAX-1, S64_MIN, -S64_MAX, false, false, false},
  198. {S64_MAX, -1, S64_MAX-1, S64_MIN, -S64_MAX, false, true, false},
  199. {-1, -S64_MAX, S64_MIN, S64_MAX-1, S64_MAX, false, false, false},
  200. {-S64_MAX, -1, S64_MIN, S64_MIN+2, S64_MAX, false, false, false},
  201. {1, S64_MIN, -S64_MAX, -S64_MAX, S64_MIN, false, true, false},
  202. {S64_MIN, 1, -S64_MAX, S64_MAX, S64_MIN, false, true, false},
  203. {1, S64_MAX, S64_MIN, S64_MIN+2, S64_MAX, true, false, false},
  204. {S64_MAX, 1, S64_MIN, S64_MAX-1, S64_MAX, true, false, false},
  205. {S64_MIN, S64_MIN, 0, 0, 0, true, false, true},
  206. {S64_MAX, S64_MAX, -2, 0, 1, true, false, true},
  207. {-1, -1, -2, 0, 1, false, false, false},
  208. {-1, -128, -129, 127, 128, false, false, false},
  209. {-128, -1, -129, -127, 128, false, false, false},
  210. {0, -S64_MAX, -S64_MAX, S64_MAX, 0, false, false, false},
  211. };
  212. #define check_one_op(t, fmt, op, sym, a, b, r, of) do { \
  213. int _a_orig = a, _a_bump = a + 1; \
  214. int _b_orig = b, _b_bump = b + 1; \
  215. bool _of; \
  216. t _r; \
  217. \
  218. _of = check_ ## op ## _overflow(a, b, &_r); \
  219. KUNIT_EXPECT_EQ_MSG(test, _of, of, \
  220. "expected check "fmt" "sym" "fmt" to%s overflow (type %s)\n", \
  221. a, b, of ? "" : " not", #t); \
  222. KUNIT_EXPECT_EQ_MSG(test, _r, r, \
  223. "expected check "fmt" "sym" "fmt" == "fmt", got "fmt" (type %s)\n", \
  224. a, b, r, _r, #t); \
  225. /* Check for internal macro side-effects. */ \
  226. _of = check_ ## op ## _overflow(_a_orig++, _b_orig++, &_r); \
  227. KUNIT_EXPECT_EQ_MSG(test, _a_orig, _a_bump, \
  228. "Unexpected check " #op " macro side-effect!\n"); \
  229. KUNIT_EXPECT_EQ_MSG(test, _b_orig, _b_bump, \
  230. "Unexpected check " #op " macro side-effect!\n"); \
  231. \
  232. _r = wrapping_ ## op(t, a, b); \
  233. KUNIT_EXPECT_TRUE_MSG(test, _r == r, \
  234. "expected wrap "fmt" "sym" "fmt" == "fmt", got "fmt" (type %s)\n", \
  235. a, b, r, _r, #t); \
  236. /* Check for internal macro side-effects. */ \
  237. _a_orig = a; \
  238. _b_orig = b; \
  239. _r = wrapping_ ## op(t, _a_orig++, _b_orig++); \
  240. KUNIT_EXPECT_EQ_MSG(test, _a_orig, _a_bump, \
  241. "Unexpected wrap " #op " macro side-effect!\n"); \
  242. KUNIT_EXPECT_EQ_MSG(test, _b_orig, _b_bump, \
  243. "Unexpected wrap " #op " macro side-effect!\n"); \
  244. } while (0)
  245. static int global_counter;
  246. static void bump_counter(void)
  247. {
  248. global_counter++;
  249. }
  250. static int get_index(void)
  251. {
  252. volatile int index = 0;
  253. bump_counter();
  254. return index;
  255. }
  256. #define check_self_op(fmt, op, sym, a, b) do { \
  257. typeof(a + 0) _a = a; \
  258. typeof(b + 0) _b = b; \
  259. typeof(a + 0) _a_sym = a; \
  260. typeof(a + 0) _a_orig[1] = { a }; \
  261. typeof(b + 0) _b_orig = b; \
  262. typeof(b + 0) _b_bump = b + 1; \
  263. typeof(a + 0) _r; \
  264. \
  265. _a_sym sym _b; \
  266. _r = wrapping_ ## op(_a, _b); \
  267. KUNIT_EXPECT_TRUE_MSG(test, _r == _a_sym, \
  268. "expected "fmt" "#op" "fmt" == "fmt", got "fmt"\n", \
  269. a, b, _a_sym, _r); \
  270. KUNIT_EXPECT_TRUE_MSG(test, _a == _a_sym, \
  271. "expected "fmt" "#op" "fmt" == "fmt", got "fmt"\n", \
  272. a, b, _a_sym, _a); \
  273. /* Check for internal macro side-effects. */ \
  274. global_counter = 0; \
  275. wrapping_ ## op(_a_orig[get_index()], _b_orig++); \
  276. KUNIT_EXPECT_EQ_MSG(test, global_counter, 1, \
  277. "Unexpected wrapping_" #op " macro side-effect on arg1!\n"); \
  278. KUNIT_EXPECT_EQ_MSG(test, _b_orig, _b_bump, \
  279. "Unexpected wrapping_" #op " macro side-effect on arg2!\n"); \
  280. } while (0)
  281. #define DEFINE_TEST_FUNC_TYPED(n, t, fmt) \
  282. static void do_test_ ## n(struct kunit *test, const struct test_ ## n *p) \
  283. { \
  284. /* check_{add,sub,mul}_overflow() and wrapping_{add,sub,mul} */ \
  285. check_one_op(t, fmt, add, "+", p->a, p->b, p->sum, p->s_of); \
  286. check_one_op(t, fmt, add, "+", p->b, p->a, p->sum, p->s_of); \
  287. check_one_op(t, fmt, sub, "-", p->a, p->b, p->diff, p->d_of); \
  288. check_one_op(t, fmt, mul, "*", p->a, p->b, p->prod, p->p_of); \
  289. check_one_op(t, fmt, mul, "*", p->b, p->a, p->prod, p->p_of); \
  290. /* wrapping_assign_{add,sub}() */ \
  291. check_self_op(fmt, assign_add, +=, p->a, p->b); \
  292. check_self_op(fmt, assign_add, +=, p->b, p->a); \
  293. check_self_op(fmt, assign_sub, -=, p->a, p->b); \
  294. } \
  295. \
  296. static void n ## _overflow_test(struct kunit *test) { \
  297. unsigned i; \
  298. \
  299. SKIP_64_ON_32(__same_type(t, u64)); \
  300. SKIP_64_ON_32(__same_type(t, s64)); \
  301. SKIP_SIGN_MISMATCH(__same_type(n ## _tests[0].a, u32) && \
  302. __same_type(n ## _tests[0].b, u32) && \
  303. __same_type(n ## _tests[0].sum, int)); \
  304. \
  305. for (i = 0; i < ARRAY_SIZE(n ## _tests); ++i) \
  306. do_test_ ## n(test, &n ## _tests[i]); \
  307. kunit_info(test, "%zu %s arithmetic tests finished\n", \
  308. ARRAY_SIZE(n ## _tests), #n); \
  309. }
  310. #define DEFINE_TEST_FUNC(t, fmt) \
  311. DEFINE_TEST_FUNC_TYPED(t ## _ ## t ## __ ## t, t, fmt)
  312. DEFINE_TEST_FUNC(u8, "%d");
  313. DEFINE_TEST_FUNC(s8, "%d");
  314. DEFINE_TEST_FUNC(u16, "%d");
  315. DEFINE_TEST_FUNC(s16, "%d");
  316. DEFINE_TEST_FUNC(u32, "%u");
  317. DEFINE_TEST_FUNC(s32, "%d");
  318. DEFINE_TEST_FUNC(u64, "%llu");
  319. DEFINE_TEST_FUNC(s64, "%lld");
  320. DEFINE_TEST_ARRAY_TYPED(u32, u32, u8) = {
  321. {0, 0, 0, 0, 0, false, false, false},
  322. {U8_MAX, 2, 1, U8_MAX - 2, U8_MAX - 1, true, false, true},
  323. {U8_MAX + 1, 0, 0, 0, 0, true, true, false},
  324. };
  325. DEFINE_TEST_FUNC_TYPED(u32_u32__u8, u8, "%d");
  326. DEFINE_TEST_ARRAY_TYPED(u32, u32, int) = {
  327. {0, 0, 0, 0, 0, false, false, false},
  328. {U32_MAX, 0, -1, -1, 0, true, true, false},
  329. };
  330. DEFINE_TEST_FUNC_TYPED(u32_u32__int, int, "%d");
  331. DEFINE_TEST_ARRAY_TYPED(u8, u8, int) = {
  332. {0, 0, 0, 0, 0, false, false, false},
  333. {U8_MAX, U8_MAX, 2 * U8_MAX, 0, U8_MAX * U8_MAX, false, false, false},
  334. {1, 2, 3, -1, 2, false, false, false},
  335. };
  336. DEFINE_TEST_FUNC_TYPED(u8_u8__int, int, "%d");
  337. DEFINE_TEST_ARRAY_TYPED(int, int, u8) = {
  338. {0, 0, 0, 0, 0, false, false, false},
  339. {1, 2, 3, U8_MAX, 2, false, true, false},
  340. {-1, 0, U8_MAX, U8_MAX, 0, true, true, false},
  341. };
  342. DEFINE_TEST_FUNC_TYPED(int_int__u8, u8, "%d");
  343. /* Args are: value, shift, type, expected result, overflow expected */
  344. #define TEST_ONE_SHIFT(a, s, t, expect, of) do { \
  345. typeof(a) __a = (a); \
  346. typeof(s) __s = (s); \
  347. t __e = (expect); \
  348. t __d; \
  349. bool __of = check_shl_overflow(__a, __s, &__d); \
  350. if (__of != of) { \
  351. KUNIT_EXPECT_EQ_MSG(test, __of, of, \
  352. "expected (%s)(%s << %s) to%s overflow\n", \
  353. #t, #a, #s, of ? "" : " not"); \
  354. } else if (!__of && __d != __e) { \
  355. KUNIT_EXPECT_EQ_MSG(test, __d, __e, \
  356. "expected (%s)(%s << %s) == %s\n", \
  357. #t, #a, #s, #expect); \
  358. if ((t)-1 < 0) \
  359. kunit_info(test, "got %lld\n", (s64)__d); \
  360. else \
  361. kunit_info(test, "got %llu\n", (u64)__d); \
  362. } \
  363. count++; \
  364. } while (0)
  365. static void shift_sane_test(struct kunit *test)
  366. {
  367. int count = 0;
  368. /* Sane shifts. */
  369. TEST_ONE_SHIFT(1, 0, u8, 1 << 0, false);
  370. TEST_ONE_SHIFT(1, 4, u8, 1 << 4, false);
  371. TEST_ONE_SHIFT(1, 7, u8, 1 << 7, false);
  372. TEST_ONE_SHIFT(0xF, 4, u8, 0xF << 4, false);
  373. TEST_ONE_SHIFT(1, 0, u16, 1 << 0, false);
  374. TEST_ONE_SHIFT(1, 10, u16, 1 << 10, false);
  375. TEST_ONE_SHIFT(1, 15, u16, 1 << 15, false);
  376. TEST_ONE_SHIFT(0xFF, 8, u16, 0xFF << 8, false);
  377. TEST_ONE_SHIFT(1, 0, int, 1 << 0, false);
  378. TEST_ONE_SHIFT(1, 16, int, 1 << 16, false);
  379. TEST_ONE_SHIFT(1, 30, int, 1 << 30, false);
  380. TEST_ONE_SHIFT(1, 0, s32, 1 << 0, false);
  381. TEST_ONE_SHIFT(1, 16, s32, 1 << 16, false);
  382. TEST_ONE_SHIFT(1, 30, s32, 1 << 30, false);
  383. TEST_ONE_SHIFT(1, 0, unsigned int, 1U << 0, false);
  384. TEST_ONE_SHIFT(1, 20, unsigned int, 1U << 20, false);
  385. TEST_ONE_SHIFT(1, 31, unsigned int, 1U << 31, false);
  386. TEST_ONE_SHIFT(0xFFFFU, 16, unsigned int, 0xFFFFU << 16, false);
  387. TEST_ONE_SHIFT(1, 0, u32, 1U << 0, false);
  388. TEST_ONE_SHIFT(1, 20, u32, 1U << 20, false);
  389. TEST_ONE_SHIFT(1, 31, u32, 1U << 31, false);
  390. TEST_ONE_SHIFT(0xFFFFU, 16, u32, 0xFFFFU << 16, false);
  391. TEST_ONE_SHIFT(1, 0, u64, 1ULL << 0, false);
  392. TEST_ONE_SHIFT(1, 40, u64, 1ULL << 40, false);
  393. TEST_ONE_SHIFT(1, 63, u64, 1ULL << 63, false);
  394. TEST_ONE_SHIFT(0xFFFFFFFFULL, 32, u64, 0xFFFFFFFFULL << 32, false);
  395. /* Sane shift: start and end with 0, without a too-wide shift. */
  396. TEST_ONE_SHIFT(0, 7, u8, 0, false);
  397. TEST_ONE_SHIFT(0, 15, u16, 0, false);
  398. TEST_ONE_SHIFT(0, 31, unsigned int, 0, false);
  399. TEST_ONE_SHIFT(0, 31, u32, 0, false);
  400. TEST_ONE_SHIFT(0, 63, u64, 0, false);
  401. /* Sane shift: start and end with 0, without reaching signed bit. */
  402. TEST_ONE_SHIFT(0, 6, s8, 0, false);
  403. TEST_ONE_SHIFT(0, 14, s16, 0, false);
  404. TEST_ONE_SHIFT(0, 30, int, 0, false);
  405. TEST_ONE_SHIFT(0, 30, s32, 0, false);
  406. TEST_ONE_SHIFT(0, 62, s64, 0, false);
  407. kunit_info(test, "%d sane shift tests finished\n", count);
  408. }
  409. static void shift_overflow_test(struct kunit *test)
  410. {
  411. int count = 0;
  412. /* Overflow: shifted the bit off the end. */
  413. TEST_ONE_SHIFT(1, 8, u8, 0, true);
  414. TEST_ONE_SHIFT(1, 16, u16, 0, true);
  415. TEST_ONE_SHIFT(1, 32, unsigned int, 0, true);
  416. TEST_ONE_SHIFT(1, 32, u32, 0, true);
  417. TEST_ONE_SHIFT(1, 64, u64, 0, true);
  418. /* Overflow: shifted into the signed bit. */
  419. TEST_ONE_SHIFT(1, 7, s8, 0, true);
  420. TEST_ONE_SHIFT(1, 15, s16, 0, true);
  421. TEST_ONE_SHIFT(1, 31, int, 0, true);
  422. TEST_ONE_SHIFT(1, 31, s32, 0, true);
  423. TEST_ONE_SHIFT(1, 63, s64, 0, true);
  424. /* Overflow: high bit falls off unsigned types. */
  425. /* 10010110 */
  426. TEST_ONE_SHIFT(150, 1, u8, 0, true);
  427. /* 1000100010010110 */
  428. TEST_ONE_SHIFT(34966, 1, u16, 0, true);
  429. /* 10000100000010001000100010010110 */
  430. TEST_ONE_SHIFT(2215151766U, 1, u32, 0, true);
  431. TEST_ONE_SHIFT(2215151766U, 1, unsigned int, 0, true);
  432. /* 1000001000010000010000000100000010000100000010001000100010010110 */
  433. TEST_ONE_SHIFT(9372061470395238550ULL, 1, u64, 0, true);
  434. /* Overflow: bit shifted into signed bit on signed types. */
  435. /* 01001011 */
  436. TEST_ONE_SHIFT(75, 1, s8, 0, true);
  437. /* 0100010001001011 */
  438. TEST_ONE_SHIFT(17483, 1, s16, 0, true);
  439. /* 01000010000001000100010001001011 */
  440. TEST_ONE_SHIFT(1107575883, 1, s32, 0, true);
  441. TEST_ONE_SHIFT(1107575883, 1, int, 0, true);
  442. /* 0100000100001000001000000010000001000010000001000100010001001011 */
  443. TEST_ONE_SHIFT(4686030735197619275LL, 1, s64, 0, true);
  444. /* Overflow: bit shifted past signed bit on signed types. */
  445. /* 01001011 */
  446. TEST_ONE_SHIFT(75, 2, s8, 0, true);
  447. /* 0100010001001011 */
  448. TEST_ONE_SHIFT(17483, 2, s16, 0, true);
  449. /* 01000010000001000100010001001011 */
  450. TEST_ONE_SHIFT(1107575883, 2, s32, 0, true);
  451. TEST_ONE_SHIFT(1107575883, 2, int, 0, true);
  452. /* 0100000100001000001000000010000001000010000001000100010001001011 */
  453. TEST_ONE_SHIFT(4686030735197619275LL, 2, s64, 0, true);
  454. kunit_info(test, "%d overflow shift tests finished\n", count);
  455. }
  456. static void shift_truncate_test(struct kunit *test)
  457. {
  458. int count = 0;
  459. /* Overflow: values larger than destination type. */
  460. TEST_ONE_SHIFT(0x100, 0, u8, 0, true);
  461. TEST_ONE_SHIFT(0xFF, 0, s8, 0, true);
  462. TEST_ONE_SHIFT(0x10000U, 0, u16, 0, true);
  463. TEST_ONE_SHIFT(0xFFFFU, 0, s16, 0, true);
  464. TEST_ONE_SHIFT(0x100000000ULL, 0, u32, 0, true);
  465. TEST_ONE_SHIFT(0x100000000ULL, 0, unsigned int, 0, true);
  466. TEST_ONE_SHIFT(0xFFFFFFFFUL, 0, s32, 0, true);
  467. TEST_ONE_SHIFT(0xFFFFFFFFUL, 0, int, 0, true);
  468. TEST_ONE_SHIFT(0xFFFFFFFFFFFFFFFFULL, 0, s64, 0, true);
  469. /* Overflow: shifted at or beyond entire type's bit width. */
  470. TEST_ONE_SHIFT(0, 8, u8, 0, true);
  471. TEST_ONE_SHIFT(0, 9, u8, 0, true);
  472. TEST_ONE_SHIFT(0, 8, s8, 0, true);
  473. TEST_ONE_SHIFT(0, 9, s8, 0, true);
  474. TEST_ONE_SHIFT(0, 16, u16, 0, true);
  475. TEST_ONE_SHIFT(0, 17, u16, 0, true);
  476. TEST_ONE_SHIFT(0, 16, s16, 0, true);
  477. TEST_ONE_SHIFT(0, 17, s16, 0, true);
  478. TEST_ONE_SHIFT(0, 32, u32, 0, true);
  479. TEST_ONE_SHIFT(0, 33, u32, 0, true);
  480. TEST_ONE_SHIFT(0, 32, int, 0, true);
  481. TEST_ONE_SHIFT(0, 33, int, 0, true);
  482. TEST_ONE_SHIFT(0, 32, s32, 0, true);
  483. TEST_ONE_SHIFT(0, 33, s32, 0, true);
  484. TEST_ONE_SHIFT(0, 64, u64, 0, true);
  485. TEST_ONE_SHIFT(0, 65, u64, 0, true);
  486. TEST_ONE_SHIFT(0, 64, s64, 0, true);
  487. TEST_ONE_SHIFT(0, 65, s64, 0, true);
  488. kunit_info(test, "%d truncate shift tests finished\n", count);
  489. }
  490. static void shift_nonsense_test(struct kunit *test)
  491. {
  492. int count = 0;
  493. /* Nonsense: negative initial value. */
  494. TEST_ONE_SHIFT(-1, 0, s8, 0, true);
  495. TEST_ONE_SHIFT(-1, 0, u8, 0, true);
  496. TEST_ONE_SHIFT(-5, 0, s16, 0, true);
  497. TEST_ONE_SHIFT(-5, 0, u16, 0, true);
  498. TEST_ONE_SHIFT(-10, 0, int, 0, true);
  499. TEST_ONE_SHIFT(-10, 0, unsigned int, 0, true);
  500. TEST_ONE_SHIFT(-100, 0, s32, 0, true);
  501. TEST_ONE_SHIFT(-100, 0, u32, 0, true);
  502. TEST_ONE_SHIFT(-10000, 0, s64, 0, true);
  503. TEST_ONE_SHIFT(-10000, 0, u64, 0, true);
  504. /* Nonsense: negative shift values. */
  505. TEST_ONE_SHIFT(0, -5, s8, 0, true);
  506. TEST_ONE_SHIFT(0, -5, u8, 0, true);
  507. TEST_ONE_SHIFT(0, -10, s16, 0, true);
  508. TEST_ONE_SHIFT(0, -10, u16, 0, true);
  509. TEST_ONE_SHIFT(0, -15, int, 0, true);
  510. TEST_ONE_SHIFT(0, -15, unsigned int, 0, true);
  511. TEST_ONE_SHIFT(0, -20, s32, 0, true);
  512. TEST_ONE_SHIFT(0, -20, u32, 0, true);
  513. TEST_ONE_SHIFT(0, -30, s64, 0, true);
  514. TEST_ONE_SHIFT(0, -30, u64, 0, true);
  515. /*
  516. * Corner case: for unsigned types, we fail when we've shifted
  517. * through the entire width of bits. For signed types, we might
  518. * want to match this behavior, but that would mean noticing if
  519. * we shift through all but the signed bit, and this is not
  520. * currently detected (but we'll notice an overflow into the
  521. * signed bit). So, for now, we will test this condition but
  522. * mark it as not expected to overflow.
  523. */
  524. TEST_ONE_SHIFT(0, 7, s8, 0, false);
  525. TEST_ONE_SHIFT(0, 15, s16, 0, false);
  526. TEST_ONE_SHIFT(0, 31, int, 0, false);
  527. TEST_ONE_SHIFT(0, 31, s32, 0, false);
  528. TEST_ONE_SHIFT(0, 63, s64, 0, false);
  529. kunit_info(test, "%d nonsense shift tests finished\n", count);
  530. }
  531. #undef TEST_ONE_SHIFT
  532. /*
  533. * Deal with the various forms of allocator arguments. See comments above
  534. * the DEFINE_TEST_ALLOC() instances for mapping of the "bits".
  535. */
  536. #define alloc_GFP (GFP_KERNEL | __GFP_NOWARN)
  537. #define alloc010(alloc, arg, sz) alloc(sz, alloc_GFP)
  538. #define alloc011(alloc, arg, sz) alloc(sz, alloc_GFP, NUMA_NO_NODE)
  539. #define alloc000(alloc, arg, sz) alloc(sz)
  540. #define alloc001(alloc, arg, sz) alloc(sz, NUMA_NO_NODE)
  541. #define alloc110(alloc, arg, sz) alloc(arg, sz, alloc_GFP)
  542. #define free0(free, arg, ptr) free(ptr)
  543. #define free1(free, arg, ptr) free(arg, ptr)
  544. /* Wrap around to 16K */
  545. #define TEST_SIZE (5 * 4096)
  546. #define DEFINE_TEST_ALLOC(func, free_func, want_arg, want_gfp, want_node)\
  547. static void test_ ## func (struct kunit *test, void *arg) \
  548. { \
  549. volatile size_t a = TEST_SIZE; \
  550. volatile size_t b = (SIZE_MAX / TEST_SIZE) + 1; \
  551. void *ptr; \
  552. \
  553. /* Tiny allocation test. */ \
  554. ptr = alloc ## want_arg ## want_gfp ## want_node (func, arg, 1);\
  555. KUNIT_ASSERT_NOT_ERR_OR_NULL_MSG(test, ptr, \
  556. #func " failed regular allocation?!\n"); \
  557. free ## want_arg (free_func, arg, ptr); \
  558. \
  559. /* Wrapped allocation test. */ \
  560. ptr = alloc ## want_arg ## want_gfp ## want_node (func, arg, \
  561. a * b); \
  562. KUNIT_ASSERT_NOT_ERR_OR_NULL_MSG(test, ptr, \
  563. #func " unexpectedly failed bad wrapping?!\n"); \
  564. free ## want_arg (free_func, arg, ptr); \
  565. \
  566. /* Saturated allocation test. */ \
  567. ptr = alloc ## want_arg ## want_gfp ## want_node (func, arg, \
  568. array_size(a, b)); \
  569. if (ptr) { \
  570. KUNIT_FAIL(test, #func " missed saturation!\n"); \
  571. free ## want_arg (free_func, arg, ptr); \
  572. } \
  573. }
  574. /*
  575. * Allocator uses a trailing node argument --------+ (e.g. kmalloc_node())
  576. * Allocator uses the gfp_t argument -----------+ | (e.g. kmalloc())
  577. * Allocator uses a special leading argument + | | (e.g. devm_kmalloc())
  578. * | | |
  579. */
  580. DEFINE_TEST_ALLOC(kmalloc, kfree, 0, 1, 0);
  581. DEFINE_TEST_ALLOC(kmalloc_node, kfree, 0, 1, 1);
  582. DEFINE_TEST_ALLOC(kzalloc, kfree, 0, 1, 0);
  583. DEFINE_TEST_ALLOC(kzalloc_node, kfree, 0, 1, 1);
  584. DEFINE_TEST_ALLOC(__vmalloc, vfree, 0, 1, 0);
  585. DEFINE_TEST_ALLOC(kvmalloc, kvfree, 0, 1, 0);
  586. DEFINE_TEST_ALLOC(kvmalloc_node, kvfree, 0, 1, 1);
  587. DEFINE_TEST_ALLOC(kvzalloc, kvfree, 0, 1, 0);
  588. DEFINE_TEST_ALLOC(kvzalloc_node, kvfree, 0, 1, 1);
  589. DEFINE_TEST_ALLOC(devm_kmalloc, devm_kfree, 1, 1, 0);
  590. DEFINE_TEST_ALLOC(devm_kzalloc, devm_kfree, 1, 1, 0);
  591. static void overflow_allocation_test(struct kunit *test)
  592. {
  593. struct device *dev;
  594. int count = 0;
  595. #define check_allocation_overflow(alloc) do { \
  596. count++; \
  597. test_ ## alloc(test, dev); \
  598. } while (0)
  599. /* Create dummy device for devm_kmalloc()-family tests. */
  600. dev = kunit_device_register(test, "overflow-test");
  601. KUNIT_ASSERT_FALSE_MSG(test, IS_ERR(dev),
  602. "Cannot register test device\n");
  603. check_allocation_overflow(kmalloc);
  604. check_allocation_overflow(kmalloc_node);
  605. check_allocation_overflow(kzalloc);
  606. check_allocation_overflow(kzalloc_node);
  607. check_allocation_overflow(__vmalloc);
  608. check_allocation_overflow(kvmalloc);
  609. check_allocation_overflow(kvmalloc_node);
  610. check_allocation_overflow(kvzalloc);
  611. check_allocation_overflow(kvzalloc_node);
  612. check_allocation_overflow(devm_kmalloc);
  613. check_allocation_overflow(devm_kzalloc);
  614. kunit_info(test, "%d allocation overflow tests finished\n", count);
  615. #undef check_allocation_overflow
  616. }
  617. struct __test_flex_array {
  618. unsigned long flags;
  619. size_t count;
  620. unsigned long data[];
  621. };
  622. static void overflow_size_helpers_test(struct kunit *test)
  623. {
  624. /* Make sure struct_size() can be used in a constant expression. */
  625. u8 ce_array[struct_size_t(struct __test_flex_array, data, 55)];
  626. struct __test_flex_array *obj;
  627. int count = 0;
  628. int var;
  629. volatile int unconst = 0;
  630. /* Verify constant expression against runtime version. */
  631. var = 55;
  632. OPTIMIZER_HIDE_VAR(var);
  633. KUNIT_EXPECT_EQ(test, sizeof(ce_array), struct_size(obj, data, var));
  634. #define check_one_size_helper(expected, func, args...) do { \
  635. size_t _r = func(args); \
  636. KUNIT_EXPECT_EQ_MSG(test, _r, expected, \
  637. "expected " #func "(" #args ") to return %zu but got %zu instead\n", \
  638. (size_t)(expected), _r); \
  639. count++; \
  640. } while (0)
  641. var = 4;
  642. check_one_size_helper(20, size_mul, var++, 5);
  643. check_one_size_helper(20, size_mul, 4, var++);
  644. check_one_size_helper(0, size_mul, 0, 3);
  645. check_one_size_helper(0, size_mul, 3, 0);
  646. check_one_size_helper(6, size_mul, 2, 3);
  647. check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, 1);
  648. check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, 3);
  649. check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, -3);
  650. var = 4;
  651. check_one_size_helper(9, size_add, var++, 5);
  652. check_one_size_helper(9, size_add, 4, var++);
  653. check_one_size_helper(9, size_add, 9, 0);
  654. check_one_size_helper(9, size_add, 0, 9);
  655. check_one_size_helper(5, size_add, 2, 3);
  656. check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, 1);
  657. check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, 3);
  658. check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, -3);
  659. var = 4;
  660. check_one_size_helper(1, size_sub, var--, 3);
  661. check_one_size_helper(1, size_sub, 4, var--);
  662. check_one_size_helper(1, size_sub, 3, 2);
  663. check_one_size_helper(9, size_sub, 9, 0);
  664. check_one_size_helper(SIZE_MAX, size_sub, 9, -3);
  665. check_one_size_helper(SIZE_MAX, size_sub, 0, 9);
  666. check_one_size_helper(SIZE_MAX, size_sub, 2, 3);
  667. check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX, 0);
  668. check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX, 10);
  669. check_one_size_helper(SIZE_MAX, size_sub, 0, SIZE_MAX);
  670. check_one_size_helper(SIZE_MAX, size_sub, 14, SIZE_MAX);
  671. check_one_size_helper(SIZE_MAX - 2, size_sub, SIZE_MAX - 1, 1);
  672. check_one_size_helper(SIZE_MAX - 4, size_sub, SIZE_MAX - 1, 3);
  673. check_one_size_helper(1, size_sub, SIZE_MAX - 1, -3);
  674. var = 4;
  675. check_one_size_helper(4 * sizeof(*obj->data),
  676. flex_array_size, obj, data, var++);
  677. check_one_size_helper(5 * sizeof(*obj->data),
  678. flex_array_size, obj, data, var++);
  679. check_one_size_helper(0, flex_array_size, obj, data, 0 + unconst);
  680. check_one_size_helper(sizeof(*obj->data),
  681. flex_array_size, obj, data, 1 + unconst);
  682. check_one_size_helper(7 * sizeof(*obj->data),
  683. flex_array_size, obj, data, 7 + unconst);
  684. check_one_size_helper(SIZE_MAX,
  685. flex_array_size, obj, data, -1 + unconst);
  686. check_one_size_helper(SIZE_MAX,
  687. flex_array_size, obj, data, SIZE_MAX - 4 + unconst);
  688. var = 4;
  689. check_one_size_helper(sizeof(*obj) + (4 * sizeof(*obj->data)),
  690. struct_size, obj, data, var++);
  691. check_one_size_helper(sizeof(*obj) + (5 * sizeof(*obj->data)),
  692. struct_size, obj, data, var++);
  693. check_one_size_helper(sizeof(*obj), struct_size, obj, data, 0 + unconst);
  694. check_one_size_helper(sizeof(*obj) + sizeof(*obj->data),
  695. struct_size, obj, data, 1 + unconst);
  696. check_one_size_helper(SIZE_MAX,
  697. struct_size, obj, data, -3 + unconst);
  698. check_one_size_helper(SIZE_MAX,
  699. struct_size, obj, data, SIZE_MAX - 3 + unconst);
  700. kunit_info(test, "%d overflow size helper tests finished\n", count);
  701. #undef check_one_size_helper
  702. }
  703. static void overflows_type_test(struct kunit *test)
  704. {
  705. int count = 0;
  706. unsigned int var;
  707. #define __TEST_OVERFLOWS_TYPE(func, arg1, arg2, of) do { \
  708. bool __of = func(arg1, arg2); \
  709. KUNIT_EXPECT_EQ_MSG(test, __of, of, \
  710. "expected " #func "(" #arg1 ", " #arg2 " to%s overflow\n",\
  711. of ? "" : " not"); \
  712. count++; \
  713. } while (0)
  714. /* Args are: first type, second type, value, overflow expected */
  715. #define TEST_OVERFLOWS_TYPE(__t1, __t2, v, of) do { \
  716. __t1 t1 = (v); \
  717. __t2 t2; \
  718. __TEST_OVERFLOWS_TYPE(__overflows_type, t1, t2, of); \
  719. __TEST_OVERFLOWS_TYPE(__overflows_type, t1, __t2, of); \
  720. __TEST_OVERFLOWS_TYPE(__overflows_type_constexpr, t1, t2, of); \
  721. __TEST_OVERFLOWS_TYPE(__overflows_type_constexpr, t1, __t2, of);\
  722. } while (0)
  723. TEST_OVERFLOWS_TYPE(u8, u8, U8_MAX, false);
  724. TEST_OVERFLOWS_TYPE(u8, u16, U8_MAX, false);
  725. TEST_OVERFLOWS_TYPE(u8, s8, U8_MAX, true);
  726. TEST_OVERFLOWS_TYPE(u8, s8, S8_MAX, false);
  727. TEST_OVERFLOWS_TYPE(u8, s8, (u8)S8_MAX + 1, true);
  728. TEST_OVERFLOWS_TYPE(u8, s16, U8_MAX, false);
  729. TEST_OVERFLOWS_TYPE(s8, u8, S8_MAX, false);
  730. TEST_OVERFLOWS_TYPE(s8, u8, -1, true);
  731. TEST_OVERFLOWS_TYPE(s8, u8, S8_MIN, true);
  732. TEST_OVERFLOWS_TYPE(s8, u16, S8_MAX, false);
  733. TEST_OVERFLOWS_TYPE(s8, u16, -1, true);
  734. TEST_OVERFLOWS_TYPE(s8, u16, S8_MIN, true);
  735. TEST_OVERFLOWS_TYPE(s8, u32, S8_MAX, false);
  736. TEST_OVERFLOWS_TYPE(s8, u32, -1, true);
  737. TEST_OVERFLOWS_TYPE(s8, u32, S8_MIN, true);
  738. #if BITS_PER_LONG == 64
  739. TEST_OVERFLOWS_TYPE(s8, u64, S8_MAX, false);
  740. TEST_OVERFLOWS_TYPE(s8, u64, -1, true);
  741. TEST_OVERFLOWS_TYPE(s8, u64, S8_MIN, true);
  742. #endif
  743. TEST_OVERFLOWS_TYPE(s8, s8, S8_MAX, false);
  744. TEST_OVERFLOWS_TYPE(s8, s8, S8_MIN, false);
  745. TEST_OVERFLOWS_TYPE(s8, s16, S8_MAX, false);
  746. TEST_OVERFLOWS_TYPE(s8, s16, S8_MIN, false);
  747. TEST_OVERFLOWS_TYPE(u16, u8, U8_MAX, false);
  748. TEST_OVERFLOWS_TYPE(u16, u8, (u16)U8_MAX + 1, true);
  749. TEST_OVERFLOWS_TYPE(u16, u8, U16_MAX, true);
  750. TEST_OVERFLOWS_TYPE(u16, s8, S8_MAX, false);
  751. TEST_OVERFLOWS_TYPE(u16, s8, (u16)S8_MAX + 1, true);
  752. TEST_OVERFLOWS_TYPE(u16, s8, U16_MAX, true);
  753. TEST_OVERFLOWS_TYPE(u16, s16, S16_MAX, false);
  754. TEST_OVERFLOWS_TYPE(u16, s16, (u16)S16_MAX + 1, true);
  755. TEST_OVERFLOWS_TYPE(u16, s16, U16_MAX, true);
  756. TEST_OVERFLOWS_TYPE(u16, u32, U16_MAX, false);
  757. TEST_OVERFLOWS_TYPE(u16, s32, U16_MAX, false);
  758. TEST_OVERFLOWS_TYPE(s16, u8, U8_MAX, false);
  759. TEST_OVERFLOWS_TYPE(s16, u8, (s16)U8_MAX + 1, true);
  760. TEST_OVERFLOWS_TYPE(s16, u8, -1, true);
  761. TEST_OVERFLOWS_TYPE(s16, u8, S16_MIN, true);
  762. TEST_OVERFLOWS_TYPE(s16, u16, S16_MAX, false);
  763. TEST_OVERFLOWS_TYPE(s16, u16, -1, true);
  764. TEST_OVERFLOWS_TYPE(s16, u16, S16_MIN, true);
  765. TEST_OVERFLOWS_TYPE(s16, u32, S16_MAX, false);
  766. TEST_OVERFLOWS_TYPE(s16, u32, -1, true);
  767. TEST_OVERFLOWS_TYPE(s16, u32, S16_MIN, true);
  768. #if BITS_PER_LONG == 64
  769. TEST_OVERFLOWS_TYPE(s16, u64, S16_MAX, false);
  770. TEST_OVERFLOWS_TYPE(s16, u64, -1, true);
  771. TEST_OVERFLOWS_TYPE(s16, u64, S16_MIN, true);
  772. #endif
  773. TEST_OVERFLOWS_TYPE(s16, s8, S8_MAX, false);
  774. TEST_OVERFLOWS_TYPE(s16, s8, S8_MIN, false);
  775. TEST_OVERFLOWS_TYPE(s16, s8, (s16)S8_MAX + 1, true);
  776. TEST_OVERFLOWS_TYPE(s16, s8, (s16)S8_MIN - 1, true);
  777. TEST_OVERFLOWS_TYPE(s16, s8, S16_MAX, true);
  778. TEST_OVERFLOWS_TYPE(s16, s8, S16_MIN, true);
  779. TEST_OVERFLOWS_TYPE(s16, s16, S16_MAX, false);
  780. TEST_OVERFLOWS_TYPE(s16, s16, S16_MIN, false);
  781. TEST_OVERFLOWS_TYPE(s16, s32, S16_MAX, false);
  782. TEST_OVERFLOWS_TYPE(s16, s32, S16_MIN, false);
  783. TEST_OVERFLOWS_TYPE(u32, u8, U8_MAX, false);
  784. TEST_OVERFLOWS_TYPE(u32, u8, (u32)U8_MAX + 1, true);
  785. TEST_OVERFLOWS_TYPE(u32, u8, U32_MAX, true);
  786. TEST_OVERFLOWS_TYPE(u32, s8, S8_MAX, false);
  787. TEST_OVERFLOWS_TYPE(u32, s8, (u32)S8_MAX + 1, true);
  788. TEST_OVERFLOWS_TYPE(u32, s8, U32_MAX, true);
  789. TEST_OVERFLOWS_TYPE(u32, u16, U16_MAX, false);
  790. TEST_OVERFLOWS_TYPE(u32, u16, U16_MAX + 1, true);
  791. TEST_OVERFLOWS_TYPE(u32, u16, U32_MAX, true);
  792. TEST_OVERFLOWS_TYPE(u32, s16, S16_MAX, false);
  793. TEST_OVERFLOWS_TYPE(u32, s16, (u32)S16_MAX + 1, true);
  794. TEST_OVERFLOWS_TYPE(u32, s16, U32_MAX, true);
  795. TEST_OVERFLOWS_TYPE(u32, u32, U32_MAX, false);
  796. TEST_OVERFLOWS_TYPE(u32, s32, S32_MAX, false);
  797. TEST_OVERFLOWS_TYPE(u32, s32, U32_MAX, true);
  798. TEST_OVERFLOWS_TYPE(u32, s32, (u32)S32_MAX + 1, true);
  799. #if BITS_PER_LONG == 64
  800. TEST_OVERFLOWS_TYPE(u32, u64, U32_MAX, false);
  801. TEST_OVERFLOWS_TYPE(u32, s64, U32_MAX, false);
  802. #endif
  803. TEST_OVERFLOWS_TYPE(s32, u8, U8_MAX, false);
  804. TEST_OVERFLOWS_TYPE(s32, u8, (s32)U8_MAX + 1, true);
  805. TEST_OVERFLOWS_TYPE(s32, u16, S32_MAX, true);
  806. TEST_OVERFLOWS_TYPE(s32, u8, -1, true);
  807. TEST_OVERFLOWS_TYPE(s32, u8, S32_MIN, true);
  808. TEST_OVERFLOWS_TYPE(s32, u16, U16_MAX, false);
  809. TEST_OVERFLOWS_TYPE(s32, u16, (s32)U16_MAX + 1, true);
  810. TEST_OVERFLOWS_TYPE(s32, u16, S32_MAX, true);
  811. TEST_OVERFLOWS_TYPE(s32, u16, -1, true);
  812. TEST_OVERFLOWS_TYPE(s32, u16, S32_MIN, true);
  813. TEST_OVERFLOWS_TYPE(s32, u32, S32_MAX, false);
  814. TEST_OVERFLOWS_TYPE(s32, u32, -1, true);
  815. TEST_OVERFLOWS_TYPE(s32, u32, S32_MIN, true);
  816. #if BITS_PER_LONG == 64
  817. TEST_OVERFLOWS_TYPE(s32, u64, S32_MAX, false);
  818. TEST_OVERFLOWS_TYPE(s32, u64, -1, true);
  819. TEST_OVERFLOWS_TYPE(s32, u64, S32_MIN, true);
  820. #endif
  821. TEST_OVERFLOWS_TYPE(s32, s8, S8_MAX, false);
  822. TEST_OVERFLOWS_TYPE(s32, s8, S8_MIN, false);
  823. TEST_OVERFLOWS_TYPE(s32, s8, (s32)S8_MAX + 1, true);
  824. TEST_OVERFLOWS_TYPE(s32, s8, (s32)S8_MIN - 1, true);
  825. TEST_OVERFLOWS_TYPE(s32, s8, S32_MAX, true);
  826. TEST_OVERFLOWS_TYPE(s32, s8, S32_MIN, true);
  827. TEST_OVERFLOWS_TYPE(s32, s16, S16_MAX, false);
  828. TEST_OVERFLOWS_TYPE(s32, s16, S16_MIN, false);
  829. TEST_OVERFLOWS_TYPE(s32, s16, (s32)S16_MAX + 1, true);
  830. TEST_OVERFLOWS_TYPE(s32, s16, (s32)S16_MIN - 1, true);
  831. TEST_OVERFLOWS_TYPE(s32, s16, S32_MAX, true);
  832. TEST_OVERFLOWS_TYPE(s32, s16, S32_MIN, true);
  833. TEST_OVERFLOWS_TYPE(s32, s32, S32_MAX, false);
  834. TEST_OVERFLOWS_TYPE(s32, s32, S32_MIN, false);
  835. #if BITS_PER_LONG == 64
  836. TEST_OVERFLOWS_TYPE(s32, s64, S32_MAX, false);
  837. TEST_OVERFLOWS_TYPE(s32, s64, S32_MIN, false);
  838. TEST_OVERFLOWS_TYPE(u64, u8, U64_MAX, true);
  839. TEST_OVERFLOWS_TYPE(u64, u8, U8_MAX, false);
  840. TEST_OVERFLOWS_TYPE(u64, u8, (u64)U8_MAX + 1, true);
  841. TEST_OVERFLOWS_TYPE(u64, u16, U64_MAX, true);
  842. TEST_OVERFLOWS_TYPE(u64, u16, U16_MAX, false);
  843. TEST_OVERFLOWS_TYPE(u64, u16, (u64)U16_MAX + 1, true);
  844. TEST_OVERFLOWS_TYPE(u64, u32, U64_MAX, true);
  845. TEST_OVERFLOWS_TYPE(u64, u32, U32_MAX, false);
  846. TEST_OVERFLOWS_TYPE(u64, u32, (u64)U32_MAX + 1, true);
  847. TEST_OVERFLOWS_TYPE(u64, u64, U64_MAX, false);
  848. TEST_OVERFLOWS_TYPE(u64, s8, S8_MAX, false);
  849. TEST_OVERFLOWS_TYPE(u64, s8, (u64)S8_MAX + 1, true);
  850. TEST_OVERFLOWS_TYPE(u64, s8, U64_MAX, true);
  851. TEST_OVERFLOWS_TYPE(u64, s16, S16_MAX, false);
  852. TEST_OVERFLOWS_TYPE(u64, s16, (u64)S16_MAX + 1, true);
  853. TEST_OVERFLOWS_TYPE(u64, s16, U64_MAX, true);
  854. TEST_OVERFLOWS_TYPE(u64, s32, S32_MAX, false);
  855. TEST_OVERFLOWS_TYPE(u64, s32, (u64)S32_MAX + 1, true);
  856. TEST_OVERFLOWS_TYPE(u64, s32, U64_MAX, true);
  857. TEST_OVERFLOWS_TYPE(u64, s64, S64_MAX, false);
  858. TEST_OVERFLOWS_TYPE(u64, s64, U64_MAX, true);
  859. TEST_OVERFLOWS_TYPE(u64, s64, (u64)S64_MAX + 1, true);
  860. TEST_OVERFLOWS_TYPE(s64, u8, S64_MAX, true);
  861. TEST_OVERFLOWS_TYPE(s64, u8, S64_MIN, true);
  862. TEST_OVERFLOWS_TYPE(s64, u8, -1, true);
  863. TEST_OVERFLOWS_TYPE(s64, u8, U8_MAX, false);
  864. TEST_OVERFLOWS_TYPE(s64, u8, (s64)U8_MAX + 1, true);
  865. TEST_OVERFLOWS_TYPE(s64, u16, S64_MAX, true);
  866. TEST_OVERFLOWS_TYPE(s64, u16, S64_MIN, true);
  867. TEST_OVERFLOWS_TYPE(s64, u16, -1, true);
  868. TEST_OVERFLOWS_TYPE(s64, u16, U16_MAX, false);
  869. TEST_OVERFLOWS_TYPE(s64, u16, (s64)U16_MAX + 1, true);
  870. TEST_OVERFLOWS_TYPE(s64, u32, S64_MAX, true);
  871. TEST_OVERFLOWS_TYPE(s64, u32, S64_MIN, true);
  872. TEST_OVERFLOWS_TYPE(s64, u32, -1, true);
  873. TEST_OVERFLOWS_TYPE(s64, u32, U32_MAX, false);
  874. TEST_OVERFLOWS_TYPE(s64, u32, (s64)U32_MAX + 1, true);
  875. TEST_OVERFLOWS_TYPE(s64, u64, S64_MAX, false);
  876. TEST_OVERFLOWS_TYPE(s64, u64, S64_MIN, true);
  877. TEST_OVERFLOWS_TYPE(s64, u64, -1, true);
  878. TEST_OVERFLOWS_TYPE(s64, s8, S8_MAX, false);
  879. TEST_OVERFLOWS_TYPE(s64, s8, S8_MIN, false);
  880. TEST_OVERFLOWS_TYPE(s64, s8, (s64)S8_MAX + 1, true);
  881. TEST_OVERFLOWS_TYPE(s64, s8, (s64)S8_MIN - 1, true);
  882. TEST_OVERFLOWS_TYPE(s64, s8, S64_MAX, true);
  883. TEST_OVERFLOWS_TYPE(s64, s16, S16_MAX, false);
  884. TEST_OVERFLOWS_TYPE(s64, s16, S16_MIN, false);
  885. TEST_OVERFLOWS_TYPE(s64, s16, (s64)S16_MAX + 1, true);
  886. TEST_OVERFLOWS_TYPE(s64, s16, (s64)S16_MIN - 1, true);
  887. TEST_OVERFLOWS_TYPE(s64, s16, S64_MAX, true);
  888. TEST_OVERFLOWS_TYPE(s64, s32, S32_MAX, false);
  889. TEST_OVERFLOWS_TYPE(s64, s32, S32_MIN, false);
  890. TEST_OVERFLOWS_TYPE(s64, s32, (s64)S32_MAX + 1, true);
  891. TEST_OVERFLOWS_TYPE(s64, s32, (s64)S32_MIN - 1, true);
  892. TEST_OVERFLOWS_TYPE(s64, s32, S64_MAX, true);
  893. TEST_OVERFLOWS_TYPE(s64, s64, S64_MAX, false);
  894. TEST_OVERFLOWS_TYPE(s64, s64, S64_MIN, false);
  895. #endif
  896. /* Check for macro side-effects. */
  897. var = INT_MAX - 1;
  898. __TEST_OVERFLOWS_TYPE(__overflows_type, var++, int, false);
  899. __TEST_OVERFLOWS_TYPE(__overflows_type, var++, int, false);
  900. __TEST_OVERFLOWS_TYPE(__overflows_type, var++, int, true);
  901. var = INT_MAX - 1;
  902. __TEST_OVERFLOWS_TYPE(overflows_type, var++, int, false);
  903. __TEST_OVERFLOWS_TYPE(overflows_type, var++, int, false);
  904. __TEST_OVERFLOWS_TYPE(overflows_type, var++, int, true);
  905. kunit_info(test, "%d overflows_type() tests finished\n", count);
  906. #undef TEST_OVERFLOWS_TYPE
  907. #undef __TEST_OVERFLOWS_TYPE
  908. }
  909. static void same_type_test(struct kunit *test)
  910. {
  911. int count = 0;
  912. int var;
  913. #define TEST_SAME_TYPE(t1, t2, same) do { \
  914. typeof(t1) __t1h = type_max(t1); \
  915. typeof(t1) __t1l = type_min(t1); \
  916. typeof(t2) __t2h = type_max(t2); \
  917. typeof(t2) __t2l = type_min(t2); \
  918. KUNIT_EXPECT_EQ(test, true, __same_type(t1, __t1h)); \
  919. KUNIT_EXPECT_EQ(test, true, __same_type(t1, __t1l)); \
  920. KUNIT_EXPECT_EQ(test, true, __same_type(__t1h, t1)); \
  921. KUNIT_EXPECT_EQ(test, true, __same_type(__t1l, t1)); \
  922. KUNIT_EXPECT_EQ(test, true, __same_type(t2, __t2h)); \
  923. KUNIT_EXPECT_EQ(test, true, __same_type(t2, __t2l)); \
  924. KUNIT_EXPECT_EQ(test, true, __same_type(__t2h, t2)); \
  925. KUNIT_EXPECT_EQ(test, true, __same_type(__t2l, t2)); \
  926. KUNIT_EXPECT_EQ(test, same, __same_type(t1, t2)); \
  927. KUNIT_EXPECT_EQ(test, same, __same_type(t2, __t1h)); \
  928. KUNIT_EXPECT_EQ(test, same, __same_type(t2, __t1l)); \
  929. KUNIT_EXPECT_EQ(test, same, __same_type(__t1h, t2)); \
  930. KUNIT_EXPECT_EQ(test, same, __same_type(__t1l, t2)); \
  931. KUNIT_EXPECT_EQ(test, same, __same_type(t1, __t2h)); \
  932. KUNIT_EXPECT_EQ(test, same, __same_type(t1, __t2l)); \
  933. KUNIT_EXPECT_EQ(test, same, __same_type(__t2h, t1)); \
  934. KUNIT_EXPECT_EQ(test, same, __same_type(__t2l, t1)); \
  935. } while (0)
  936. #if BITS_PER_LONG == 64
  937. # define TEST_SAME_TYPE64(base, t, m) TEST_SAME_TYPE(base, t, m)
  938. #else
  939. # define TEST_SAME_TYPE64(base, t, m) do { } while (0)
  940. #endif
  941. #define TEST_TYPE_SETS(base, mu8, mu16, mu32, ms8, ms16, ms32, mu64, ms64) \
  942. do { \
  943. TEST_SAME_TYPE(base, u8, mu8); \
  944. TEST_SAME_TYPE(base, u16, mu16); \
  945. TEST_SAME_TYPE(base, u32, mu32); \
  946. TEST_SAME_TYPE(base, s8, ms8); \
  947. TEST_SAME_TYPE(base, s16, ms16); \
  948. TEST_SAME_TYPE(base, s32, ms32); \
  949. TEST_SAME_TYPE64(base, u64, mu64); \
  950. TEST_SAME_TYPE64(base, s64, ms64); \
  951. } while (0)
  952. TEST_TYPE_SETS(u8, true, false, false, false, false, false, false, false);
  953. TEST_TYPE_SETS(u16, false, true, false, false, false, false, false, false);
  954. TEST_TYPE_SETS(u32, false, false, true, false, false, false, false, false);
  955. TEST_TYPE_SETS(s8, false, false, false, true, false, false, false, false);
  956. TEST_TYPE_SETS(s16, false, false, false, false, true, false, false, false);
  957. TEST_TYPE_SETS(s32, false, false, false, false, false, true, false, false);
  958. #if BITS_PER_LONG == 64
  959. TEST_TYPE_SETS(u64, false, false, false, false, false, false, true, false);
  960. TEST_TYPE_SETS(s64, false, false, false, false, false, false, false, true);
  961. #endif
  962. /* Check for macro side-effects. */
  963. var = 4;
  964. KUNIT_EXPECT_EQ(test, var, 4);
  965. KUNIT_EXPECT_TRUE(test, __same_type(var++, int));
  966. KUNIT_EXPECT_EQ(test, var, 4);
  967. KUNIT_EXPECT_TRUE(test, __same_type(int, var++));
  968. KUNIT_EXPECT_EQ(test, var, 4);
  969. KUNIT_EXPECT_TRUE(test, __same_type(var++, var++));
  970. KUNIT_EXPECT_EQ(test, var, 4);
  971. kunit_info(test, "%d __same_type() tests finished\n", count);
  972. #undef TEST_TYPE_SETS
  973. #undef TEST_SAME_TYPE64
  974. #undef TEST_SAME_TYPE
  975. }
  976. static void castable_to_type_test(struct kunit *test)
  977. {
  978. int count = 0;
  979. #define TEST_CASTABLE_TO_TYPE(arg1, arg2, pass) do { \
  980. bool __pass = castable_to_type(arg1, arg2); \
  981. KUNIT_EXPECT_EQ_MSG(test, __pass, pass, \
  982. "expected castable_to_type(" #arg1 ", " #arg2 ") to%s pass\n",\
  983. pass ? "" : " not"); \
  984. count++; \
  985. } while (0)
  986. TEST_CASTABLE_TO_TYPE(16, u8, true);
  987. TEST_CASTABLE_TO_TYPE(16, u16, true);
  988. TEST_CASTABLE_TO_TYPE(16, u32, true);
  989. TEST_CASTABLE_TO_TYPE(16, s8, true);
  990. TEST_CASTABLE_TO_TYPE(16, s16, true);
  991. TEST_CASTABLE_TO_TYPE(16, s32, true);
  992. TEST_CASTABLE_TO_TYPE(-16, s8, true);
  993. TEST_CASTABLE_TO_TYPE(-16, s16, true);
  994. TEST_CASTABLE_TO_TYPE(-16, s32, true);
  995. #if BITS_PER_LONG == 64
  996. TEST_CASTABLE_TO_TYPE(16, u64, true);
  997. TEST_CASTABLE_TO_TYPE(-16, s64, true);
  998. #endif
  999. #define TEST_CASTABLE_TO_TYPE_VAR(width) do { \
  1000. u ## width u ## width ## var = 0; \
  1001. s ## width s ## width ## var = 0; \
  1002. \
  1003. /* Constant expressions that fit types. */ \
  1004. TEST_CASTABLE_TO_TYPE(type_max(u ## width), u ## width, true); \
  1005. TEST_CASTABLE_TO_TYPE(type_min(u ## width), u ## width, true); \
  1006. TEST_CASTABLE_TO_TYPE(type_max(u ## width), u ## width ## var, true); \
  1007. TEST_CASTABLE_TO_TYPE(type_min(u ## width), u ## width ## var, true); \
  1008. TEST_CASTABLE_TO_TYPE(type_max(s ## width), s ## width, true); \
  1009. TEST_CASTABLE_TO_TYPE(type_min(s ## width), s ## width, true); \
  1010. TEST_CASTABLE_TO_TYPE(type_max(s ## width), s ## width ## var, true); \
  1011. TEST_CASTABLE_TO_TYPE(type_min(u ## width), s ## width ## var, true); \
  1012. /* Constant expressions that do not fit types. */ \
  1013. TEST_CASTABLE_TO_TYPE(type_max(u ## width), s ## width, false); \
  1014. TEST_CASTABLE_TO_TYPE(type_max(u ## width), s ## width ## var, false); \
  1015. TEST_CASTABLE_TO_TYPE(type_min(s ## width), u ## width, false); \
  1016. TEST_CASTABLE_TO_TYPE(type_min(s ## width), u ## width ## var, false); \
  1017. /* Non-constant expression with mismatched type. */ \
  1018. TEST_CASTABLE_TO_TYPE(s ## width ## var, u ## width, false); \
  1019. TEST_CASTABLE_TO_TYPE(u ## width ## var, s ## width, false); \
  1020. } while (0)
  1021. #define TEST_CASTABLE_TO_TYPE_RANGE(width) do { \
  1022. unsigned long big = U ## width ## _MAX; \
  1023. signed long small = S ## width ## _MIN; \
  1024. u ## width u ## width ## var = 0; \
  1025. s ## width s ## width ## var = 0; \
  1026. \
  1027. /* Constant expression in range. */ \
  1028. TEST_CASTABLE_TO_TYPE(U ## width ## _MAX, u ## width, true); \
  1029. TEST_CASTABLE_TO_TYPE(U ## width ## _MAX, u ## width ## var, true); \
  1030. TEST_CASTABLE_TO_TYPE(S ## width ## _MIN, s ## width, true); \
  1031. TEST_CASTABLE_TO_TYPE(S ## width ## _MIN, s ## width ## var, true); \
  1032. /* Constant expression out of range. */ \
  1033. TEST_CASTABLE_TO_TYPE((unsigned long)U ## width ## _MAX + 1, u ## width, false); \
  1034. TEST_CASTABLE_TO_TYPE((unsigned long)U ## width ## _MAX + 1, u ## width ## var, false); \
  1035. TEST_CASTABLE_TO_TYPE((signed long)S ## width ## _MIN - 1, s ## width, false); \
  1036. TEST_CASTABLE_TO_TYPE((signed long)S ## width ## _MIN - 1, s ## width ## var, false); \
  1037. /* Non-constant expression with mismatched type. */ \
  1038. TEST_CASTABLE_TO_TYPE(big, u ## width, false); \
  1039. TEST_CASTABLE_TO_TYPE(big, u ## width ## var, false); \
  1040. TEST_CASTABLE_TO_TYPE(small, s ## width, false); \
  1041. TEST_CASTABLE_TO_TYPE(small, s ## width ## var, false); \
  1042. } while (0)
  1043. TEST_CASTABLE_TO_TYPE_VAR(8);
  1044. TEST_CASTABLE_TO_TYPE_VAR(16);
  1045. TEST_CASTABLE_TO_TYPE_VAR(32);
  1046. #if BITS_PER_LONG == 64
  1047. TEST_CASTABLE_TO_TYPE_VAR(64);
  1048. #endif
  1049. TEST_CASTABLE_TO_TYPE_RANGE(8);
  1050. TEST_CASTABLE_TO_TYPE_RANGE(16);
  1051. #if BITS_PER_LONG == 64
  1052. TEST_CASTABLE_TO_TYPE_RANGE(32);
  1053. #endif
  1054. kunit_info(test, "%d castable_to_type() tests finished\n", count);
  1055. #undef TEST_CASTABLE_TO_TYPE_RANGE
  1056. #undef TEST_CASTABLE_TO_TYPE_VAR
  1057. #undef TEST_CASTABLE_TO_TYPE
  1058. }
  1059. struct foo {
  1060. int a;
  1061. u32 counter;
  1062. s16 array[] __counted_by(counter);
  1063. };
  1064. struct bar {
  1065. int a;
  1066. u32 counter;
  1067. s16 array[];
  1068. };
  1069. static void DEFINE_FLEX_test(struct kunit *test)
  1070. {
  1071. DEFINE_RAW_FLEX(struct bar, two, array, 2);
  1072. DEFINE_FLEX(struct foo, eight, array, counter, 8);
  1073. DEFINE_FLEX(struct foo, empty, array, counter, 0);
  1074. /* Using _RAW_ on a __counted_by struct will initialize "counter" to zero */
  1075. DEFINE_RAW_FLEX(struct foo, two_but_zero, array, 2);
  1076. int array_size_override = 0;
  1077. KUNIT_EXPECT_EQ(test, sizeof(*two), sizeof(struct bar));
  1078. KUNIT_EXPECT_EQ(test, __struct_size(two), sizeof(struct bar) + 2 * sizeof(s16));
  1079. KUNIT_EXPECT_EQ(test, __member_size(two), sizeof(struct bar) + 2 * sizeof(s16));
  1080. KUNIT_EXPECT_EQ(test, __struct_size(two->array), 2 * sizeof(s16));
  1081. KUNIT_EXPECT_EQ(test, __member_size(two->array), 2 * sizeof(s16));
  1082. KUNIT_EXPECT_EQ(test, sizeof(*eight), sizeof(struct foo));
  1083. KUNIT_EXPECT_EQ(test, __struct_size(eight), sizeof(struct foo) + 8 * sizeof(s16));
  1084. KUNIT_EXPECT_EQ(test, __member_size(eight), sizeof(struct foo) + 8 * sizeof(s16));
  1085. KUNIT_EXPECT_EQ(test, __struct_size(eight->array), 8 * sizeof(s16));
  1086. KUNIT_EXPECT_EQ(test, __member_size(eight->array), 8 * sizeof(s16));
  1087. KUNIT_EXPECT_EQ(test, sizeof(*empty), sizeof(struct foo));
  1088. KUNIT_EXPECT_EQ(test, __struct_size(empty), sizeof(struct foo));
  1089. KUNIT_EXPECT_EQ(test, __member_size(empty), sizeof(struct foo));
  1090. KUNIT_EXPECT_EQ(test, __struct_size(empty->array), 0);
  1091. KUNIT_EXPECT_EQ(test, __member_size(empty->array), 0);
  1092. KUNIT_EXPECT_EQ(test, STACK_FLEX_ARRAY_SIZE(two, array), 2);
  1093. KUNIT_EXPECT_EQ(test, STACK_FLEX_ARRAY_SIZE(eight, array), 8);
  1094. KUNIT_EXPECT_EQ(test, STACK_FLEX_ARRAY_SIZE(empty, array), 0);
  1095. /* If __counted_by is not being used, array size will have the on-stack size. */
  1096. if (!IS_ENABLED(CONFIG_CC_HAS_COUNTED_BY))
  1097. array_size_override = 2 * sizeof(s16);
  1098. KUNIT_EXPECT_EQ(test, sizeof(*two_but_zero), sizeof(struct foo));
  1099. KUNIT_EXPECT_EQ(test, __struct_size(two_but_zero), sizeof(struct foo) + 2 * sizeof(s16));
  1100. KUNIT_EXPECT_EQ(test, __member_size(two_but_zero), sizeof(struct foo) + 2 * sizeof(s16));
  1101. KUNIT_EXPECT_EQ(test, __struct_size(two_but_zero->array), array_size_override);
  1102. KUNIT_EXPECT_EQ(test, __member_size(two_but_zero->array), array_size_override);
  1103. }
  1104. static struct kunit_case overflow_test_cases[] = {
  1105. KUNIT_CASE(u8_u8__u8_overflow_test),
  1106. KUNIT_CASE(s8_s8__s8_overflow_test),
  1107. KUNIT_CASE(u16_u16__u16_overflow_test),
  1108. KUNIT_CASE(s16_s16__s16_overflow_test),
  1109. KUNIT_CASE(u32_u32__u32_overflow_test),
  1110. KUNIT_CASE(s32_s32__s32_overflow_test),
  1111. KUNIT_CASE(u64_u64__u64_overflow_test),
  1112. KUNIT_CASE(s64_s64__s64_overflow_test),
  1113. KUNIT_CASE(u32_u32__int_overflow_test),
  1114. KUNIT_CASE(u32_u32__u8_overflow_test),
  1115. KUNIT_CASE(u8_u8__int_overflow_test),
  1116. KUNIT_CASE(int_int__u8_overflow_test),
  1117. KUNIT_CASE(shift_sane_test),
  1118. KUNIT_CASE(shift_overflow_test),
  1119. KUNIT_CASE(shift_truncate_test),
  1120. KUNIT_CASE(shift_nonsense_test),
  1121. KUNIT_CASE(overflow_allocation_test),
  1122. KUNIT_CASE(overflow_size_helpers_test),
  1123. KUNIT_CASE(overflows_type_test),
  1124. KUNIT_CASE(same_type_test),
  1125. KUNIT_CASE(castable_to_type_test),
  1126. KUNIT_CASE(DEFINE_FLEX_test),
  1127. {}
  1128. };
  1129. static struct kunit_suite overflow_test_suite = {
  1130. .name = "overflow",
  1131. .test_cases = overflow_test_cases,
  1132. };
  1133. kunit_test_suite(overflow_test_suite);
  1134. MODULE_DESCRIPTION("Test cases for arithmetic overflow checks");
  1135. MODULE_LICENSE("Dual MIT/GPL");