private AddressSet getByteDifferences(AddressSetView addrs, TaskMonitor monitor)
			throws CancelledException {
		AddressSet differences = new AddressSet();

		differences.add(getNonCommonAddressSet(addrs));
		differences.add(getInitializationDiffersAddressSet(addrs));

		// Check each address range from the address set for differences.
		AddressSet inCommon = getAddressesInCommon();
		if (addrs != null) {
			inCommon = inCommon.intersect(addrs);
		}
		monitor.initialize(inCommon.getNumAddresses());
		AddressRangeIterator iter = inCommon.getAddressRanges();
		while (iter.hasNext()) {
			AddressRange range = iter.next();
			try {
				compareBytes(range, differences, monitor);
			}
			catch (MemoryAccessException e) {
				// Do nothing. Shouldn't happen. Both should have bytes.
			}
			checkCancelled(monitor);
		}
		checkCancelled(monitor);
		return differences;
	}
Determines the addresses within the two programs where bytes differ.
If a byte difference is found, the entire code unit is added to the address set.
This also indicates addresses in program1 that are not in program2 as well as
program2 addresses that are compatible with program1 but not in program1 memory.

@param addrs the addresses to check for differences.
The addresses in this address set should be derived from program1.
@param monitor the task monitor for indicating the progress of
determining differences. This monitor reports the progress to the user.
@return the addresses where there were different byte values including where
one program has bytes and the other does not.
The addresses in this address set are derived from program1.
@throws CancelledException if the user canceled the Diff.
Ghidra/Features/Base/src/main/java/ghidra/program/util/ProgramDiff.java