Martin Uecker <uec...@tugraz.at> writes: > Am Montag, dem 18.11.2024 um 17:55 +0000 schrieb Qing Zhao: >> Hi, >> >> I am working on extending “counted_by” attribute to pointers inside a >> structure per our previous discussion. >> >> I need advice on the following question: >> >> Should -fsantize=bounds support array reference that was referenced through >> a pointer that has counted_by attribute? > > I think the question is what -fsanitize=bounds is meant to be. > > I am a bit frustrated about the sanitizer. On the > one hand, it is not doing enough to get spatial memory > safety even where this would be easily possible, on the > other hand, is pedantic about things which are technically > UB but not problematic and then one is prevented from > using it
While I largely share your views on the coherence of sanitizers, I think it's separate to whether we want -fsanitize=bounds to handle counted_by in a particular way. It's worth us discussing properly in its own thread on the gcc ML, IMO. > > When used in default mode, where execution continues, it > also does not mix well with many warning, creates more code, > and pulls in a libary dependency (and the library also depends > on upstream choices / progress which seems a limitation for > extensions). > > What IMHO would be ideal is a protection mode for spatial > memory safety that simply adds traps (which then requires > no library, has no issues with other warnings, and could > evolve independently from clang) > > So shouldn't we just add a -fboundscheck (which would > be like -fsanitize=bounds -fsanitize-trap=bounds just with > more checking) and make it really good? I think many people > would be very happy about this. > > Martin > > >> >> For the following small example: >> >> #include <stdlib.h> >> >> struct annotated { >> int b; >> int *c __attribute__ ((counted_by (b))); >> } *p_array_annotated; >> >> void __attribute__((__noinline__)) setup (int annotated_count) >> { >> p_array_annotated >> = (struct annotated *)malloc (sizeof (struct annotated)); >> p_array_annotated->c = (int *) malloc (annotated_count * sizeof (int)); >> p_array_annotated->b = annotated_count; >> >> return; >> } >> >> int main(int argc, char *argv[]) >> { >> setup (10); >> p_array_annotated->c[11] = 2; >> return 0; >> } >> >> Should ubsan add instrumentation to the above reference >> p_array_annoated->c[11] inside routine “main”? >> >> From my understanding, ubsan does not add bound checking for any pointer >> reference now, however, when the “counted_by” attribute is attached to a >> pointer field inside a structure, the “bound” information for this pointer >> is known, should we enhance the ubsan to instrument such reference? >> >> If Yes, then should we add the following limitation to the end user: >> >> When the counted_by attribute is attached to a pointer field, the >> -fsantize=bounds only work for such reference when the pointer is NOT casted >> to another type other than the original target type? >> >> Thanks for any comments and suggestions. >> >> Qing