- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
#include <stdio.h>
int main(void) {
int a, b;
int *p = &a;
int *q = &b + 1;
printf("%p %p %d\n", (void *)p, (void *)q, p == q);
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−2
#include <stdio.h>
int main(void) {
int a, b;
int *p = &a;
int *q = &b + 1;
printf("%p %p %d\n", (void *)p, (void *)q, p == q);
return 0;
}
https://habr.com/company/pvs-studio/blog/418023/
0x7fff4a35b19c 0x7fff4a35b19c 0
кто понимает почему?
guest8 25.07.2018 10:29 # −999
Elvenfighter 25.07.2018 11:34 # −1
https://wandbox.org/permlink/MF1L8CRAkYsZbuZg
https://wandbox.org/permlink/WYDI2qedK3TRvGSj <--
https://wandbox.org/permlink/NiuxKgk23SR2f37N
https://wandbox.org/permlink/AFcT9cU6Rn8W9bMC
guestinxo 25.07.2018 11:37 # 0
codemonkey 25.07.2018 13:10 # −1
guest8 25.07.2018 17:42 # −999
KOHTPArEHTTBOEuMAMKu 25.07.2018 12:39 # 0
codemonkey 25.07.2018 13:09 # −1
roskomgovno 25.07.2018 15:07 # 0
%p -- writes an implementation defined character sequence defining a pointer. Там можно написать "pituz" и это будет по стандарту.
Стандарт вообще ничего не говорит про то какие там числа.
Он лишь говорит что у поинтеров бывает арифметрика внутри массивов. Все.
guest8 25.07.2018 17:48 # −999
guest8 25.07.2018 17:51 # −999
guest8 25.07.2018 18:30 # −999
roskomgovno 25.07.2018 22:10 # 0
Порядок -- личное дело компилятора, не надо закладываться на то, что не написано в штандарте
guest8 25.07.2018 22:13 # −999
roskomgovno 25.07.2018 22:53 # +1
Кстати, x86 умеет невыровненный доступ, но с пенальти (делая за программиста всю грязную работу). некоторые CPU не умеют и дают exception.
Некоторые умеют менять поведение в зависимости от регистра (кажется чуть-ли не в x86 когда-то такое или было или хотели сделать).
Тяжелое наследие 8088 в котором шЫрина всех шЫн была 1 байт, и можно было ничо не выравнивать
Но вот уже 286 читал 0,1 куда лучше чем 1,2 бо в ему приходилось делать ДВА чтения и половину выкидывать.
Тут бы и дать пизды программистам, включить exception, но intel пожалел обратную совместимость
guest8 25.07.2018 22:27 # −999
roskomgovno 25.07.2018 22:27 # 0
А мне кажется что в стандарте Си нету понятия "стек". Там есть "автоматические переменные"
guest8 25.07.2018 22:35 # −999
roskomgovno 25.07.2018 22:38 # 0
Ну и адресация разная видимо. Вот как у PC есть две дорожки (IO и MEM) так и у них есть MEM-DATA и MEM-CODE.
Или я что-то пута?
Локальные переменные вроде должны лежать в области данных, не?
guest8 25.07.2018 23:47 # −999
roskomgovno 25.07.2018 23:51 # 0
ну в любом случае если писнуть 123 в IP и в DX то там будут адреса разных ячеек
guest8 26.07.2018 01:37 # −999
KOHTPArEHTTBOEuMAMKu 26.07.2018 01:39 # 0
bormand 26.07.2018 05:36 # +1
> раздельная адресация
> разные шины
Это 3 ортогональных хуйни, не надо их смешивать.
Вот у того же stm32f4 от ядра уходят 3 шины (I, D, S) и авторы его относят к гарвардской архитектуре. Но все эти шины заведены в один bus matrix и ядро вполне может читать инструкции через I-bus из того же самого блока оперативки, в которую пишет данные через S-bus (но с разными будет быстрее т.к. нет конфликтов). При этом адреса у всех железок (блоков оперативки, флешки, периферии) на всех шинах одинаковы, хотя и не все шины bus matrix роутит ко всем железкам (через I-bus, к примеру, не видно USB контроллер и один из блоков оперативки).
roskomgovno 26.07.2018 16:49 # 0
Вот тебе картинка
https://en.wikipedia.org/wiki/Harvard_architecture#/media/File:Harvard_architecture.svg
... with physically separate storage and signal pathways for instructions and data
То-есть у нас и устройства и шина разные.
А теперь скажи, как программист может явно НЕ указать какие данные ему нужны: код или дата? Как CPU поймет на какую шыну выставлять адрес?
А если программист явно указывает, то у нас и адресация разная.
>> Но все эти шины заведены в один bus matrix
деталь реализации. В классическом PC тоже одна шина была и на память и на io и на адрес.
>>на всех шинах одинаковы,
нахуй тогда три шины?
bormand 26.07.2018 17:55 # 0
bus matrix - не шина. Это кроссбар. Через него все мастера могут работать параллельно, лишь бы с разными слейвами.
> нахуй тогда три шины?
Пирфоманс же. Если ты работаешь в "гарвардском" режиме (юзаешь разные блоки оперативки для кода и данных) -- всё работает быстро. А конфликты возникают только во время перезаливки кода в блок с кодом. Ну и даже если ты работаешь в "фон-неймановском" режиме (с одним блоком на код и данные), то хотя бы обращения к периферии не мешают фетчить новые инструкции. Когда у тебя нет ебических кешей как у интела -- вполне актуально.
Короче это почти труъ гарвардская архитектура с возможностью поюзать её как фон-неймановскую если пирфоманс не поджимает.
bormand 26.07.2018 18:15 # 0
Вот интересно, а как на труъ гарварде читать или писать память кода на сишке? Скорее всего никак, только через асм отдельной инструкцией... Ну либо проц по какому-нибудь биту в адресе данных должен выбирать шину (что не особо приятно для пайплайна).
roskomgovno 26.07.2018 19:34 # 0
Ну и как пишут и читают в IO на PC? outb какой-нить может быть. Под капотом там конечно отдельная инструкция:)
>>проц по какому-нибудь биту в адресе
Тоже так подумал, в конце концов контроллер памяти же по биту может выбрать канал например, но мне не нравится мысль делить линейное прострванство на две части по биту.
Звучит как ад для программиста
bormand 26.07.2018 20:08 # 0
Скорее как ад для разраба проца. От каждой записи/чтения через шину кода в любом случае конвейер пидорасит... Хоть с инструкцией хоть с битом в адресе.
roskomgovno 26.07.2018 22:32 # 0
Но ты представь себе программиста у которого foo это адрес памяти, а (например) "foo & 0xF7" это адрес в I/O)
bormand 26.07.2018 22:39 # 0
roskomgovno 26.07.2018 22:44 # 0
извините
ты прав: даже если у меня верхний гигабайт замаплен на видеокарту и внизу немного биоса и VGA то все равно есть такой бит в моем 64 битном указателе, повернув который я получу адрес устройства
bormand 26.07.2018 04:49 # 0
roskomgovno 26.07.2018 16:50 # 0
но как, если у переменной на след. строчке берут адрес?
bormand 26.07.2018 17:58 # +1
З.Ы. А ещё у avr вроде все регистры через память видно, так что можно и адрес регистра положить если ненадолго :)