Function pointer link stubs

| | Comments (0) | TrackBacks (0)

Last week been test-driving some C code again and found that not much people are familiar with the "function pointer link stub". This is an excellent technique in C to dynamically replace library calls without adjusting the library.

Imagine, you are working on some embedded software. You will have a couple of libraries that you use, but you won't link to it when unit testing. Instead you stub them out. But, a link stub cannot be adjusted on run-time, so how do you handle this? With... "function pointer link stubs".

The idea is simple. You stub out the library and your stub calls a function pointer when its set. When not set, it just returns success.

Here is some example code:

.h (in a library where we cannot change the header)

int aLibraryCallWeCannotChange(int param);

----------------
aLibraryStub.h

extern int (*aLibraryCallWeCannotChangeFp)(int param);

-----------------
aLibraryStub.c

int aLibraryCallWeCannotChange(int param)
{
    if (aLibraryCallWeCannotChangeFp) aLibraryCallWeCannotChangeFp(param);
    return 0;
}

int (*aLibraryCallWeCannotChangeFp)(int param) = NULL;

-------------------------
TestThatUsesLibrary.cpp

TEST_GROUP(blah)
{
    void setup()
    {
        UT_PTR_SET(aLibraryCallWeCannotChangeFp, dynamicStubOfALibraryCall);
    }
}

Now it is easy to place the code of your stub close to your tests and you will never have to change the linker stub code.

0 TrackBacks

Listed below are links to blogs that reference this entry: Function pointer link stubs.

TrackBack URL for this entry: http://www.odd-e.com/cgi-sys/cgiwrap/basv/managed-mt/mt-tb.cgi/724

Leave a comment

About this Entry

This page contains a single entry by Bas Vodde published on September 13, 2008 6:48 PM.

Agile Portfolio Management was the previous entry in this blog.

Presentation at the Scan-Agile conference is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Powered by Movable Type 4.01