@Override
	public boolean added(Program addedProgram, AddressSetView addedSet,
			TaskMonitor addedMonitor, MessageLog addedLog) throws CancelledException {
		AddressIterator addresses = addedSet.getAddresses(true);
		AddressSet functionStarts = new AddressSet();
		while (addresses.hasNext() && !addedMonitor.isCancelled()) {
			Address address = addresses.next();
			// if there are any conditional references, then this can't be a function start
			if (hasConditionalReferences(addedProgram, address)) {
				continue;
			}
			
			// Check for any function containing the potential start detected earlier in analysis
			Function funcAt =
				addedProgram.getFunctionManager().getFunctionContaining(address);
			if (funcAt != null) {
				if (funcAt.getEntryPoint().equals(address)) {
					continue;
				}
				BookmarkManager bookmarkManager = addedProgram.getBookmarkManager();
				bookmarkManager.setBookmark(address, BookmarkType.ANALYSIS,
					getName() + " Overlap",
					"Function exists at probable good function start");
				continue;
			}
			functionStarts.add(address);
		}
		
		// create functions that still don't exist/overlap
		new CreateFunctionCmd(functionStarts, false).applyTo(addedProgram, addedMonitor);
		return true;
	}
One time analyzer used to delay function creation until disassembly has settled.
Ghidra/Features/BytePatterns/src/main/java/ghidra/app/analyzers/FunctionStartAnalyzer.java