Depending on INDEX construct it has been said that INDEX is Semi-Volatile.
With INDEX the resulting range is always contained within the explicitly referenced range - the same is not true of INDIRECT or other Volatiles such as OFFSET.
For ex.:
=INDEX(A:A,10)
though the resulting range of A10 is not singularly referenced within the function it's obvious to Excel that whatever the resulting range is it must reside somewhere within Col A and that range is explicitly referenced.
If you consider:
=INDIRECT("A10")
the resulting range is not referenced explicitly anywhere either singularly or by virtue of encompassing range - "A10" is after all just a text string (not a range).
Offset is obviously slightly different in so far as range references are used:
=OFFSET(A1,9,0)
however the resulting range is not necessarily contained within the range that is explicitly referenced.
I've always looked at things along the lines of:
wherever the precedents are not explicitly referenced singularly or by virtue of parent range the resulting function will invariably be Volatile.
Another Volatile ex. we found recently was SUMIF where the optional sum range dimensions are set such that it is smaller than the dimensions of the pre-requisite range, eg:
=SUMIF(A1:A10,C1,B1:B10)
is not Volatile and nor is
=SUMIF(A1:A10,C1,B1:B20)
whereas
=SUMIF(A1:A10,C1,B1)
is Volatile.
Though all three would generate the same result the first two are not volatile given all precedents are explicitly referenced ... the 2nd has additional unwarranted precedents (B11:B20).
The third is Volatile* given the precedent range is implicit.
(*in more recent versions - in early versions it is not Volatile but changing B2:B9 would not invoke a recalc. - ie construct would be open to error)
As I see things MS adopt a "better safe than sorry" approach with implicit precedents - an approach I agree with myself I have to say.
Hopefully others will have a more definitive answer for you.