Add hard asserts to all SStream functions and memset MCInst. (#2501)
Some checks failed
Run Test / ${{ matrix.config.name }} (map[arch:x64 build-system:cmake diet-build:OFF enable-asan:OFF name:ubuntu-22.04 x64 cmake os:ubuntu-22.04]) (push) Has been cancelled
Run Test / ${{ matrix.config.name }} (map[arch:x64 build-system:cmake diet-build:OFF enable-asan:ON name:ubuntu-24.04 x64 ASAN os:ubuntu-24.04]) (push) Has been cancelled
Run Test / ${{ matrix.config.name }} (map[arch:x64 build-system:make diet-build:OFF enable-asan:OFF name:ubuntu-22.04 x64 make os:ubuntu-22.04]) (push) Has been cancelled
Run Test / ${{ matrix.config.name }} (map[arch:x64 name:windows x64 MSVC 64bit os:windows-latest platform:windows python-arch:x64 python-version:3.9]) (push) Has been cancelled
Run clang-tidy / clang-tidy (push) Has been cancelled
RELEASE BUILD - PyPI 📦 Distribution / Build wheels on ${{ matrix.os }} (macos-latest) (push) Has been cancelled
RELEASE BUILD - PyPI 📦 Distribution / Build wheels on ${{ matrix.os }} (ubuntu-latest) (push) Has been cancelled
RELEASE BUILD - PyPI 📦 Distribution / Build wheels on ${{ matrix.os }} (windows-latest) (push) Has been cancelled
RELEASE BUILD - PyPI 📦 Distribution / Make SDist (push) Has been cancelled
Python Package CI / build (macOS-14, 3.12) (push) Has been cancelled
Python Package CI / build (macOS-14, 3.8) (push) Has been cancelled
Python Package CI / build (ubuntu-24.04, 3.12) (push) Has been cancelled
Python Package CI / build (ubuntu-24.04, 3.8) (push) Has been cancelled
Python Package CI / build (windows-2022, 3.12) (push) Has been cancelled
Python Package CI / build (windows-2022, 3.8) (push) Has been cancelled
RELEASE BUILD - PyPI 📦 Distribution / publish (push) Has been cancelled

This commit is contained in:
Rot127 2024-10-07 13:54:01 +00:00 committed by GitHub
parent d667a62777
commit 981d648b28
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 84 additions and 66 deletions

View File

@ -18,6 +18,7 @@
void MCInst_Init(MCInst *inst, cs_arch arch)
{
memset(inst, 0, sizeof(MCInst));
// unnecessary to initialize in loop . its expensive and inst->size should be honored
inst->Operands[0].Kind = kInvalid;
inst->Operands[0].ImmVal = 0;

149
SStream.c
View File

@ -153,6 +153,7 @@ void SStream_Close(SStream *ss) {
void SStream_concat0(SStream *ss, const char *s)
{
#ifndef CAPSTONE_DIET
assert(ss && s);
SSTREAM_RETURN_IF_CLOSED(ss);
if (s[0] == '\0')
return;
@ -178,6 +179,7 @@ void SStream_concat0(SStream *ss, const char *s)
void SStream_concat1(SStream *ss, const char c)
{
#ifndef CAPSTONE_DIET
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (c == '\0')
return;
@ -201,6 +203,7 @@ void SStream_concat1(SStream *ss, const char c)
void SStream_concat(SStream *ss, const char *fmt, ...)
{
#ifndef CAPSTONE_DIET
assert(ss && fmt);
SSTREAM_RETURN_IF_CLOSED(ss);
va_list ap;
int ret;
@ -218,160 +221,174 @@ void SStream_concat(SStream *ss, const char *fmt, ...)
}
// print number with prefix #
void printInt64Bang(SStream *O, int64_t val)
void printInt64Bang(SStream *ss, int64_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
SStream_concat1(O, '#');
printInt64(O, val);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
SStream_concat1(ss, '#');
printInt64(ss, val);
}
void printUInt64Bang(SStream *O, uint64_t val)
void printUInt64Bang(SStream *ss, uint64_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
SStream_concat1(O, '#');
printUInt64(O, val);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
SStream_concat1(ss, '#');
printUInt64(ss, val);
}
// print number
void printInt64(SStream *O, int64_t val)
void printInt64(SStream *ss, int64_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (val >= 0) {
if (val > HEX_THRESHOLD)
SStream_concat(O, "0x%"PRIx64, val);
SStream_concat(ss, "0x%"PRIx64, val);
else
SStream_concat(O, "%"PRIu64, val);
SStream_concat(ss, "%"PRIu64, val);
} else {
if (val < -HEX_THRESHOLD) {
if (val == INT64_MIN)
SStream_concat(O, "-0x%"PRIx64, (uint64_t) INT64_MAX + 1);
SStream_concat(ss, "-0x%"PRIx64, (uint64_t) INT64_MAX + 1);
else
SStream_concat(O, "-0x%"PRIx64, (uint64_t)-val);
SStream_concat(ss, "-0x%"PRIx64, (uint64_t)-val);
} else
SStream_concat(O, "-%"PRIu64, -val);
SStream_concat(ss, "-%"PRIu64, -val);
}
}
void printUInt64(SStream *O, uint64_t val)
void printUInt64(SStream *ss, uint64_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (val > HEX_THRESHOLD)
SStream_concat(O, "0x%"PRIx64, val);
SStream_concat(ss, "0x%"PRIx64, val);
else
SStream_concat(O, "%"PRIu64, val);
SStream_concat(ss, "%"PRIu64, val);
}
// print number in decimal mode
void printInt32BangDec(SStream *O, int32_t val)
void printInt32BangDec(SStream *ss, int32_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (val >= 0)
SStream_concat(O, "#%" PRIu32, val);
SStream_concat(ss, "#%" PRIu32, val);
else {
if (val == INT32_MIN)
SStream_concat(O, "#-%" PRIu32, val);
SStream_concat(ss, "#-%" PRIu32, val);
else
SStream_concat(O, "#-%" PRIu32, (uint32_t)-val);
SStream_concat(ss, "#-%" PRIu32, (uint32_t)-val);
}
}
void printInt32Bang(SStream *O, int32_t val)
void printInt32Bang(SStream *ss, int32_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
SStream_concat1(O, '#');
printInt32(O, val);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
SStream_concat1(ss, '#');
printInt32(ss, val);
}
void printInt8(SStream *O, int8_t val)
void printInt8(SStream *ss, int8_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (val >= 0) {
if (val > HEX_THRESHOLD)
SStream_concat(O, "0x%" PRIx8, val);
SStream_concat(ss, "0x%" PRIx8, val);
else
SStream_concat(O, "%" PRId8, val);
SStream_concat(ss, "%" PRId8, val);
} else {
if (val < -HEX_THRESHOLD) {
if (val == INT8_MIN)
SStream_concat(O, "-0x%" PRIx8, (uint8_t) INT8_MAX + 1);
SStream_concat(ss, "-0x%" PRIx8, (uint8_t) INT8_MAX + 1);
else
SStream_concat(O, "-0x%" PRIx8, (int8_t)-val);
SStream_concat(ss, "-0x%" PRIx8, (int8_t)-val);
} else
SStream_concat(O, "-%" PRIu8, -val);
SStream_concat(ss, "-%" PRIu8, -val);
}
}
void printInt16(SStream *O, int16_t val)
void printInt16(SStream *ss, int16_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (val >= 0) {
if (val > HEX_THRESHOLD)
SStream_concat(O, "0x%" PRIx16, val);
SStream_concat(ss, "0x%" PRIx16, val);
else
SStream_concat(O, "%" PRId16, val);
SStream_concat(ss, "%" PRId16, val);
} else {
if (val < -HEX_THRESHOLD) {
if (val == INT16_MIN)
SStream_concat(O, "-0x%" PRIx16, (uint16_t) INT16_MAX + 1);
SStream_concat(ss, "-0x%" PRIx16, (uint16_t) INT16_MAX + 1);
else
SStream_concat(O, "-0x%" PRIx16, (int16_t)-val);
SStream_concat(ss, "-0x%" PRIx16, (int16_t)-val);
} else
SStream_concat(O, "-%" PRIu16, -val);
SStream_concat(ss, "-%" PRIu16, -val);
}
}
void printInt32(SStream *O, int32_t val)
void printInt32(SStream *ss, int32_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (val >= 0) {
if (val > HEX_THRESHOLD)
SStream_concat(O, "0x%" PRIx32, val);
SStream_concat(ss, "0x%" PRIx32, val);
else
SStream_concat(O, "%" PRId32, val);
SStream_concat(ss, "%" PRId32, val);
} else {
if (val < -HEX_THRESHOLD) {
if (val == INT32_MIN)
SStream_concat(O, "-0x%" PRIx32, (uint32_t) INT32_MAX + 1);
SStream_concat(ss, "-0x%" PRIx32, (uint32_t) INT32_MAX + 1);
else
SStream_concat(O, "-0x%" PRIx32, (int32_t)-val);
SStream_concat(ss, "-0x%" PRIx32, (int32_t)-val);
} else {
SStream_concat(O, "-%" PRIu32, (uint32_t)-val);
SStream_concat(ss, "-%" PRIu32, (uint32_t)-val);
}
}
}
void printUInt32Bang(SStream *O, uint32_t val)
void printUInt32Bang(SStream *ss, uint32_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
SStream_concat1(O, '#');
printUInt32(O, val);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
SStream_concat1(ss, '#');
printUInt32(ss, val);
}
void printUInt32(SStream *O, uint32_t val)
void printUInt32(SStream *ss, uint32_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
if (val > HEX_THRESHOLD)
SStream_concat(O, "0x%x", val);
SStream_concat(ss, "0x%x", val);
else
SStream_concat(O, "%u", val);
SStream_concat(ss, "%u", val);
}
void printFloat(SStream *O, float val)
void printFloat(SStream *ss, float val)
{
SSTREAM_RETURN_IF_CLOSED(O);
SStream_concat(O, "%e", val);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
SStream_concat(ss, "%e", val);
}
void printFloatBang(SStream *O, float val)
void printFloatBang(SStream *ss, float val)
{
SSTREAM_RETURN_IF_CLOSED(O);
SStream_concat(O, "#%e", val);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
SStream_concat(ss, "#%e", val);
}
void printExpr(SStream *O, uint64_t val)
void printExpr(SStream *ss, uint64_t val)
{
SSTREAM_RETURN_IF_CLOSED(O);
SStream_concat(O, "%"PRIu64, val);
assert(ss);
SSTREAM_RETURN_IF_CLOSED(ss);
SStream_concat(ss, "%"PRIu64, val);
}
SStream *markup_OS(SStream *OS, SStreamMarkup style) {