]> granicus.if.org Git - check/commitdiff
fix formatting for ck_assert_(u)int_* calls if using % operator
authorbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Wed, 7 May 2014 01:32:50 +0000 (01:32 +0000)
committerbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Wed, 7 May 2014 01:32:50 +0000 (01:32 +0000)
If an expression is used in any of the ck_assert_(u)int_* calls
that uses the % operator, for example:

ck_assert_int_eq(fs.write.slot % fs.slots_per_sector, i+1);

the result was the "% f" would be interpreted as a format string.

This fix prevents the issue by passing the entire expression as a
string, and feeding the underlying printf a "%s" argument instead.

git-svn-id: svn+ssh://svn.code.sf.net/p/check/code/trunk@1126 64e312b2-a51f-0410-8e61-82d0ca0eb02a

AUTHORS
src/check.h.in
tests/check_check_master.c
tests/check_check_sub.c

diff --git a/AUTHORS b/AUTHORS
index 5e6d2a488b63a49200281e69999c8d8053599f5a..1d3bd37201c814a9b6212487143f7083ceb2f309 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -45,6 +45,7 @@ Contributors:
     lod                   (compiler warning)
     Bill Kolokithas       (more checkmk directives)
     Julien Godin          (configure.ac patch for Check example)
+    Kosma Moczek          (fix for string formatting in ck_assert_*() methods with %)
 
 Anybody who has contributed code to Check or Check's build system is
 considered an author.  Send patches to this file to 
