Skip to content

Op Parse Syntax Bug for Parenthesized Operands #6

Description

@shalebridge

I've added this here for archival purposes, as I've fixed this bug in my own fork of EASy68k.

There are a few syntax cases that trigger a false error due to how opparse.cpp handles parenthesized cases. For example:

LEA ($CFFF).w,A0 ; OK
LEA ($7FFF).w,A0 ; syntax error
LEA ($7FFF).w, A0 ; OK

The line that checks for (d,An) or (d,An,Xi) allows for some undefined behavior in syntax.

if (p[0] == '(' && p[1] != 'P' && p[2] != 'C') {    // CK 2018-2-7
    n = strchr(p,',');

This will find any comma in the line, even if it's outside the parenthesis. This also has a side effect of only filtering hex numbers that start with 'C':

LEA ($0FFF).w,A0 ; ERROR
LEA ($1FFF).w,A0 ; ERROR
...
LEA ($CFFF).w,A0 ; OK
LEA ($DFFF).w,A0 ; ERROR

Then:

if (n) {
    if((n[1] == 'A' && isRegNum(n[2])) || (n[1] == 'S' && n[2] == 'P') ) {

This will directly point to the destination 'A0' if there is no space before the operand, and prematurely send the data off to 'eval':

        p++;                  // skip (
        // evaluate displacement, p points to ','
        p = eval(p, &(d->data), &(d->backRef), errorPtr);
    }
}

When a space is added to the destination after the comma, it just happens to work since n[1] != 'A'.

The easy fix is to add a check for the index of ')' and see if the comma found is inside before continuing:

     n = strchr(p,',');
     pn = strchr(p, ')');
     if (n && n < pn) { ...

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions