Ensure stream readers zero-initialize their return values

This commit is contained in:
Jack Andersen 2019-04-06 18:44:50 -10:00
parent b40d3b17e5
commit b9de854400
3 changed files with 68 additions and 65 deletions

View File

@ -11,6 +11,7 @@ if(MSVC)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MD /O2 /Ob2 /DNDEBUG")
set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "-debug -incremental:no")
endif()
string(REPLACE "-stdlib=libc++ -fsanitize=memory -fsanitize-memory-track-origins" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
# Find dependencies
include(FindLLVM.cmake)

View File

@ -912,28 +912,28 @@ inline void __BinarySizeProp64(const T& obj, size_t& s) {
#define AT_DECL_DNA \
template <class Op, athena::Endian DNAE = DNAEndian, class T> \
void Do(const athena::io::PropId& id, T& var, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, DNAE>(id, var, s); \
void Do(const athena::io::PropId& _id, T& var, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, DNAE>(_id, var, s); \
} \
template <class Op, athena::Endian DNAE = DNAEndian, class T> \
void DoSize(const athena::io::PropId& id, T& var, typename Op::StreamT& s) { \
athena::io::__DoSize<Op, T, DNAE>(id, var, s); \
void DoSize(const athena::io::PropId& _id, T& var, typename Op::StreamT& s) { \
athena::io::__DoSize<Op, T, DNAE>(_id, var, s); \
} \
template <class Op, athena::Endian DNAE = DNAEndian, class T, class S> \
void Do(const athena::io::PropId& id, std::vector<T>& var, const S& count, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, S, DNAE>(id, var, count, s); \
void Do(const athena::io::PropId& _id, std::vector<T>& var, const S& count, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, S, DNAE>(_id, var, count, s); \
} \
template <class Op> \
void Do(const athena::io::PropId& id, std::unique_ptr<atUint8[]>& buf, size_t count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(id, buf, count, s); \
void Do(const athena::io::PropId& _id, std::unique_ptr<atUint8[]>& buf, size_t count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(_id, buf, count, s); \
} \
template <class Op> \
void Do(const athena::io::PropId& id, std::string& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(id, str, count, s); \
void Do(const athena::io::PropId& _id, std::string& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(_id, str, count, s); \
} \
template <class Op, athena::Endian DNAE = DNAEndian> \
void Do(const athena::io::PropId& id, std::wstring& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op, DNAE>(id, str, count, s); \
void Do(const athena::io::PropId& _id, std::wstring& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op, DNAE>(_id, str, count, s); \
} \
template <class Op> \
void DoSeek(atInt64 delta, athena::SeekOrigin whence, typename Op::StreamT& s) { \
@ -983,28 +983,28 @@ inline void __BinarySizeProp64(const T& obj, size_t& s) {
#define AT_DECL_PROPDNA \
template <class Op, athena::Endian DNAE = DNAEndian, class T> \
void Do(const athena::io::PropId& id, T& var, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, DNAE>(id, var, s); \
void Do(const athena::io::PropId& _id, T& var, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, DNAE>(_id, var, s); \
} \
template <class Op, athena::Endian DNAE = DNAEndian, class T> \
void DoSize(const athena::io::PropId& id, T& var, typename Op::StreamT& s) { \
athena::io::__DoSize<Op, T, DNAE>(id, var, s); \
void DoSize(const athena::io::PropId& _id, T& var, typename Op::StreamT& s) { \
athena::io::__DoSize<Op, T, DNAE>(_id, var, s); \
} \
template <class Op, athena::Endian DNAE = DNAEndian, class T, class S> \
void Do(const athena::io::PropId& id, std::vector<T>& var, const S& count, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, S, DNAE>(id, var, count, s); \
void Do(const athena::io::PropId& _id, std::vector<T>& var, const S& count, typename Op::StreamT& s) { \
athena::io::__Do<Op, T, S, DNAE>(_id, var, count, s); \
} \
template <class Op> \
void Do(const athena::io::PropId& id, std::unique_ptr<atUint8[]>& buf, size_t count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(id, buf, count, s); \
void Do(const athena::io::PropId& _id, std::unique_ptr<atUint8[]>& buf, size_t count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(_id, buf, count, s); \
} \
template <class Op> \
void Do(const athena::io::PropId& id, std::string& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(id, str, count, s); \
void Do(const athena::io::PropId& _id, std::string& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op>(_id, str, count, s); \
} \
template <class Op, athena::Endian DNAE = DNAEndian> \
void Do(const athena::io::PropId& id, std::wstring& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op, DNAE>(id, str, count, s); \
void Do(const athena::io::PropId& _id, std::wstring& str, atInt32 count, typename Op::StreamT& s) { \
athena::io::__Do<Op, DNAE>(_id, str, count, s); \
} \
template <class Op> \
void DoSeek(atInt64 delta, athena::SeekOrigin whence, typename Op::StreamT& s) { \

View File

@ -63,7 +63,7 @@ public:
* @return The value at the current position
*/
atInt8 readByte() {
atInt8 val;
atInt8 val = 0;
readUBytesToBuf(&val, 1);
return val;
}
@ -104,6 +104,7 @@ public:
*/
std::unique_ptr<atInt8[]> readBytes(atUint64 length) {
atInt8* buf = new atInt8[length];
memset(buf, 0, length);
readUBytesToBuf(buf, length);
return std::unique_ptr<atInt8[]>(buf);
}
@ -114,6 +115,7 @@ public:
*/
std::unique_ptr<atUint8[]> readUBytes(atUint64 length) {
atUint8* buf = new atUint8[length];
memset(buf, 0, length);
readUBytesToBuf(buf, length);
return std::unique_ptr<atUint8[]>(buf);
}
@ -139,7 +141,7 @@ public:
* @return The value at the current address
*/
atInt16 readInt16() {
atInt16 val;
atInt16 val = 0;
readUBytesToBuf(&val, 2);
return m_endian == Big ? utility::BigInt16(val) : utility::LittleInt16(val);
}
@ -154,7 +156,7 @@ public:
* @return The value at the current address
*/
atInt16 readInt16Little() {
atInt16 val;
atInt16 val = 0;
readUBytesToBuf(&val, 2);
return utility::LittleInt16(val);
}
@ -169,7 +171,7 @@ public:
* @return The value at the current address
*/
atInt16 readInt16Big() {
atInt16 val;
atInt16 val = 0;
readUBytesToBuf(&val, 2);
return utility::BigInt16(val);
}
@ -195,7 +197,7 @@ public:
* @return The value at the current address
*/
atUint16 readUint16Little() {
atUint16 val;
atUint16 val = 0;
readUBytesToBuf(&val, 2);
return utility::LittleUint16(val);
}
@ -210,7 +212,7 @@ public:
* @return The value at the current address
*/
atUint16 readUint16Big() {
atUint16 val;
atUint16 val = 0;
readUBytesToBuf(&val, 2);
return utility::BigUint16(val);
}
@ -225,7 +227,7 @@ public:
* @return The value at the current address
*/
atInt32 readInt32() {
atInt32 val;
atInt32 val = 0;
readUBytesToBuf(&val, 4);
return m_endian == Big ? utility::BigInt32(val) : utility::LittleInt32(val);
}
@ -240,7 +242,7 @@ public:
* @return The value at the current address
*/
atInt32 readInt32Little() {
atInt32 val;
atInt32 val = 0;
readUBytesToBuf(&val, 4);
return utility::LittleInt32(val);
}
@ -255,7 +257,7 @@ public:
* @return The value at the current address
*/
atInt32 readInt32Big() {
atInt32 val;
atInt32 val = 0;
readUBytesToBuf(&val, 4);
return utility::BigInt32(val);
}
@ -281,7 +283,7 @@ public:
* @return The value at the current address
*/
atUint32 readUint32Little() {
atUint32 val;
atUint32 val = 0;
readUBytesToBuf(&val, 4);
return utility::LittleUint32(val);
}
@ -296,7 +298,7 @@ public:
* @return The value at the current address
*/
atUint32 readUint32Big() {
atUint32 val;
atUint32 val = 0;
readUBytesToBuf(&val, 4);
return utility::BigUint32(val);
}
@ -311,7 +313,7 @@ public:
* @return The value at the current address
*/
atInt64 readInt64() {
atInt64 val;
atInt64 val = 0;
readUBytesToBuf(&val, 8);
return m_endian == Big ? utility::BigInt64(val) : utility::LittleInt64(val);
}
@ -326,7 +328,7 @@ public:
* @return The value at the current address
*/
atInt64 readInt64Little() {
atInt64 val;
atInt64 val = 0;
readUBytesToBuf(&val, 8);
return utility::LittleInt64(val);
}
@ -341,7 +343,7 @@ public:
* @return The value at the current address
*/
atInt64 readInt64Big() {
atInt64 val;
atInt64 val = 0;
readUBytesToBuf(&val, 8);
return utility::BigInt64(val);
}
@ -367,7 +369,7 @@ public:
* @return The value at the current address
*/
atUint64 readUint64Little() {
atUint64 val;
atUint64 val = 0;
readUBytesToBuf(&val, 8);
return utility::LittleUint64(val);
}
@ -382,7 +384,7 @@ public:
* @return The value at the current address
*/
atUint64 readUint64Big() {
atUint64 val;
atUint64 val = 0;
readUBytesToBuf(&val, 8);
return utility::BigUint64(val);
}
@ -397,7 +399,7 @@ public:
* @return The value at the current address
*/
float readFloat() {
float val;
float val = 0.f;
readUBytesToBuf(&val, 4);
return m_endian == Big ? utility::BigFloat(val) : utility::LittleFloat(val);
}
@ -412,7 +414,7 @@ public:
* @return The value at the current address
*/
float readFloatLittle() {
float val;
float val = 0.f;
readUBytesToBuf(&val, 4);
return utility::LittleFloat(val);
}
@ -427,7 +429,7 @@ public:
* @return The value at the current address
*/
float readFloatBig() {
float val;
float val = 0.f;
readUBytesToBuf(&val, 4);
return utility::BigFloat(val);
}
@ -442,7 +444,7 @@ public:
* @return The value at the current address
*/
double readDouble() {
double val;
double val = 0.0;
readUBytesToBuf(&val, 8);
return m_endian == Big ? utility::BigDouble(val) : utility::LittleDouble(val);
}
@ -457,7 +459,7 @@ public:
* @return The value at the current address
*/
double readDoubleLittle() {
double val;
double val = 0.0;
readUBytesToBuf(&val, 8);
return utility::LittleDouble(val);
}
@ -472,7 +474,7 @@ public:
* @return The value at the current address
*/
double readDoubleBig() {
double val;
double val = 0.0;
readUBytesToBuf(&val, 8);
return utility::BigDouble(val);
}
@ -486,7 +488,7 @@ public:
* @return The value at the current address
*/
bool readBool() {
atUint8 val;
atUint8 val = false;
readUBytesToBuf(&val, 1);
return val != 0;
}
@ -509,7 +511,7 @@ public:
* @return The value at the current address
*/
atVec2f readVec2f() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 8);
if (m_endian == Big) {
val[0] = utility::BigFloat(val[0]);
@ -535,7 +537,7 @@ public:
* @return The value at the current address
*/
atVec2f readVec2fLittle() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 8);
val[0] = utility::LittleFloat(val[0]);
val[1] = utility::LittleFloat(val[1]);
@ -556,7 +558,7 @@ public:
* @return The value at the current address
*/
atVec2f readVec2fBig() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 8);
val[0] = utility::BigFloat(val[0]);
val[1] = utility::BigFloat(val[1]);
@ -577,7 +579,7 @@ public:
* @return The value at the current address
*/
atVec3f readVec3f() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 12);
if (m_endian == Big) {
val[0] = utility::BigFloat(val[0]);
@ -604,7 +606,7 @@ public:
* @return The value at the current address
*/
atVec3f readVec3fLittle() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 12);
val[0] = utility::LittleFloat(val[0]);
val[1] = utility::LittleFloat(val[1]);
@ -625,7 +627,7 @@ public:
* @return The value at the current address
*/
atVec3f readVec3fBig() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 12);
val[0] = utility::BigFloat(val[0]);
val[1] = utility::BigFloat(val[1]);
@ -646,7 +648,7 @@ public:
* @return The value at the current address
*/
atVec4f readVec4f() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 16);
if (m_endian == Big) {
val[0] = utility::BigFloat(val[0]);
@ -674,7 +676,7 @@ public:
* @return The value at the current address
*/
atVec4f readVec4fLittle() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 16);
val[0] = utility::LittleFloat(val[0]);
val[1] = utility::LittleFloat(val[1]);
@ -695,7 +697,7 @@ public:
* @return The value at the current address
*/
atVec4f readVec4fBig() {
simd_floats val;
simd_floats val = {};
readUBytesToBuf(val.data(), 16);
val[0] = utility::BigFloat(val[0]);
val[1] = utility::BigFloat(val[1]);
@ -716,7 +718,7 @@ public:
* @return The value at the current address
*/
atVec2d readVec2d() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 16);
if (m_endian == Big) {
val[0] = utility::BigDouble(val[0]);
@ -742,7 +744,7 @@ public:
* @return The value at the current address
*/
atVec2d readVec2dLittle() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 16);
val[0] = utility::LittleDouble(val[0]);
val[1] = utility::LittleDouble(val[1]);
@ -763,7 +765,7 @@ public:
* @return The value at the current address
*/
atVec2d readVec2dBig() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 16);
val[0] = utility::BigDouble(val[0]);
val[1] = utility::BigDouble(val[1]);
@ -784,7 +786,7 @@ public:
* @return The value at the current address
*/
atVec3d readVec3d() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 24);
if (m_endian == Big) {
val[0] = utility::BigDouble(val[0]);
@ -811,7 +813,7 @@ public:
* @return The value at the current address
*/
atVec3d readVec3dLittle() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 24);
val[0] = utility::LittleDouble(val[0]);
val[1] = utility::LittleDouble(val[1]);
@ -832,7 +834,7 @@ public:
* @return The value at the current address
*/
atVec3d readVec3dBig() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 24);
val[0] = utility::BigDouble(val[0]);
val[1] = utility::BigDouble(val[1]);
@ -853,7 +855,7 @@ public:
* @return The value at the current address
*/
atVec4d readVec4d() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 32);
if (m_endian == Big) {
val[0] = utility::BigDouble(val[0]);
@ -881,7 +883,7 @@ public:
* @return The value at the current address
*/
atVec4d readVec4dLittle() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 32);
val[0] = utility::LittleDouble(val[0]);
val[1] = utility::LittleDouble(val[1]);
@ -902,7 +904,7 @@ public:
* @return The value at the current address
*/
atVec4d readVec4dBig() {
simd_doubles val;
simd_doubles val = {};
readUBytesToBuf(val.data(), 32);
val[0] = utility::BigDouble(val[0]);
val[1] = utility::BigDouble(val[1]);