From f05d797b3505d65c1bdb3454ae5f9b368f64aa93 Mon Sep 17 00:00:00 2001 From: Rot127 Date: Sun, 6 Oct 2024 03:52:35 -0500 Subject: [PATCH 1/3] Add hard asserts to all SStream functions. --- SStream.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/SStream.c b/SStream.c index e561345d00..752e72cd92 100644 --- a/SStream.c +++ b/SStream.c @@ -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; @@ -220,6 +223,7 @@ void SStream_concat(SStream *ss, const char *fmt, ...) // print number with prefix # void printInt64Bang(SStream *O, int64_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); SStream_concat1(O, '#'); printInt64(O, val); @@ -227,6 +231,7 @@ void printInt64Bang(SStream *O, int64_t val) void printUInt64Bang(SStream *O, uint64_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); SStream_concat1(O, '#'); printUInt64(O, val); @@ -235,6 +240,7 @@ void printUInt64Bang(SStream *O, uint64_t val) // print number void printInt64(SStream *O, int64_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); if (val >= 0) { if (val > HEX_THRESHOLD) @@ -254,6 +260,7 @@ void printInt64(SStream *O, int64_t val) void printUInt64(SStream *O, uint64_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); if (val > HEX_THRESHOLD) SStream_concat(O, "0x%"PRIx64, val); @@ -264,6 +271,7 @@ void printUInt64(SStream *O, uint64_t val) // print number in decimal mode void printInt32BangDec(SStream *O, int32_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); if (val >= 0) SStream_concat(O, "#%" PRIu32, val); @@ -277,6 +285,7 @@ void printInt32BangDec(SStream *O, int32_t val) void printInt32Bang(SStream *O, int32_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); SStream_concat1(O, '#'); printInt32(O, val); @@ -284,6 +293,7 @@ void printInt32Bang(SStream *O, int32_t val) void printInt8(SStream *O, int8_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); if (val >= 0) { if (val > HEX_THRESHOLD) @@ -303,6 +313,7 @@ void printInt8(SStream *O, int8_t val) void printInt16(SStream *O, int16_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); if (val >= 0) { if (val > HEX_THRESHOLD) @@ -322,6 +333,7 @@ void printInt16(SStream *O, int16_t val) void printInt32(SStream *O, int32_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); if (val >= 0) { if (val > HEX_THRESHOLD) @@ -342,6 +354,7 @@ void printInt32(SStream *O, int32_t val) void printUInt32Bang(SStream *O, uint32_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); SStream_concat1(O, '#'); printUInt32(O, val); @@ -349,6 +362,7 @@ void printUInt32Bang(SStream *O, uint32_t val) void printUInt32(SStream *O, uint32_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); if (val > HEX_THRESHOLD) SStream_concat(O, "0x%x", val); @@ -358,18 +372,21 @@ void printUInt32(SStream *O, uint32_t val) void printFloat(SStream *O, float val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); SStream_concat(O, "%e", val); } void printFloatBang(SStream *O, float val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); SStream_concat(O, "#%e", val); } void printExpr(SStream *O, uint64_t val) { + assert(O); SSTREAM_RETURN_IF_CLOSED(O); SStream_concat(O, "%"PRIu64, val); } From 09a1a0645f4a8ab19f11ec0594e740b7404eff85 Mon Sep 17 00:00:00 2001 From: Rot127 Date: Sun, 6 Oct 2024 04:41:52 -0500 Subject: [PATCH 2/3] Memset MCInst to 0 on initialization. Old modules (and possibly the new ones as well) are not built for none zeroed MCInst. It leads again and again to segfaults or false disassembly. So now it is fixed. --- MCInst.c | 1 + 1 file changed, 1 insertion(+) diff --git a/MCInst.c b/MCInst.c index 9c05f6f39b..9c5d7bac43 100644 --- a/MCInst.c +++ b/MCInst.c @@ -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; From 2edae89f44cf55b05a12aeb6bb173228d2e408af Mon Sep 17 00:00:00 2001 From: Rot127 Date: Sun, 6 Oct 2024 23:49:58 -0500 Subject: [PATCH 3/3] Rename stream parameter from O -> ss to not look similar to 0. --- SStream.c | 160 +++++++++++++++++++++++++++--------------------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/SStream.c b/SStream.c index 752e72cd92..5ccbf53f9f 100644 --- a/SStream.c +++ b/SStream.c @@ -221,174 +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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) { - assert(O); - 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) {