UML representation for C/C++ function pointers

UML representation for C/C++ function pointers

EAs help file has the following to say on the subject of function pointers:

When importing C++ source code, Enterprise Architect ignores function pointer declarations. To import them into your model you could create a typedef to define a function pointer type, then declare function pointers using that type. Function pointers declared in this way are imported as attributes of the function pointer type.

Note could. This is from the C++ section, the C section doesnt mention function pointers at all. So theyre not well supported, which in turn is of course due to the gap between the modelling and programming communities: non-trivial language concepts are simply not supported in UML, so any solution will by necessity be tool-specific.

My suggestion is a bit involved and its a little bit hacky, but I think it should work pretty well.

Because in UML operations are not first-class and cannot be used as data types, my response is to create first-class entities for them – in other words, define function pointer types as classes.

These classes will serve two purposes: the class name will reflect the functions type signature so as to make it look familiar to the programmer in the diagrams, while a set of tagged values will represent the actual parameter and return types for use in code generation.

0) You may want to set up an MDG Technology for steps 1-4.

1) Define a tagged value type retval with the Detail Type=RefGUID;Values=Class;

2) Define a further set of tagged value types with the same Detail named par1, par2 and so on.

3) Define a profile with a Class stereotype funptr containing a retval tagged value (but no par tags).

4) Modify the code generation scripts Attribute Declaration and Parameter to retrieve the retval (always) and par1 – parN (where defined) and generate correct syntax for them. This will be the tricky bit and I havent actually done this. I think it can be done without too much effort, but youll have to try it. You should also make sure that no code is generated for funptr class definitions as they represent anonymous types, not typedefs.

5) In your target project, define a set of classes to represent the primitive C types.

With this, you can define a function pointer type as a «funptr» class with a name like long(*)(char) for a function that takes a char and returns a long.

In the retval tag, select the long class you defined in step 4.

Add the par1 tag manually, and select the char class as above.

You can now use this class as the type of an attribute or parameter, or anywhere else where EA allows a class reference (such as in the par1 tag of a different «funptr» class; this allows you to easily create pointer types for functions where one of the parameters is itself of a function pointer type).

The hackiest bit here is the numbered par1 – parN tags. While it is possible in EA to define several tags with the same name (you may have to change the tagged value window options to see them), I dont think you could retrieve the different values in the code generation script (and even if you could I dont think the order would necessarily be preserved, and parameter order is important in C). So youd need to decide the maximum number of parameters beforehand. Not a huge problem in practice; setting up say 20 parameters should be plenty.

This method is of no help for reverse engineering, as EA 9 does not allow you to customize the reverse-engineering process. However, the upcoming EA 10 (currently in RC 1) will allow this, although I havent looked at it myself so I dont know what form this will take.

enter

Defining of function pointers is out of scope of UML specification. What is more, it is language-specific feature that is not supported by many UML modeling software. So I think that the general answer to your first question suggests avoiding of this feature. Tricks you provided are relevant to Enterprise Architect only and are not compatible with other UML modeling tools. Here is how function pointers is supported in some other UML software:

MagicDraw UML uses <<C++FunctionPtr>> stereotypes for FP class members and <<C++FunctionSignature>> for function prototype.

Sample of code (taken from official site — see Modeling typedef and function pointer for C++ code generation viewlet):

class Pointer
{
    void (f*) ( int i );
}

Corresponding UML model:

Function

Objecteering defines FP attributes with corresponding C++ TypeExpr note.

Rational Software Architect from IBM doesnt support function pointers. User might add them to generated code in user-defined sections that are leaved untouched during code->UML and UML->code transformations.

UML representation for C/C++ function pointers

Seems correct to me. Im not sure you should dive into the low-level details of descripting the type and relation of your single function pointer. I usually find that description an interface is enough detalization without the need to decompose the internal elements of it.

Leave a Reply

Your email address will not be published.