TrTnJohn,
In the most generic terms, all associations can be represented with a dashed arrow and a stereotype. Bidirectional associations with two dashed arrows, one on each direction
for example, generalization can be a dashed arrow and a <<specialize>> stereotype, composition can be a dashed arrow and a <<has a>> stereotype, etc.
Several of the associations are so common that they deserve their own icon, aggregation (hollow diamond) being one of them, and composition (filled diamond) being another. Thus my comment on the "kind of" association. You can think of composition as a kind of aggregation (explanation below).
Now, regarding your comments on aggregation and composition, it is important to note that aggregation (your "has a") has a lifetime implication. An aggregated instance may have a different lifetime than the aggregating instance.
Composition, on the other hand (your "must have a") , implies that the aggregated and aggregating instances have the same lifetime. Whan A goes away, B goes away.
Notice that the UML does not say whether A and B are associated during construction of the aggregating class or whether the association is built by calling a method in A after A is constructed. This is in line with UML, since it takes care of the "logical" design aspect. In C++ there is another aspect that it's called physical design (by John Lakos).
Lastly, I use generic associations in my designs. For example, if I want to have a developer notice that A uses B in some way, just draw a dashed arrow pointing to B to note that A depends in some way on B (i.e., uses it in the class "interface", denoting that interface here means all the methods for A and B is used as a parameter in one of the methods).
Regards,
Javier