improper "add negative -> subtract" transformation with floating point

Open
#2,807 1 comment 0 reactions 1 assignee View on GitHub

@rssor is already working on this.

Since Jan 12, 2022.

Assessment

This issue has not been assessed yet.

Description

Component: Core Effort: Low Impact: Medium

Version and Platform (required):

  • Binary Ninja Version: 2.5.3140-dev (Build ID 532595b6)
  • OS: macOS
  • OS Version: 11.6

Steps To Reproduce:
Please provide all steps required to reproduce the behavior:

  1. Open this binary.

  2. Notice in HLIL:

00000000  uint64_t _start(float arg1 @ v0)

00000004      data_4000
0000001c      return zx.q(int.d(arg1 - 0x41666666))


00000020  uint64_t sub_20(float arg1 @ v0)

00000024      data_4000
0000003c      return zx.q(int.d(arg1 f+ 0x41666666))

Expected Behavior:
The functions are identical except for loading a different constant: one is "negative" 0x41666666, one is "positive" 0x41666666. In reality, both constants are used as 32-bit floats, not signed integers.

In the second function, Binary Ninja indicates that floating point addition is being used with f+ 0x41666666. But in the first function, Binary Ninja produces just - 0x41666666. This is wrong in two ways: it doesn't indicate that floating point is being used, and in any case arg1 f+ -0x41666666 (i.e. arg1 f+ 0xbe99999a, i.e. arg1 + -0.300000011921) is not equivalent to arg1 f- 0x41666666 (i.e. arg1 + 14.3999996185).

Dominant language
C++
Stars
1.3k
Forks
298
Avg merge
5d 5h
Merged PRs (30d)
19

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Vector35/binaryninja-api

All issues in Vector35/binaryninja-api

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.