[llvm-bugs] [Bug 34266] New: [maybe regression]: undefined behavior due to misaligned access to aligned lambda

via llvm-bugs llvm-bugs at lists.llvm.org
Mon Aug 21 13:01:13 PDT 2017


https://bugs.llvm.org/show_bug.cgi?id=34266

            Bug ID: 34266
           Summary: [maybe regression]: undefined behavior due to
                    misaligned access to aligned lambda
           Product: clang
           Version: trunk
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
          Assignee: unassignedclangbugs at nondot.org
          Reporter: gonzalobg88 at gmail.com
                CC: dgregor at apple.com, llvm-bugs at lists.llvm.org

When compiling the following code with: clang++ -fsanitize=undefined -std=c++14

I get the following error:

mwe.cpp:30:14: runtime error: load of misaligned address 0x00000042ff61 for
type 'const (lambda at mwe.cpp:30:14) *', which requires 8 byte alignment
0x00000042ff61: note: pointer points here
 00 00 00  00 00 4b 46 69 76 45 00  50 bc 63 00 00 00 00 00  62 ff 42 00 00 00
00 00  2f 61 69 61 2f
              ^ 

initial debugging suggest that the lambda, which is properly aligned in
E::operator() is accessed via a misaligned pointer in D::operator(),
introducing undefined behavior. How this happens escapes me.

The reproducer is:

template<typename T>
struct static_const { static constexpr T value {}; };

template<typename T>
constexpr T static_const<T>::value;

struct B {
  static constexpr int bar(int) noexcept { return 0; }
  constexpr int baz(int) noexcept { return 0; }
};

struct C {
  auto operator()() const noexcept -> int { return 0; }
};

namespace {
  constexpr auto const& c_fn = static_const<C>::value;
}

struct D {
  template <typename F>
  auto operator()(F&& f) const noexcept -> int { return f(0); }
};

namespace { constexpr auto const& d_fn = static_const<D>::value; }

struct E {
  template <typename T = B>
  auto operator()(T t = B()) const noexcept -> T {
    auto l = [&](int i) { return t.baz(T::bar(i)); };
    d_fn(l);
    return t;
  }
};

namespace { constexpr auto const& e_fn = static_const<E>::value; }

int main() {
   auto a = c_fn();
   auto b = e_fn();
   return 0;
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170821/1cf11cb6/attachment.html>


More information about the llvm-bugs mailing list