================
@@ -4022,8 +4169,36 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const 
ArraySubscriptExpr *E,
       ArrayLV = EmitArraySubscriptExpr(ASE, /*Accessed*/ true);
     else
       ArrayLV = EmitLValue(Array);
+
     auto *Idx = EmitIdxAfterBase(/*Promote*/true);
 
+    if (SanOpts.has(SanitizerKind::ArrayBounds)) {
----------------
rjmccall wrote:

Yeah.  Specifically, I was thinking that you already have the address of this 
flexible array member, and if the immediately containing struct is uniquely 
allocated directly within the root type of the `__counted_by` path, you can 
just find that offset statically and subtract to get a pointer to the root 
type.  But of course that only works if it *is* uniquely allocated directly 
within the root type, which it isn't going to be in the general case if the 
root type is just some lexically-enclosing struct, which ties this back to the 
other conversation.

Stepping back for a second, I'm surprised you need to do so much from scratch 
for flexible arrays.  Don't the other `-fbounds-safety` features already have 
some logic where they recognize e.g. a load from a `__counted_by` field of 
pointer type and then emit the count expression?  How do those code paths solve 
this problem?

https://github.com/llvm/llvm-project/pull/73730
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to