Vivian
Vivian

Reputation: 21

c cpputest pointer mock segfault

I have a segfault occurring because I have a cpputest mock which returns a pointer to a struct, at the point that the mock is called, and inside the mock itself, the address of the struct is something like for example 0x7ffd59372178, but when I check the address of the pointer in the function which is passed the pointer to the struct by the mock, it ends up with a truncated version of the address, like for example 0x59372178, then, it tries to use the pointer, and segfaults because it's not looking at the right memory address.

I thought at first the function and the mock were operating with different definitions of the struct, but I made sure there was only one version of it and the behavior was the same. I also tried doing the same thing with just a float pointer to see if that would work, but that also ran into the same problem. In writing this example (which actually does work correctly) I proved that it's not an issue with an interaction between c and cpp, so I think now I need to investigate my buildchain.

What could be the probable cause(s) of the truncation of the pointer address I'm seeing?

test.cpp

#include "CppUTest/TestHarness.h"
#include "CppUTestExt/MockSupport.h"
#include "CppUTest/CommandLineTestRunner.h"

extern "C"
{
    #include "includes.h"
    #include <stdio.h>

    DivStruct_t* GetDivPtr()
    {
        void* retVal = mock().actualCall("GetDivPtr").returnPointerValue();

        printf("fake div in mock %p \n", retVal);

        return (DivStruct_t*)retVal;
    }
}

TEST_GROUP( mockTest )
{
    void setup()
    {
        // Initialize before each test
    }

    void teardown()
    {
        // Deinitialize after each test
        mock().clear();
    }
};

TEST ( mockTest, passingPointer )
{
    DivStruct_t fakeDiv;
    fakeDiv.f1 = 8.0;
    fakeDiv.f2 = 6.0;
    printf("fake div addr %p \n", (void*)&fakeDiv);
    mock().expectOneCall("GetDivPtr").andReturnValue(&fakeDiv);

    Cfunction();

    mock().checkExpectations();
}

function.c

#include "includes.h"
void Cfunction()
{
    DivStruct_t* div = GetDivPtr();
    // seg fault happens here
    printf("div addr %p \n", (void*)&div);
    float f1Val = div->f1;

    return;
}

includes.h

typedef struct
{
    float f1;
    float f2;
} DivStruct_t;

DivStruct_t* GetDivPtr();
void Cfunction();

main.cpp

#include "CppUTest/CommandLineTestRunner.h"

int main( int ac, char ** av )
{
    return CommandLineTestRunner::RunAllTests( ac, av );
}

Upvotes: 0

Views: 41

Answers (1)

Vivian
Vivian

Reputation: 21

I found a solution based on this post:

64 bit function returns 32 bit pointer

turns out I needed to define the function which calls the mock().actualCall in my header file of the c function

Upvotes: 1

Related Questions