I ran into an issue which caused an uncaught illegal code state. In the issue I was dealing with, I had moved some code around and created a state which effectively behaved like the following C# code sample (note the name collision):
var aastate = GetAttribute("button1", "aastate");
while (!aastate.ToString().Contains("unavailable"))
{
// snip
var aastate = GetAttribute("button1", "aastate");
}
I should expect a situation like this to throw a compiler error in a normal environment and likely an equivalent error in UiPath Studio due to the aastate
variable within the while
scope having the same name as a member of a parent scope. Instead, I got a warning (read: not an error) about duplicate names in my variables menu, which I usually leave closed to avoid clutter. This lead me to not be aware of the issue for some time until I opened the menu for a completely unrelated reason.
Despite this clearly illegal code, the bot was allowed to compile and run. This resulted in a NullReferenceException
as explained below.
In a standard code environment, if someone were to remove the first line from my sample code, a compiler warning would be thrown stating that aastate
“does not exist or is not accessible.” However, in the situation introduced above, this catch somehow does not trigger. The observed behavior is that the while loop instead grabs the value of the uninitialized internal aastate
instead of the aastate
in the parent scope, causing the aforementioned NRE.
One of the Microsoft employees I have contact with commented on the observed behavior:
I think I have no choice but to say that this is complete magic, and clearly doesn’t follow the rules I’d expect.
While the NRE is technically correct behavior (since it’s attempting to grab the value of an uninitialized variable), this situation should not have been able to exist in the first place given the illegal nature of the code.
I propose three things:
- Change name collisions warnings into errors. This is how it is treated in Visual Studio and it is what I would expect to happen here. This should prevent the code from “compiling” or executing as it would otherwise introduce an illegal state.
- Disallow creating variables of the same name where name collisions would occur. This should include creating names using the ctrl+k shortcut.
- In the event of a name collision (and the only remaining situation should be moving code around), warnings should be displayed before allowing the code to be moved and an opportunity provided to rename or merge the problem variables.