mirror of
https://github.com/angr/angr
synced 2026-08-17 12:23:11 -04:00
* Fix signed division and remainder in the pcode engine OpBehaviorIntSdiv and OpBehaviorIntSrem used Claripy's `/` and `%`, which are unsigned bit-vector operations. For negative operands they therefore produced the same results as the unsigned INT_DIV and INT_REM behaviors. INT_SDIV now uses claripy.SDiv (truncation toward zero). INT_SREM is defined as in1 - SDiv(in1, in2) * in2, giving a remainder with the dividend's sign, which matches the p-code semantics documented in the class comments. For 64-bit -5 and 2, INT_SDIV now yields -2 (0xfffffffffffffffe) and INT_SREM yields -1 (0xffffffffffffffff) instead of large unsigned values. The arithmetic behavior test table enables both INT_SDIV and INT_SREM with the matching signed reference expressions, and a new concrete test checks mixed-sign combinations (-5/2, 5/-2, -5/-2, ...) that an unsigned implementation cannot satisfy. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Use claripy.SMod for INT_SREM Per review, INT_SREM uses claripy.SMod directly instead of the equivalent in1 - claripy.SDiv(in1, in2) * in2. Verified identical to a truncated-toward-zero reference over 100k random 64-bit pairs, including the INT_MIN / -1 corner. * Address pcode signed arithmetic review comments * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| light | ||
| pcode | ||
| vex | ||
| __init__.py | ||
| test_actions.py | ||
| test_hook.py | ||
| test_java.py | ||
| test_unicorn.py | ||