Why does the value range of outputs need to be restricted? In the 'tx messages' section for protocol rules we have


Each output value, as well as the total, must be in legal money range




For each input, if the referenced output does not exist (e.g. never existed or has already been spent), reject this transaction


If my understanding is correct, rule 4 will confirm 0 &lt;= output, sum of outputs &lt;= 21,000,000, and rule 12 is checking that each input is in the UTXO set. I am having a hard time seeing why rule 4 is necessary, it seems like other rules - such as rule 12 - would already invalidate a transaction that was not in legal range. No one could ever have &gt; 21,000,000 bitcoin so there could never be utxos for more 21,000,000.
Also, where can I find the code for these checks in the source code.
If the output value was only constrained by their sum being smaller than that of the inputs, you could e.g. set one output to a negative value and create new money in a second output.
You can also do more creative stuff:
I think the rule might have been introduced as a response to the value overflow incident on 2010-08-15. A transaction in a (now invalid) block at height 74638 created outputs that were so large that their sum overflowed into the permitted range. The transaction created 2×92.2 billion bitcoins.
The original code fix for the value overflow incident can be found here: https://github.com/bitcoin/bitcoin/commit/d4c6b90ca3f9b47adb1b2724a0c3514f80635c84#diff-118fcbaaba162ba17933c7893247df3aR1013
The code for this rule can be found in src/consensus/tx_check.cpp here. The CheckTransaction() function checks consensus rules that don't require any knowledge of the current chainstate.