[cfe-dev] UBSan false positive (?) with virtual inheritance

Alexey Sidorin via cfe-dev cfe-dev at lists.llvm.org
Sun Feb 2 02:38:54 PST 2020


Thank you a lot, Richard!


01.02.2020 06:09, Richard Smith пишет:
> ... and in fact we also generate wrong code for this example with the 
> sanitizers disabled -- we mark the reference parameter as 
> dereferenceable(sizeof(A)) rather than dereferenceable(nvsize(A)). Oops!
>
> Fixed in master.
>
> On Fri, 31 Jan 2020 at 09:54, Richard Smith <richard at metafoo.co.uk 
> <mailto:richard at metafoo.co.uk>> wrote:
>
>     This looks like a bug to me; it looks like we're checking for the
>     size of an A being available, but should only be checking for the
>     nvsize since we don't know we have an object whose most-derived
>     type is A.
>
>     On Thu, 30 Jan 2020, 23:45 Alexey Sidorin via cfe-dev,
>     <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>
>         Hello everyone,
>
>         The code example below triggers an undefined behavior
>         sanitizer warning when compiled with -O1 and higher:
>
>              1  struct Aux {
>              2    virtual ~Aux() = default;
>              3    int i = 0;
>              4  };
>              5
>              6  struct Base {
>              7    virtual ~Base() = default;
>              8  };
>              9
>             10  struct A : public virtual Base, public Aux {};
>             11
>             12  struct B final : public virtual A {};
>             13
>             14  void check(const A &a) {}
>             15
>             16  int main() {
>             17    B b;
>             18    check(b);// UBSan warns here
>             19    return 0;
>             20  }
>
>         When compiled with -fsanitize=undefined:
>
>         example.cpp:18:9: runtime error: reference binding to address
>         0x7ffe652149c8 with insufficient space for an object of type
>         'const A'
>
>         When compiled with -fsanitize=object-size:
>
>         example.cpp:12:8: runtime error: constructor call on address
>         0x7ffc7988a2e0 with insufficient space for an object of type 'A'
>
>         example.cpp:18:9: runtime error: reference binding to address
>         0x7ffc7988a2e0 with insufficient space for an object of type
>         'const A'
>
>         Could someone tell if it is a sanitizer false positive or does
>         this case actually contains a kind of UB? GCC doesn't give any
>         warning for this code.
>
>
>         _______________________________________________
>         cfe-dev mailing list
>         cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>         https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20200202/d14e08d7/attachment.html>


More information about the cfe-dev mailing list