Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: [PATCH] Fix a bunch of Coverity-reported defects
- X-seq: zsh-workers 52248
- From: Roman Perepelitsa <roman.perepelitsa@xxxxxxxxx>
- To: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- Cc: Zsh hackers list <zsh-workers@xxxxxxx>
- Subject: Re: [PATCH] Fix a bunch of Coverity-reported defects
- Date: Thu, 26 Oct 2023 11:19:14 +0200
- Archived-at: <https://zsh.org/workers/52248>
- In-reply-to: <CAH+w=7a88XNokfYdU4kfbNUAOn_bPPYw1zoRR0im-js_xRWwHQ@mail.gmail.com>
- List-id: <zsh-workers.zsh.org>
- References: <CAH+w=7a88XNokfYdU4kfbNUAOn_bPPYw1zoRR0im-js_xRWwHQ@mail.gmail.com>
On Thu, Oct 26, 2023 at 5:37 AM Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
>
> A batch of the warnings that I ignored were assignments of one field
> of a union to another field of the same union, e.g., a casted long
> onto a double, etc., which elicited "overlapping copy" warnings. I'm
> fairly confident we'd have seen things crashing by now if this wasn't
> safe, but I mention it in case someone knows why it might be a
> problem.
This can indeed cause problems. The conditions under which it happens
are subtle. Here's an example: https://godbolt.org/z/EvxTzM1hn.
inline int foo(int* x, float* y) {
*x = 1;
*y = 2;
return *x;
}
// Returns either 1 or 0x40000000 depending on the
// absence or presence of -fno-strict-aliasing.
int bar() {
union {
int x;
float y;
} z;
return foo(&z.x, &z.y);
}
// The same as bar() but with the call to foo()
// manually inlined. Return 0x40000000 with and
// without -fno-strict-aliasing.
int baz() {
union {
int x;
float y;
} z;
// The following code is equivalent to
// return foo(&z.x, &z.y).
int* x = &z.x;
float* y = &z.y;
*x = 1;
*y = 2;
return *x;
}
When compiled with `gcc -std=c99 -O2`:
bar:
mov eax, 1
ret
baz:
mov eax, 0x40000000
ret
When compiled with `gcc -std=c99 -O2 -fno-strict-aliasing`:
bar:
mov eax, 0x40000000
ret
baz:
mov eax, 0x40000000
ret
A simple workaround is to compile with -fno-strict-aliasing. This can
result in slower code but I don't think it's likely to be noticable.
Roman.
Messages sorted by:
Reverse Date,
Date,
Thread,
Author