index 4f22da0c99de9a07a62cd48fba73088710457061..47cff97002984920be8620a74d84434da5c46abd 100644 (file)
@@ -465,7 +465,7 @@ CK_DLL_EXP void CK_EXPORT _ck_assert_failed(const char *file, int line,
 #define _ck_assert_int(X, OP, Y) do { \
   intmax_t _ck_x = (X); \
   intmax_t _ck_y = (Y); \
-  ck_assert_msg(_ck_x OP _ck_y, "Assertion '"#X#OP#Y"' failed: "#X"==%jd, "#Y"==%jd", _ck_x, _ck_y); \
+  ck_assert_msg(_ck_x OP _ck_y, "Assertion '%s' failed: %s==%jd, %s==%jd", #X#OP#Y, #X, _ck_x, #Y, _ck_y); \
 } while (0)
 
 /**
@@ -550,7 +550,7 @@ CK_DLL_EXP void CK_EXPORT _ck_assert_failed(const char *file, int line,
 #define _ck_assert_uint(X, OP, Y) do { \
   uintmax_t _ck_x = (X); \
   uintmax_t _ck_y = (Y); \
-  ck_assert_msg(_ck_x OP _ck_y, "Assertion '"#X#OP#Y"' failed: "#X"==%ju, "#Y"==%ju", _ck_x, _ck_y); \
+  ck_assert_msg(_ck_x OP _ck_y, "Assertion '%s' failed: %s==%ju, %s==%ju", #X#OP#Y, #X, _ck_x, #Y, _ck_y); \
 } while (0)
 /**
  * Check two unsigned integers to determine if X==Y
@@ -638,7 +638,7 @@ CK_DLL_EXP void CK_EXPORT _ck_assert_failed(const char *file, int line,
   const char* _ck_x = (X); \
   const char* _ck_y = (Y); \
   ck_assert_msg(0 OP strcmp(_ck_y, _ck_x), \
-    "Assertion '"#X#OP#Y"' failed: "#X"==\"%s\", "#Y"==\"%s\"", _ck_x, _ck_y); \
+    "Assertion '%s' failed: %s==\"%s\", %s==\"%s\"", #X#OP#Y, #X, _ck_x, #Y, _ck_y); \
 } while (0)
 /**
  * Check two strings to determine if 0==strcmp(X,Y)
@@ -724,7 +724,7 @@ CK_DLL_EXP void CK_EXPORT _ck_assert_failed(const char *file, int line,
 #define _ck_assert_ptr(X, OP, Y) do { \
   const void* _ck_x = (X); \
   const void* _ck_y = (Y); \
-  ck_assert_msg(_ck_x OP _ck_y, "Assertion '"#X#OP#Y"' failed: "#X"==%#x, "#Y"==%#x", _ck_x, _ck_y); \
+  ck_assert_msg(_ck_x OP _ck_y, "Assertion '%s' failed: %s==%#x, %s==%#x", #X#OP#Y, #X, _ck_x, #Y, _ck_y); \
 } while (0)
 
 /**
index 4ec681583ee1527a4f5a7de573600182c3055a31..570ebf82c27e1a1272aa4fe8a9f004b64dd30e26 100644 (file)
@@ -54,18 +54,30 @@ static master_test_t master_tests[] = {
   { "Simple Tests", CK_FAILURE, "Assertion 'x == y' failed" },
   { "Simple Tests", CK_FAILURE, "Assertion '0' failed" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x==y' failed: x==3, y==4" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d==2%f' failed: 3%d==1, 2%f==0" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x!=y' failed: x==3, y==3" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d!=3%f' failed: 3%d==1, 3%f==1" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x<x' failed: x==2, x==2" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d<3%f' failed: 3%d==1, 3%f==0" },
   { "Simple Tests", CK_FAILURE, "Assertion 'y<=x' failed: y==3, x==2" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d<=2%f' failed: 3%d==1, 2%f==0" },
   { "Simple Tests", CK_FAILURE, "Assertion 'y>y' failed: y==3, y==3" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d>3%f' failed: 3%d==0, 3%f==1" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x>=y' failed: x==2, y==3" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d>=4%f' failed: 3%d==0, 4%f==1" },
   { "Simple Tests", CK_PASS,    "Passed" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x==y' failed: x==3, y==4" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d==1%f' failed: 3%d==1, 1%f==0" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x!=y' failed: x==3, y==3" },
+  { "Simple Tests", CK_FAILURE, "Assertion '1%d!=1%f' failed: 1%d==0, 1%f==0" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x<x' failed: x==2, x==2" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d<1%f' failed: 3%d==1, 1%f==0" },
   { "Simple Tests", CK_FAILURE, "Assertion 'y<=x' failed: y==3, x==2" },
+  { "Simple Tests", CK_FAILURE, "Assertion '3%d<=1%f' failed: 3%d==1, 1%f==0" },
   { "Simple Tests", CK_FAILURE, "Assertion 'y>y' failed: y==3, y==3" },
+  { "Simple Tests", CK_FAILURE, "Assertion '1%d>3%f' failed: 1%d==0, 3%f==1" },
   { "Simple Tests", CK_FAILURE, "Assertion 'x>=y' failed: x==2, y==3" },
+  { "Simple Tests", CK_FAILURE, "Assertion '1%d>=3%f' failed: 1%d==0, 3%f==1" },
   { "Simple Tests", CK_PASS,    "Passed" },
   { "Simple Tests", CK_FAILURE, "Assertion '\"test1\"==s' failed: \"test1\"==\"test1\", s==\"test2\"" },
   { "Simple Tests", CK_FAILURE, "Assertion 't!=s' failed: t==\"test2\", s==\"test2\"" },
index b1b6313acc23322f355ec4be1d17551d497db68a..c05121d22294c86b9e4a7020e171bcff7c0015cf 100644 (file)
@@ -167,6 +167,15 @@ START_TEST(test_ck_assert_int_eq)
 }
 END_TEST
 
+START_TEST(test_ck_assert_int_eq_with_mod)
+{
+  int d = 2;
+  int f = 1;
+  ck_assert_int_eq(3%d, 2%f);
+  #define LINENO_ck_assert_int_eq_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_int_ne)
 {
   int x = 3;
@@ -178,6 +187,15 @@ START_TEST(test_ck_assert_int_ne)
 }
 END_TEST
 
+START_TEST(test_ck_assert_int_ne_with_mod)
+{
+  int d = 2;
+  int f = 2;
+  ck_assert_int_ne(3%d, 3%f);
+  #define LINENO_ck_assert_int_ne_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_int_lt)
 {
   int x = 2;
@@ -188,6 +206,15 @@ START_TEST(test_ck_assert_int_lt)
 }
 END_TEST
 
+START_TEST(test_ck_assert_int_lt_with_mod)
+{
+  int d = 2;
+  int f = 1;
+  ck_assert_int_lt(3%d, 3%f);
+  #define LINENO_ck_assert_int_lt_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_int_le)
 {
   int x = 2;
@@ -199,6 +226,15 @@ START_TEST(test_ck_assert_int_le)
 }
 END_TEST
 
+START_TEST(test_ck_assert_int_le_with_mod)
+{
+  int d = 2;
+  int f = 1;
+  ck_assert_int_le(3%d, 2%f);
+  #define LINENO_ck_assert_int_le_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_int_gt)
 {
   int x = 2;
@@ -209,6 +245,15 @@ START_TEST(test_ck_assert_int_gt)
 }
 END_TEST
 
+START_TEST(test_ck_assert_int_gt_with_mod)
+{
+  int d = 1;
+  int f = 2;
+  ck_assert_int_gt(3%d, 3%f);
+  #define LINENO_ck_assert_int_gt_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_int_ge)
 {
   int x = 2;
@@ -220,6 +265,15 @@ START_TEST(test_ck_assert_int_ge)
 }
 END_TEST
 
+START_TEST(test_ck_assert_int_ge_with_mod)
+{
+  int d = 1;
+  int f = 3;
+  ck_assert_int_ge(3%d, 4%f);
+  #define LINENO_ck_assert_int_ge_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_int_expr)
 {
   int x = 1;
@@ -240,6 +294,15 @@ START_TEST(test_ck_assert_uint_eq)
 }
 END_TEST
 
+START_TEST(test_ck_assert_uint_eq_with_mod)
+{
+  int d = 2;
+  int f = 1;
+  ck_assert_uint_eq(3%d, 1%f);
+  #define LINENO_ck_assert_uint_eq_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_uint_ne)
 {
   unsigned int x = 3;
@@ -251,6 +314,15 @@ START_TEST(test_ck_assert_uint_ne)
 }
 END_TEST
 
+START_TEST(test_ck_assert_uint_ne_with_mod)
+{
+  int d = 1;
+  int f = 1;
+  ck_assert_uint_ne(1%d, 1%f);
+  #define LINENO_ck_assert_uint_ne_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_uint_lt)
 {
   unsigned int x = 2;
@@ -261,6 +333,15 @@ START_TEST(test_ck_assert_uint_lt)
 }
 END_TEST
 
+START_TEST(test_ck_assert_uint_lt_with_mod)
+{
+  int d = 2;
+  int f = 1;
+  ck_assert_uint_lt(3%d, 1%f);
+  #define LINENO_ck_assert_uint_lt_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_uint_le)
 {
   unsigned int x = 2;
@@ -272,6 +353,15 @@ START_TEST(test_ck_assert_uint_le)
 }
 END_TEST
 
+START_TEST(test_ck_assert_uint_le_with_mod)
+{
+  int d = 2;
+  int f = 1;
+  ck_assert_uint_le(3%d, 1%f);
+  #define LINENO_ck_assert_uint_le_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_uint_gt)
 {
   unsigned int x = 2;
@@ -282,6 +372,15 @@ START_TEST(test_ck_assert_uint_gt)
 }
 END_TEST
 
+START_TEST(test_ck_assert_uint_gt_with_mod)
+{
+  int d = 1;
+  int f = 2;
+  ck_assert_uint_gt(1%d, 3%f);
+  #define LINENO_ck_assert_uint_gt_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_uint_ge)
 {
   unsigned int x = 2;
@@ -293,6 +392,15 @@ START_TEST(test_ck_assert_uint_ge)
 }
 END_TEST
 
+START_TEST(test_ck_assert_uint_ge_with_mod)
+{
+  int d = 1;
+  int f = 2;
+  ck_assert_uint_ge(1%d, 3%f);
+  #define LINENO_ck_assert_uint_ge_with_mod _STR(__LINE__)
+}
+END_TEST
+
 START_TEST(test_ck_assert_uint_expr)
 {
   unsigned int x = 1;
@@ -727,18 +835,30 @@ void init_master_tests_lineno(int num_master_tests) {
     LINENO_ck_assert,
     LINENO_ck_assert_null,
     LINENO_ck_assert_int_eq,
-    LINENO_ck_assert_int_eq,
+    LINENO_ck_assert_int_eq_with_mod,
     LINENO_ck_assert_int_ne,
+    LINENO_ck_assert_int_ne_with_mod,
     LINENO_ck_assert_int_lt,
+    LINENO_ck_assert_int_lt_with_mod,
     LINENO_ck_assert_int_le,
+    LINENO_ck_assert_int_le_with_mod,
     LINENO_ck_assert_int_gt,
+    LINENO_ck_assert_int_gt_with_mod,
     LINENO_ck_assert_int_ge,
+    LINENO_ck_assert_int_ge_with_mod,
     LINENO_ck_assert_int_expr,
+    LINENO_ck_assert_int_eq,
+    LINENO_ck_assert_int_eq_with_mod,
     LINENO_ck_assert_uint_ne,
+    LINENO_ck_assert_uint_ne_with_mod,
     LINENO_ck_assert_uint_lt,
+    LINENO_ck_assert_uint_lt_with_mod,
     LINENO_ck_assert_uint_le,
+    LINENO_ck_assert_uint_le_with_mod,
     LINENO_ck_assert_uint_gt,
+    LINENO_ck_assert_uint_gt_with_mod,
     LINENO_ck_assert_uint_ge,
+    LINENO_ck_assert_uint_ge_with_mod,
     LINENO_ck_assert_uint_expr,
     LINENO_ck_assert_str_eq,
     LINENO_ck_assert_str_ne,
@@ -1050,18 +1170,30 @@ Suite *make_sub_suite(void)
   tcase_add_test (tc_simple, test_ck_assert);
   tcase_add_test (tc_simple, test_ck_assert_null);
   tcase_add_test (tc_simple, test_ck_assert_int_eq);
+  tcase_add_test (tc_simple, test_ck_assert_int_eq_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_int_ne);
+  tcase_add_test (tc_simple, test_ck_assert_int_ne_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_int_lt);
+  tcase_add_test (tc_simple, test_ck_assert_int_lt_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_int_le);
+  tcase_add_test (tc_simple, test_ck_assert_int_le_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_int_gt);
+  tcase_add_test (tc_simple, test_ck_assert_int_gt_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_int_ge);
+  tcase_add_test (tc_simple, test_ck_assert_int_ge_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_int_expr);
   tcase_add_test (tc_simple, test_ck_assert_uint_eq);
+  tcase_add_test (tc_simple, test_ck_assert_uint_eq_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_uint_ne);
+  tcase_add_test (tc_simple, test_ck_assert_uint_ne_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_uint_lt);
+  tcase_add_test (tc_simple, test_ck_assert_uint_lt_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_uint_le);
+  tcase_add_test (tc_simple, test_ck_assert_uint_le_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_uint_gt);
+  tcase_add_test (tc_simple, test_ck_assert_uint_gt_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_uint_ge);
+  tcase_add_test (tc_simple, test_ck_assert_uint_ge_with_mod);
   tcase_add_test (tc_simple, test_ck_assert_uint_expr);
   tcase_add_test (tc_simple, test_ck_assert_str_eq);
   tcase_add_test (tc_simple, test_ck_assert_str_ne);