Skip to content

[Clang] Inconsistencies with -fstrict-overflow between Clang and GCC #124868

Closed
@JustinStitt

Description

@JustinStitt

Recent PR #122486 claims to make "[-fno-strict-overflow] option consistent across GCC and Clang".

I see that this PR is specifically referencing -fno-strict-overflow as toggling both -fwrapv and -fwrapv-pointer but to be truly consistent shouldn't -fstrict-overflow also imply -fno-wrapv and -fno-wrapv-pointer as this is what GCC does?

GCC's command-line reference claims:

-fstrict-overflow
This option implies -fno-wrapv -fno-wrapv-pointer and when negated implies -fwrapv -fwrapv-pointer.

The current implementation from PR#122486 doesn't exactly match this behavior. For example:

/* test.c */
extern char *ptr;
int main(void) {
  if (ptr + 1 < ptr) {
    return 1;
  } else {
    return 2;
  }
}
# on GCC 14.2.0
$ gcc -O2 test.c -fwrapv-pointer -fstrict-overflow -S

...
.LFB0:
        .cfi_startproc
        movl    $2, %eax
        ret
        .cfi_endproc


# on b8cdc5ea2741c7e4062bb211bac7033189b4d802
$ clang -O2 test.c -fwrapv-pointer -fstrict-overflow -S

...
# %bb.0:
        movq    ptr@GOTPCREL(%rip), %rax
        movq    (%rax), %rax
        leaq    1(%rax), %rcx
        cmpq    %rax, %rcx
        movl    $2, %eax
        sbbl    $0, %eax
        retq

The above example shows eager compiler optimizations stemming from lack of -fwrapv-pointer

The TLDR is: GCC's -fstrict-overflow implies -fno-wrapv-pointer and has precedence over existing -fwrapv-pointer. Clang doesn't do this, maybe misleading developers who read the release notes: The new behavior matches GCC.

If we're making -fno-strict-overflow match GCC should we also make -fstrict-overflow match too?

CCs

CC'ing folks from PR#122486
@nikic @shafik @AaronBallman @MaskRay @kees

Metadata

Metadata

Assignees

Labels

clang:driver'clang' and 'clang++' user-facing binaries. Not 'clang-cl'

Type

No type

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions