Hex-Rays interactive operation: Force new variable

Hotkey: Shift-F

Sometimes a stack slot is used for two completely different purposes during the lifetime of a function. While for the unaliased part of the stack frame the decompiler can usually sort things out, it cannot do much for the aliased part of the stack frame. For the aliased part, it will create just one variable even if the corresponding stack slot is used for multiple different purposes. It happens so because the decompiler cannot prove that the variable is used for a different purpose, starting from a certain point.

The force new variable command is designed to solve exactly this problem.

This command allows the user to force the decompiler to allocate a new variable starting from the current point. If the current expression is a local variable, all its subsequent occurrences will be replaced by a new variable up to the end of the function or the next forced variable at the same stack slot. If the cursor does not point to a local variable, the decompiler will ask the user about the variable to replace.

In the current statement, only the write accesses to the variable will be replaced. In the subsequent statements, all occurrences of the variable will be replaced. We need this logic to handle the following situation:

        func(var, &var);
where only the second occurrence of the variable should be replaced. Please note that in some cases it makes sense to click on the beginning of the line with the function call, rather than on the variable itself.

Please note that in the presence of loops in the control flow graph it is possible that even the occurrences before the current expression will be replaced by the new variable. If this is not desired, the user should force a new variable somewhere else.

The very first and the very last occurrences of a variable cannot be used to force a new variable because it is not useful.

The decompiler does not verify the validity of the new variable. A wrong variable allocation point may render the decompiler output incorrect.

Currently, only aliasable stack variables can be forced.

A forced variable can be deleted by right clicking on it and selecting 'Delete forced variable'.

See also: interactive operation