2016-02-04 5 views
0

Я знаю, что в соответствии со стандартом C не разрешается выполнять чтение без знака, так как это может привести к SIGBUS.Как узнать, безопасно ли читать данные с неаудированных адресов памяти на моей машине?

Тем не менее, я видел некоторые машины, где это не проблема.

Как узнать, можно ли безопасно читать из неосновной памяти на моей машине? В частности, я использую Amazon Linux.

$ lscpu 
Architecture:   x86_64 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    8 
On-line CPU(s) list: 0-7 
Thread(s) per core: 2 
Core(s) per socket: 4 
Socket(s):    1 
NUMA node(s):   1 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     60 
Stepping:    3 
CPU MHz:    800.000 
BogoMIPS:    7981.41 
Virtualization:  VT-x 
L1d cache:    32K 
L1i cache:    32K 
L2 cache:    256K 
L3 cache:    8192K 
NUMA node0 CPU(s):  0-7 
+4

Если вы не поймали кражу автомобиля, ворует автомобиль, разрешенный? – Olaf

+1

Думаю, это очень хорошо: https://www.kernel.org/doc/Documentation/unaligned-memory-access.txt – Ctx

+0

Это никогда не бывает безопасным, просто доверяйте стандарту (можете ли вы указать или предоставить ссылку к заявлению, о котором вы говорите?) – Bludzee

ответ

2

Будет ли он «работать» в окружающей среде, о которой вы описали? «Да», (с штрафными штрафными санкциями.)

Безопасно? Если вы пересекаете занятую улицу с завязанными глазами и безопасно перемещаете ее с другой стороны, это «безопасно»?

4

Дело в том, что в большинстве случаев неправильный доступ равен undefined behavior (если вы требуете кода портативного и стандартного кода C или C++).

Неопределенное поведение всегда very bad, и имеет неприятное свойство, что иногда это может показаться на работу (так что наличие какой-то программы, видимо, работать ничего не сказать, она может сломаться в следующий раз).

И на практике, на нынешних машинах, принимающих UNALIGNED Допуски (возможно много процессоров x86_64), такие доступы очень медленно потому что они делают CPU cache несчастными (по необходимости два памяти читает на аппаратном уровне). См. Также this.

Таким образом, просто избегать несвязанного доступа (и другие формы UB, включая buffer overflows). Постарайтесь составить код для стандарта и следовать общей практике и мудрости. Включите все предупреждения в своем компиляторе и попробуйте не получить ни одного. Дополнительную информацию см. В разделе this link.