Strange object.ray_cast() behavior
Raycast argument Vectors need to be in object's local space.

Ray cast is behaving as expected.  The first parameter is the origin of the ray  src.location and the second is a direction vector, which from a target would be  direction = dst.location - src.location (most commonly normalized)

The vectors also need to be in the local coordinates of the target object being ray-cast onto. Simplest way to calculate another object into target objects local space is multiply the global coord by the target objects matrix world inverted

origin = cb.matrix_world.inverted() * src.matrix_world.translation # use @ for * in 2.8


Test script, using object references as in question.

mw = cb.matrix_world
mwi = mw.inverted()

# src and dst in local space of cb

origin = mwi * src.matrix_world.translation
dest = mwi * dst.matrix_world.translation
direction = (dest - origin).normalized()

hit, loc, norm, face = cb.ray_cast(origin, direction)

if hit:
    print("Hit at ", loc, " (local)")
    bpy.ops.object.empty_add(location = mw * loc)
else:
    print("No HIT")