Re: A question about stack alignment in C language
> On Apr 5, 2019, at 19:08, Mo Zhou <lumin@debian.org> wrote:
>
> Hi mentors,
>
> This question tightly associates with my ongoing work for Debian's
> BLAS/LAPACK packages, specifically the 32-bit and 64-bit variants.
> I encountered a problem that I don't fully understand so I think I
> need some help at this point.
>
> Assume we have the following library "libfoo.c":
>
> #include <stddef.h>
> float sasum64(size_t N, const float *X, size_t incX)
> {
> float asum = 0.;
> for (size_t i = 0; i < N; i++) {
> asum += (X[i*incX] > 0.) ? X[i*incX] : -X[i*incX];
> }
> return asum;
> }
> float sasum32(int N, const float *X, int incX)
> {
> float asum = 0.;
> for (int i = 0; i < N; i++) {
> asum += (X[i*incX] > 0.) ? X[i*incX] : -X[i*incX];
> }
> return asum;
> }
>
> compiled as libfoo.so: gcc -shared -fPIC libfoo.c -o libfoo.so
> And we have the following application "app.c" which **deliberately**
> misuse the index type:
>
> #include <stdio.h>
> #include <stddef.h>
> float sasum64(int N, const float *X, int incX);
> float sasum32(size_t N, const float *X, size_t incX);
>
> int main(void)
> {
> float a[] = {1., 2., -3.};
> printf("%f, %f\n", sasum32(3, a, 1), sasum64(3, a, 1));
> return 0;
> }
>
> Then we compile and run the program:
>
> gcc app.c -fPIC -lfoo -L.
> LD_LIBRARY_PATH=. ./a.out 2:00:56
>>>> 6.000000, 6.000000
>
> My questions are:
>
> 1. Why doesn't the application segfault, since it has already
> misused the index (N and incX) type?
>
> 2. Did we avoid SIGSEGV because the arguments used to call
> sasum32 or sasum64 are aligned in 64-bits? But that's still
> strange due to little-endianess...
>
> 3. How can I make the app.c segfault?
>
> Thanks in advance :-)
>
I do not know why this question was addressed to Debian and Gentoo as it seems to have nothing specific to do with either, but let me attempt a response. With nothing further to go on, I am taking a guess that your platform is x86-64. The 32-bit values passed to the mis-prototyped sasum64 as N and incX will be zero extended to 64-bit values as per the ABI. I know neither why nor where you expect this program to segfault, so unfortunately I can’t comment further. You might want to try Stack Overflow for something like this.
Reply to: