summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2017-03-08 16:03:27 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2017-03-08 16:03:27 +0000
commit2fd2d585a530d0564a5ef4b1184e0767c84c93b0 (patch)
tree9febb5519f28c462818cdeedd9bec4cce0620b0b
parent98340815904801a83a55601728e300dc2b4e49ad (diff)
DARWF: silence some warnings about conversions
Add a check for an overflow and explicitly cast the value. We would have silently overflowed previously. git-svn-id: https://llvm.org/svn/llvm-project/libunwind/trunk@297291 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--src/DwarfInstructions.hpp2
-rw-r--r--src/DwarfParser.hpp9
2 files changed, 7 insertions, 4 deletions
diff --git a/src/DwarfInstructions.hpp b/src/DwarfInstructions.hpp
index 9494bb8..f3a4d2c 100644
--- a/src/DwarfInstructions.hpp
+++ b/src/DwarfInstructions.hpp
@@ -480,7 +480,7 @@ DwarfInstructions<A, R>::evaluateExpression(pint_t expression, A &addressSpace,
case DW_OP_plus_uconst:
// pop stack, add uelb128 constant, push result
- *sp += addressSpace.getULEB128(p, expressionEnd);
+ *sp += static_cast<pint_t>(addressSpace.getULEB128(p, expressionEnd));
if (log)
fprintf(stderr, "add constant\n");
break;
diff --git a/src/DwarfParser.hpp b/src/DwarfParser.hpp
index 7200c65..586653b 100644
--- a/src/DwarfParser.hpp
+++ b/src/DwarfParser.hpp
@@ -542,7 +542,8 @@ bool CFI_Parser<A>::parseInstructions(A &addressSpace, pint_t instructions,
results->cfaRegister = 0;
results->cfaExpression = (int64_t)p;
length = addressSpace.getULEB128(p, instructionsEnd);
- p += length;
+ assert(length < std::numeric_limits<pint_t>::max() && "pointer overflow");
+ p += static_cast<pint_t>(length);
_LIBUNWIND_TRACE_DWARF("DW_CFA_def_cfa_expression(expression=0x%" PRIx64
", length=%" PRIu64 ")\n",
results->cfaExpression, length);
@@ -557,7 +558,8 @@ bool CFI_Parser<A>::parseInstructions(A &addressSpace, pint_t instructions,
results->savedRegisters[reg].location = kRegisterAtExpression;
results->savedRegisters[reg].value = (int64_t)p;
length = addressSpace.getULEB128(p, instructionsEnd);
- p += length;
+ assert(length < std::numeric_limits<pint_t>::max() && "pointer overflow");
+ p += static_cast<pint_t>(length);
_LIBUNWIND_TRACE_DWARF("DW_CFA_expression(reg=%" PRIu64 ", "
"expression=0x%" PRIx64 ", "
"length=%" PRIu64 ")\n",
@@ -636,7 +638,8 @@ bool CFI_Parser<A>::parseInstructions(A &addressSpace, pint_t instructions,
results->savedRegisters[reg].location = kRegisterIsExpression;
results->savedRegisters[reg].value = (int64_t)p;
length = addressSpace.getULEB128(p, instructionsEnd);
- p += length;
+ assert(length < std::numeric_limits<pint_t>::max() && "pointer overflow");
+ p += static_cast<pint_t>(length);
_LIBUNWIND_TRACE_DWARF("DW_CFA_val_expression(reg=%" PRIu64 ", "
"expression=0x%" PRIx64 ", length=%" PRIu64 ")\n",
reg, results->savedRegisters[reg].value, length);