It seems from this very interesting discussion that Simon's question doesn't have a simple and clear answer.
Simon, if I might make a suggestion? Whilst you are waiting for the situation to become clear, I would sit down with a blank sheet of paper and then brainstorm all the possible ways that the software can affect the safety of the product. Basically, identifying all the places that are "touched" by the software, both literally - in terms of the electronics that interface with the software - and in terms of which features and functions are implemented or affected in any way by the software.
Then, with that list in hand, imagine all the ways in which the software can adversely affect the safe functioning of the system. This might include bad control signals to machinery, crashing when receiving bad data from sensors, failing to respond quickly enough to stimuli, and so on. Aim to list every possible failure mode.
You will have performed an FMEA (failure modes and effects analysis, for any newbies watching). Put all of this into a formal document which you will keep forever.
Then your work splits two ways. Firstly you need to develop a comprehensive test strategy, the aim of which is to test all of the failure modes you have captured. Each failure mode is likely to require several specific tests to exercise all the ways that failure could occur. This Test Strategy needs to be another formal document, stored forever.
Once you have performed all the tests, bug-fixing as you go, you should record the results in a Test Results document, again, stored safely.
Going through this exercise will definitely improve the reliability and safety of the system. But just as importantly, you will have a fully documented process from FMEA through to Test Results (the final version of which will show a 100% pass rate). This will stand you in great stead if some kind of event should happen, but also if a regulatory body asks for evidence of the efforts you have made to assure the safety of your product.
Most developers stop there. However, I advocate another activity: the second of the ones I alluded to above. Try to engineer your software so that it polices itself, looking for possible errors and stopping them before they propagate. This involves things like sanity checking (range checking) of all the data sources - including manual inputs. Also, sanity checking internal data structures. Watchdog protection, as recently discussed in another thread, and so on. You can decide the best response to issues that get identified: either repair, recover and continue; or a system halt. And most valuable of all is a log file containing all the information arising from the software resilience activities, usually implemented as a circular buffer.
I'm sorry if this is teaching you to suck eggs! 😄 As an ex-Reliability Engineer this stuff floats my boat. There is something immensely satisfying in making a system which is virtually bulletproof - high reliability, high resilience, high availability. But especially, it impresses compliance auditors and - hopefully not in your case - defence lawyers.