Загрузка SIMD по границе памяти не вызывает Segfault?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Загрузка SIMD по границе памяти не вызывает Segfault?

Сообщение Anonymous »

Предположим, что я делаю (Unlighted) упакованную нагрузку _MM256_Loadu_pd на двойном (см. Сплы кода ниже). Наручает ли это правило строгого псевдонимы или иным образом к иным образом к неопределенному поведению в соответствии с стандартом C ++? Разве это не должно вызвать ошибку сегментации в теории? (Это полезно, когда, скажем, загрузка 3 удвоения за один раз.) < /P>

Следующий код компилируется без предупреждений (GCC -142.1 G ++ -Mavx -Ппеллиантично -wall ) и работает нормально (на GNU/Linux 6.13.2-Arch1-1):

Код: Выделить всё

#include 
#include 

int main() {
double* ptr = new double {};
double buf[4];
_mm256_storeu_pd(buf, _mm256_loadu_pd(ptr));
delete ptr;
std::printf("%e\n", buf[3]);
}
< /code>
Нет никаких сегментов. Асан (-fsanitize=address
), хотя сообщают о переполнении буфера кучи. Поведение может зависеть от реализации.
Мой вопрос больше похож на то, почему эта нагрузка разрешена (ядром? Разве это не дает мне доступ к памяти, которой я не владею?

Подробнее здесь: https://stackoverflow.com/questions/794 ... e-segfault
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»