Kamath
Kamath

Reputation: 4674

programmatically mocking a function

Is there any way to programmatically mock a function for a embedded c application, running on linux. In below example I want to mock main to call someBlah instead of someFunc in run-time.

#include <stdio.h>

void someFunc( void )
{
    printf("%s():%d\n",__func__,__LINE__);
}

void someBlah( void )
{
    printf("%s():%d\n",__func__,__LINE__);
}

int main(void)
{
    someFunc();
}

The program will be executing from ram in Linux so text segment should be modifiable. I know GDB works on some similar concept where breakpoints code locations are replaced by trap instructions.

Upvotes: 0

Views: 873

Answers (5)

asn
asn

Reputation: 838

Take a look at CMocka, there is an article about mocking on LWN: Unit testing with mock objects in C

Upvotes: 0

Dale Hagglund
Dale Hagglund

Reputation: 16460

There are a few mocking frameworks for C.

At work, we've had some success with cgreen but we did have to make changes to its internals. Luckily, it's quite small, and so relatively easy to extend. An alternative that looks good, but I haven't worked with, is a combination of Unity and CMock.

On the general topic of unit testing embedded C code, I highly recommend Test Driven Development for Embedded C.

Upvotes: 1

You could always make some part of the text segment modifiable by an appropriate call to mprotect and overwrite some code with your own (e.g. by generating machine code with libjit, GNU lightning, ... or manually).

But using function pointers is a cleaner way of doing that.

If the functions are inside a shared library, you could even overwrite its Procedure Linkage Table (see also the ABI spec, which depends upon the architecture - here is one for ARM)

Upvotes: 1

Jeff
Jeff

Reputation: 1362

Another way I have done this is:

#include <stdio.h>
#define DEBUG

void someFunc( void )
{
#ifndef DEBUG
    printf("%s():%d\n",__func__,__LINE__);
#else
    printf("%s():%d\n",__func__,__LINE__);
#endif
}

int main(void) 
{
    someFunc();
}

Upvotes: 0

buddhabrot
buddhabrot

Reputation: 1586

Sure, just make a table of function pointers.

#define BLAH 0
#define FOO 1
void (*table_function[])(void) = {someBlah, someFoo};

If they all have the same interface and return type, you can just switch them by switching table entries.

Then you call a function by performing

table_function[BLAH]();

If you want to swap a function, just say

table_function[BLAH] = otherBlah;

Also: don't do this unless you are writing some kind of JIT-compiling environment or a VM, usually you don't need such constructs and if you need them you are probably having a bad architecture day.

Although if you're experienced in OO design you can design polymorphic constructs in C that way (ignore this if that doesn't make sense).

Upvotes: 4

Related Questions