aboutsummaryrefslogtreecommitdiff
path: root/src/script.h
diff options
context:
space:
mode:
authorDwayne C. Litzenberger <dlitz@dlitz.net>2012-04-16 01:32:55 -0400
committerLuke Dashjr <luke-jr+git@utopios.org>2012-04-22 09:38:27 -0400
commite5b980d72f808c46ea279d1fa5bfc1f8fb3363c3 (patch)
tree591bc2f6588a85e659871ab5ff072961381fc80b /src/script.h
parentbd043f19c83654331e5418ea1e7af2bd213899a7 (diff)
downloadbitcoin-e5b980d72f808c46ea279d1fa5bfc1f8fb3363c3.tar.xz
Fix bugs on 'unsigned char' platforms.
In ISO C++, the signedness of 'char' is undefined. On some platforms (e.g. ARM), 'char' is an unsigned type, but some of the code relies on 'char' being signed (as it is on x86). This is indicated by compiler warnings like this: bignum.h: In constructor 'CBigNum::CBigNum(char)': bignum.h:81:59: warning: comparison is always true due to limited range of data type [-Wtype-limits] util.cpp: In function 'bool IsHex(const string&)': util.cpp:427:28: warning: comparison is always false due to limited range of data type [-Wtype-limits] In particular, IsHex erroneously returned true regardless of the input characters, as long as the length of the string was a positive multiple of 2. Note: For testing, it's possible using GCC to force char to be unsigned by adding the -funsigned-char parameter to xCXXFLAGS.
Diffstat (limited to 'src/script.h')
-rw-r--r--src/script.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/script.h b/src/script.h
index bc9fc9ab6f..7d15bbaebe 100644
--- a/src/script.h
+++ b/src/script.h
@@ -402,7 +402,8 @@ public:
}
- explicit CScript(char b) { operator<<(b); }
+ //explicit CScript(char b) is not portable. Use 'signed char' or 'unsigned char'.
+ explicit CScript(signed char b) { operator<<(b); }
explicit CScript(short b) { operator<<(b); }
explicit CScript(int b) { operator<<(b); }
explicit CScript(long b) { operator<<(b); }
@@ -419,7 +420,8 @@ public:
explicit CScript(const std::vector<unsigned char>& b) { operator<<(b); }
- CScript& operator<<(char b) { return push_int64(b); }
+ //CScript& operator<<(char b) is not portable. Use 'signed char' or 'unsigned char'.
+ CScript& operator<<(signed char b) { return push_int64(b); }
CScript& operator<<(short b) { return push_int64(b); }
CScript& operator<<(int b) { return push_int64(b); }
CScript& operator<<(long b) { return push_int64(b); }