Memmove causing program crashes, giving SIGTRAP in GDB(?)
KENNON J CONRAD
kennonconrad@comcast.net
Thu Feb 26 09:53:01 GMT 2026
>From the second crash backtrace:
new_score_rank = 767
rank = 3360
candidates_index = 0xa00034460
>From the code:
uint16_t * candidates_index = thread_data_ptr->candidates_index;
.
.
.
memmove(&candidates_index[new_score_rank + 1], &candidates_index[new_score_rank], 2 * (rank - new_score_rank));
In this case the candidates_index (uint16_t array) starts at address 0xa00034460 and elements 767 - 3359 are being moved into elements 768 - 3360 and the memmove call should be memmove(0xa00034a60, 0xa00034a5e, 5186).
For the first case with address 0xa00034470 and elements 2633 - 4379 being moved right by 2 bytes it should be (0xa00035904, 0xa00035906, 3492).
That is an excellent point about alignment. I was thinking somehow the rep count went crazy, but an alignment problem seems at least as likely. I would hope memmove handles that correctly, but it's one of the things I want to look at tommorrow. To me the weird part is that it doesn't fail consistently, only like once per about 2 - 10 million calls at seemingly random points in the process. The test case does over 10 million calls to memset at this location and doesn't crash about half the time. I don't know what the rarity of the SIGTRAP means, but it makes me wonder if it could be interrupt related or even a hardware problem that is exposed by rep movsq. The alternative bloated but robust code does not use rep movsq here.
Best Regards,
Kennon
> On 02/26/2026 12:15 AM PST Glenn Strauss <gs-cygwin.com@gluelogic.com> wrote:
>
>
> On Wed, Feb 25, 2026 at 11:59:07PM -0800, KENNON J CONRAD via Cygwin wrote:
> > Okay, so now I learned about setting the frame and disassemble and see the memmove code:
> >
> > Dump of assembler code for function memmove:
> [snip]
> > => 0x00007ff96ba812a9 <+137>: rep movsq %ds:(%rsi),%es:(%rdi)
> [snip]
> > End of assembler dump.
>
> movsq requires address alignment of 8 bytes.
> What are the pointer addresses of the arguments to memmove()?
> A SIGTRAP may result if the addresses are not 8-byte aligned.
>
> Cheers, Glenn
More information about the Cygwin
mailing list