It could work as follow:
Code: Select all
/* The library exports a libfunc() with none of the Safer C attributes
like root, async, pure, const and a global variable error_number.*/
#include <library.h>
async <isr> my_isr(void) {
/* From here should not be possible to call non compatible functions and
accessing global data. Making an exception knowing that there could
be consequences.*/
unsafe "library.h access" {
libfunc();
if (error_number != 0) {
...
}
}
}
A variant could be a tagging statement:
Code: Select all
tag "text" {
}
Which just associates a text description to a code block. It could be used for requirements tagging in code, something very common in industry.
Code: Select all
tag "implements [REQ_RT0014]" {
...
}
That optional text string is not used in any way, it could be used by the compiler to produce a report of the unsafe/tag constructs in a build:
<type>, <module>, <start line>, <end line>, <text>
For example:
unsafe, module1.c, 67, 69, "library.h access"
block_tag, module3.c, 34, 39, "implements [REQ_RT0014]"
Something to consider is using tagging also for global variables, functions, types, structures or any other construct declaration. The compiler will be able to conveniently report start..end lines of the various constructs.