This isn't a bug; it's a usage error. Abs() is indeed returning a positive "long" value, but when you stuff that return into a (short) int variable, you run the risk of overflowing the range of representable int's and getting unexpected results. It doesn't have anything to do with abs()
void setup ()
{
Serial.begin(9600);
long a = 100000;
long b = 40000;
int x = a - b;
Serial.println(x);
}
This function, for example, prints -5536, and not 60000 like you might initially expect.