a property of the language, not the machine
This is the fine print of Rice's theorem, and getting it wrong leads people to wildly over-claim. The distinction is between WHAT a program does and HOW it is written. A property of the language (a semantic property) asks about the set of inputs the program accepts — its behaviour. A property of the machine (a syntactic property) asks about the program's source text — its structure. Rice's theorem condemns the first kind to undecidability; it says nothing against the second kind, many of which are perfectly decidable.
Think of two programs that both compute the exact same thing but are written completely differently — one in ten lines, one in a thousand, perhaps in different styles. They recognize the SAME language, so they share every semantic property: same accepted strings, same emptiness, same finiteness. But they differ in syntactic properties: different line counts, different variable names, different numbers of states. Rice's theorem is a statement about the things the two programs share (their common language), not about the things that distinguish their texts. 'Does L(M) contain hello?' is semantic and undecidable; 'does M have exactly 7 states?' or 'does M's source contain a goto?' is syntactic and decidable by simply inspecting the code.
The practical upshot saves you from a common error. People sometimes 'disprove' Rice's theorem by pointing out that a linter can detect, say, unreachable code or whether a function has three arguments — but those are syntactic facts about the text, fully decidable, and never claimed undecidable. Rice only bites once your question is really about behaviour: what outputs the program produces, what inputs it accepts, whether two programs behave alike. The boundary between syntax and semantics is exactly where the decidable and the undecidable part ways.
Semantic (undecidable): 'does M ever accept an even-length string?' Syntactic (decidable): 'does M's transition table have more than 5 rows?' The first is about behaviour; the second you settle by reading the table.
Rice's theorem hits semantic (behavioural) properties; syntactic (textual) properties can stay decidable.
Two machines with identical code obviously recognize the same language, but two machines with totally different code can too. Rice's theorem speaks only of the shared language.