A number of things could be causing the problem.
Notably, if the ball can travel more than one pixel per "tick" or "frame", it may intersect the paddle by more several pixels by the time the collision is detected.
You then reverse bounce the ball off the paddle by altering its velocity, but depending on the new angle, it may take several frames for the ball to completely leave the paddle. So, on the next tick, it's still intersecting and you're reversing the velocity again. A freak occurrence of this may well lead to the ball eventually leaving the paddle on the other side, appearing to fly straight through.
You may want to put a "do not collide for a while" flag on that paddle-ball combination, when the intersection is first detected.
As a related issue, if the ball is going fast enough (particularly when its x
-component is highest, like when the ball is travelling almost entirely horizontally, so that there is the least of the paddle for it to get through), there may in fact be no frames where the ball is physically intersecting the paddle.
This all depends on your code, which we can't see. Hopefully the above should give you some ideas, though.