-
Notifications
You must be signed in to change notification settings - Fork 743
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[SYCL] Fix uncaught exceptions and null dereference #15173
Conversation
@dm-vodopyanov |
@dm-vodopyanov |
@intel/llvm-gatekeepers |
Co-authored-by: Dmitry Vodopyanov <[email protected]>
Co-authored-by: Dmitry Vodopyanov <[email protected]>
@intel/llvm-gatekeepers |
size_t size() const noexcept try { | ||
return MRange.size(); | ||
} catch (std::exception &e) { | ||
__SYCL_REPORT_EXCEPTION_TO_STREAM("exception in size", e); | ||
std::abort(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changes like this look weird to me and I think that we may need some spec changes here to avoid them. Tagging @gmlueck here for awareness/feedback.
The only meaningful exception I would expect to see from range::size()
is something like overflow_error
, but at the same time we expect this type to be used on device (as a return type of various nd_item
/group
-related APIs) and exceptions are not supported in there.
Changing definition of the method between host and device compilation seems hacky, so I assume that the SYCL spec can only have one definition. And I think that that definition should be noexcept
.
Reason behind our implementation throwing from range::size()
:
range
inherits fromdetail::common_array
to store datarange::size
usesdetail::common_array::operator[]
to access that datadetail::common_array::operator[]
contains a call tocheck_dimensions
which throws if index is out of range[0..2]
, but does that only on host
I would also explore if we should turn runtime check in detail::common_array::check_dimensions
into an assert
. Even though values we pass there could pass directly from user (via id::operator[]
for example), the SYCL spec is not clear what happens if we use an invalid dimension here. KhronosGroup/SYCL-Docs#551 is related, but there is no conclusion.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The change here seems unnecessary. Even without this change, if an exception is thrown in the body of size
, the application will terminate. That's the semantics of the noexcept
keyword. See cppreference:
Non-throwing functions are permitted to call potentially-throwing functions. Whenever an exception is thrown and the search for a handler encounters the outermost block of a non-throwing function, the function std::terminate is called
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The change here seems unnecessary. Even without this change, if an exception is thrown in the body of
size
, the application will terminate.
My understanding is that one of our code coverage tools complains about throw
in noexcept
function and we are unable to ignore that by some reason. It is probably a good notification for us to review associated code to see if we can actually make it noexcept
, but otherwise I don't think that its the end of the world. All those catch
block should almost always be unreachable as I understand it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've submitted KhronosGroup/SYCL-Docs#626 to see if we want to mark all methods of range
/id
/other similar classes as noexcept
in the SYCL spec so that we can clean up our code here.
Added proper handling of exceptions propagated to the outermost level. --------- Co-authored-by: Dmitry Vodopyanov <[email protected]>
Added proper handling of exceptions propagated to the outermost level.