D053 - The census had been carrying a fragment of a symbol name, and now it cannot
Status: bug, found and fixed.
X(FromAddr) was in the generated census. It is the tail
of sceKernelGetModuleInfoFromAddr: when
sceKernelGetModuleInfo was promoted to a real check, it was
removed from the census list by a match that did not respect word
boundaries, and it took the front off a longer name that happened to
contain it.
The damage is quiet in both directions. FromAddr is not
a symbol, so it was censused as absent forever - a false negative, which
the census header correctly says is harmless. The real cost is the other
half: sceKernelGetModuleInfoFromAddr is a symbol,
and it stopped being counted at all while the list still appeared to
contain it.
Nothing would have caught it. The build succeeds, the census runs, the report is well-formed, and the only signal is a name that does not look like a name - visible only to somebody reading the generated header for another reason, which is how it was found.
gen-surface.py now refuses any name not shaped like a
symbol: sce and a capital, or two leading underscores, or a
lowercase first letter. FromAddr matches none of the three.
The rule is crude and that is the point - it costs nothing and closes
the only route this failure has.
Worth noting what the guard is really for. The removal that caused this was done by hand in a moment when the attention was on the promoted symbol, not on the list it was leaving. That will happen again, and the fix is not to be more careful.