@Override
	public void markInstructionError(InstructionError conflict) {

		Address address = conflict.getInstructionAddress();
		if (conflict.getInstructionErrorType() == InstructionErrorType.PARSE) {
			// retain context-register value if possible to facilitate parse debug
			RegisterValue contextValue = conflict.getParseContextValue();
			if (contextValue != null) {
				try {
					RegisterValue curContextValue = program.getProgramContext()
							.getRegisterValue(contextValue.getRegister(), address);

					// only store if different than what is already there, which could be a default value
					if (!contextValue.equals(curContextValue)) {
						program.getProgramContext()
								.setRegisterValue(address, address, contextValue);
					}
				}
				catch (ContextChangeException e) {
					// ignore - existing instruction likely blocked context modification
				}
			}
		}

		if (!doMarkBadInstructions ||
			conflict.getInstructionErrorType() == InstructionErrorType.DUPLICATE) {
			return;
		}

		boolean markAsError = true;

		Address flowFrom = conflict.getFlowFromAddress();
		String flowMsg = flowFrom != null ? (" (flow from " + flowFrom + ")") : "";
		Address markAddr = address;
		if (!isBookmarkAllowed(markAddr)) {
			if (flowFrom != null) {
				markAddr = flowFrom;
				if (conflict.getInstructionErrorType() == InstructionErrorType.MEMORY &&
					address.getOffset() == 0) {
					markAsError = false;
				}
			}
			else {
				return;
			}
		}

		bmMgr.setBookmark(markAddr, markAsError ? BookmarkType.ERROR : BookmarkType.WARNING,
			ERROR_BOOKMARK_CATEGORY, conflict.getConflictMessage() + flowMsg);
	}
Check if the called function doesn't return

@return true if the call also falls through to this instruction
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java