public ProgramInfo getProgramInfo() throws IOException {
		if (info != null) {
			return info;
		}

		info = new ProgramInfo();

		SarifIO io = new SarifGsonIO();
		sarif = getSarif(io);
		controller = new SarifController(this);
		df = new SarifDataFrame(sarif, controller, true);
		List<Run> runs = sarif.getRuns();
		Set<Artifact> artifacts = runs.get(0).getArtifacts();
		Iterator<Artifact> iterator = artifacts.iterator();
		while(iterator.hasNext()) {
			Artifact next = iterator.next();
			Map<String, Object> props = next.getProperties().getAdditionalProperties();
			info.imageBase = (String) props.get("imageBase");
		}

		info.programName = "";
		info.exePath = "";
		info.exeFormat = "";
		info.user = "";
		info.setTool("");
		info.timestamp = "";
		info.version = "";
		info.languageID = new LanguageID(df.getSourceLanguage());
		info.compilerSpecID = new CompilerSpecID(df.getCompiler());
		info.processorName = "";
		info.family = "";
		info.addressModel = "";
		info.endian = "";

		return info;
	}
Returns the program info from the underlying file. T``his method does not
make sense to invoke if a write is being performed to a new file.

@return the program info
@throws IOException if an I/O error occurs
Ghidra/Features/Sarif/src/main/java/sarif/managers/ProgramSarifMgr.java