private boolean checkNonReturningIndicators(Instruction callInst, AddressSet noReturnFunctions)
			throws CancelledException {

		// check the address the instruction will return to
		Address fallThru = callInst.getFallThrough();

		FunctionManager funcManager = program.getFunctionManager();
		Function callingFunc = funcManager.getFunctionContaining(callInst.getMinAddress());

		Address target = null;
		Address[] flows = callInst.getFlows();
		if (flows != null && flows.length > 0) {
			target = flows[0];
		}

		// get the address of the next function after this instruction
		Address nextFuncAddr = getFunctionAfter(fallThru);

		Listing listing = program.getListing();
		while (fallThru != null) {
			/* check for a function after this call */
			if (nextFuncAddr != null && nextFuncAddr.equals(fallThru)) {
				NoReturnLocations location =
					new NoReturnLocations(target, fallThru, "Function defined after call");
				reasonList.add(location);
				return true;
			}
			/* code block model detects flow into data */
			CodeUnit cu = listing.getCodeUnitAt(fallThru);
			if (cu == null || cu instanceof Data) {
				NoReturnLocations location = new NoReturnLocations(target, callInst.getMinAddress(),
					"Falls into data after call");
				reasonList.add(location);
				return true;
			}
			Instruction instr = (Instruction) cu;

			/* check for codeblock containing a function */
			if (nextFuncAddr != null && cu.contains(nextFuncAddr)) {
				NoReturnLocations location = new NoReturnLocations(target, fallThru,
					"Function defined in instruction after call");
				reasonList.add(location);
				return true;
			}

			// check for inconsistent (data/call) references at fallthru after call
			if (hasInconsistentRefsTo(fallThru, funcManager, callingFunc, target)) {
				return true;
			}

			// check for defined data after
			Data data = listing.getDefinedDataAt(fallThru);
			if (data != null) {
				NoReturnLocations location =
					new NoReturnLocations(target, fallThru, "Data after call");
				reasonList.add(location);
				return true;
			}

			// get the next instruction in fallthru chain
			fallThru = null;
			if (instr.getFlowType().isFallthrough()) {
				fallThru = instr.getFallThrough();
			}
		}
		return false;
	}
Check for issues around a calling instruction that indicate the called function
may not return.  Example issues: calls refs right after, bad instruction, data after,
data ref after.

@param callInst - instruction to check
@param noReturnFunctions - set of functions that are already non-returning

@return true if there are indications the called function does not return
@throws CancelledException if monitor cancelled
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/FindNoReturnFunctionsAnalyzer.java