aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--include/qpdf/QIntC.hh7
-rw-r--r--libtests/qintc.cc11
-rw-r--r--libtests/qtest/qintc/qintc.out4
4 files changed, 21 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 4ec6ea9d..29da54b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2019-09-17 Jay Berkenbilt <ejb@ql.org>
+
+ * QIntC tests: don't assume char is signed. Fixes #361.
+
2019-08-31 Jay Berkenbilt <ejb@ql.org>
* 9.0.0: release
diff --git a/include/qpdf/QIntC.hh b/include/qpdf/QIntC.hh
index 3383a91c..8a6b74c0 100644
--- a/include/qpdf/QIntC.hh
+++ b/include/qpdf/QIntC.hh
@@ -51,6 +51,13 @@ namespace QIntC // QIntC = qpdf Integer Conversion
};
template <>
+ class to_u<signed char>
+ {
+ public:
+ typedef unsigned char type;
+ };
+
+ template <>
class to_u<short>
{
public:
diff --git a/libtests/qintc.cc b/libtests/qintc.cc
index 53ec3772..6b35e837 100644
--- a/libtests/qintc.cc
+++ b/libtests/qintc.cc
@@ -32,12 +32,13 @@ int main()
uint64_t ul1 = 1099511627776LL; // Too big for 32-bit
uint64_t ul2 = 12345; // Fits into 32-bit
int32_t i2 = 81; // Fits in char and uchar
- char c1 = '\xf7'; // Signed value when char
+ signed char c1 = static_cast<signed char>('\xf7'); // Signed value when char
+ char c2 = 'W'; // char; may be signed or unsigned
// Verify i1 and u1 have same bit pattern
assert(static_cast<uint32_t>(i1) == u1);
- // Verify that we can unsafely convert between char and unsigned char
- assert(c1 == static_cast<char>(static_cast<unsigned char>(c1)));
+ // Verify that we can unsafely convert between signed and unsigned char
+ assert(c1 == static_cast<signed char>(static_cast<unsigned char>(c1)));
try_convert(true, QIntC::to_int<int32_t>, i1);
try_convert(true, QIntC::to_uint<uint32_t>, u1);
@@ -51,7 +52,9 @@ int main()
try_convert(false, QIntC::to_ulonglong<int32_t>, i1);
try_convert(true, QIntC::to_char<int32_t>, i2);
try_convert(true, QIntC::to_uchar<int32_t>, i2);
- try_convert(false, QIntC::to_uchar<char>, c1);
+ try_convert(false, QIntC::to_uchar<signed char>, c1);
+ try_convert(true, QIntC::to_uchar<char>, c2);
+ try_convert(true, QIntC::to_char<char>, c2);
return 0;
}
diff --git a/libtests/qtest/qintc/qintc.out b/libtests/qtest/qintc/qintc.out
index 5c6479e2..2a2ff9f5 100644
--- a/libtests/qtest/qintc/qintc.out
+++ b/libtests/qtest/qintc/qintc.out
@@ -10,4 +10,6 @@ QIntC::to_offset<int32_t>(i1): -1153374643 -1153374643 PASSED
QIntC::to_ulonglong<int32_t>(i1): integer out of range converting -1153374643 from a 4-byte signed type to a 8-byte unsigned type PASSED
QIntC::to_char<int32_t>(i2): 81 Q PASSED
QIntC::to_uchar<int32_t>(i2): 81 Q PASSED
-QIntC::to_uchar<char>(c1): integer out of range converting ÷ from a 1-byte signed type to a 1-byte unsigned type PASSED
+QIntC::to_uchar<signed char>(c1): integer out of range converting ÷ from a 1-byte signed type to a 1-byte unsigned type PASSED
+QIntC::to_uchar<char>(c2): W W PASSED
+QIntC::to_char<char>(c2): W W PASSED