The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Microsoft открыл CHERIoT, аппаратное решение для повышения безопасности кода на языке Си, opennews (??), 01-Мрт-23, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


83. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +/
Сообщение от Аноним (-), 01-Мрт-23, 14:52 
> пришлось всё делать правильно

В рантайме проверять лайфтаймы и выходы за границы, это уже "правильно"?

Ответить | Правка | К родителю #4 | Наверх | Cообщить модератору

89. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  –1 +/
Сообщение от Аноним (-), 01-Мрт-23, 15:04 
Хотя, если так подумать, в рантайме лайфтаймы и выходы за границы отслеживать проще. В том же расте, если перенести лайфтаймы в рантайм при помощи RefCall и Arc, то компилятор перестаёт ругаться. Паники иногда в рантайме случаются, правда. Но зато думать не надо, прям как в C.
Ответить | Правка | Наверх | Cообщить модератору

97. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +/
Сообщение от непох (?), 01-Мрт-23, 15:58 
> зато думать не надо

Если вы не думаете, то вы трупп.

Поэтому стремление к "поменьше думать" несколько удручает.

Ответить | Правка | Наверх | Cообщить модератору

170. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +/
Сообщение от Аноним (-), 01-Мрт-23, 21:01 
> Хотя, если так подумать, в рантайме лайфтаймы и выходы за границы отслеживать проще.

Какой-нибудь диапазон значений int - и его переполнение - в компил тайме не больно то отследишь в общем случае. А в рантайме без поддержки железом не халявно получается, так что даже хруст это только в дебаг билде делает. Ну вы же понимаете что дебагбилд у дева час покрутится а релиз годами у легиона юзерей? С понятной разницей в уровне оттестированости и факапов.

Ответить | Правка | К родителю #89 | Наверх | Cообщить модератору

241. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +/
Сообщение от Аноним (-), 02-Мрт-23, 14:18 
> в рантайме без поддержки железом не халявно получается

В рантайме *с* поддержкой железа не халявно получается. Спекулятивное выполнение, позволяет процессору все эти проверки проскакивать, выполняя полезный код пока какая-нибудь из прошлых проверок не скажет, что было переполнение.

Проверки небесплатны вне зависимости, поддержаны они железом или нет. Если они поддержаны железом, значит тебе дополнительных компараторов придётся засовывать в конвеер и длину спекуляций увеличивать. Либо отдельный специализированный конвеер выделять под эти проверки, что наверное глупость: иногда его производительности будет не хватать и он будет ограничивать скорость выполнения кода, а иногда его производительность будет избыточна, и он будет простаивать тогда, когда мог бы ускорять выполнение кода.

Ответить | Правка | Наверх | Cообщить модератору

264. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +/
Сообщение от Аноним (265), 02-Мрт-23, 20:11 
переполнение int в рантайме - это логическая ошибка. Поэтому компилятор и не поможет.
Ответить | Правка | К родителю #170 | Наверх | Cообщить модератору

283. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +1 +/
Сообщение от Аноним (-), 02-Мрт-23, 22:40 
Для процессора переполнение int'а это не ошибка вовсе. Для задумки программиста это может быть ошибкой. А компилятор вполне может помочь, если задумка программиста будет закодирована в коде. Когда ты используешь + для любого сложения, то происходит потеря информации о задумке, при передачи из головы компилятору, потому что разные идеи кодируются одинаково. Если же их кодировать по-разному, то компилятор может помочь.

Таким образом, логика твоя порушена. Из "логичности" ошибки никак не вытекает того, что компилятор не поможет. Он не поможет потому что программист не попросил компилятор помочь с данным типом логических ошибок.

Ответить | Правка | Наверх | Cообщить модератору

290. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  –1 +/
Сообщение от Аноним (265), 03-Мрт-23, 00:41 
#include <stdio.h>
#include <inttypes.h>

int main(){
uint8_t a=255,b=255;
uint8_t c;
c=a+b;
printf("%d\n",c);

И здесь я Явно указал значения операндов. Компилятор GCC даже не предупредил.

Ответить | Правка | Наверх | Cообщить модератору

325. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +/
Сообщение от Совершенно другой аноним (?), 07-Мрт-23, 17:03 
> #include <stdio.h>
> #include <inttypes.h>
> int main(){
> uint8_t a=255,b=255;
> uint8_t c;
> c=a+b;
> printf("%d\n",c);
> И здесь я Явно указал значения операндов. Компилятор GCC даже не предупредил.

#include <stdio.h>

int main(int argc, char* argv[])
{
  unsigned char a = 255, b = 255, c;

  if (__builtin_add_overflow(a, b, &c) == 0)
    printf("%d\n", c);
  else
    printf("owerflow\n");

  a = 254;
  b = 1;

  if (__builtin_add_overflow(a, b, &c) == 0)
    printf("%d\n", c);
  else
    printf("owerflow\n");

  a = 255;
  b = 1;

  if (__builtin_add_overflow(a, b, &c) == 0)
    printf("%d\n", c);
  else
    printf("owerflow\n");

  return 0;
}

Ответить | Правка | Наверх | Cообщить модератору

326. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +1 +/
Сообщение от Аноним (-), 07-Мрт-23, 22:08 
Эй лолки, man 3 printf для начала. С вашим %d вы такие забавные. А builtin это прекрасно но не по стандарту и специфично для компилера, увы. Для unsigned вполне конкретно определено что они врапаются по своей ширине, это well defined behavior как раз таки, им можно пользоваться и дофига алгоритмики типа крипто, операций с битами и проч этим пользуется - экономя команды проца в критичных к скорости местах лопатящих порой сотни мегов в секунду (шифрование или хеширование чего-то по сетке например).

В мане для вас, анонимов, про %d так то написано что это спецификатор для ЗНАКОВЫХ десятичных чисел! Вы же взяли 2 беззнаковых, для начала. Если вы ЭТОМУ uint скармливаете от большого ума - там так то и отрицательное число может нарисоваться в принципе. Но вы ж сами попросили этим спецификатором рассмотреть вон то, на входе, как знаковое. Разумеется конверсия uint -> signed в недрах printf это нечто implementation defined.

Чисто теоретически компилер мог бы и предупредить что вы какую-то хрень printf дали. Для некоторых наиболее очевидных даже и предупреждает, но до вот этого видимо не добрались еще. Или вы не включили всякие -Wall -Wextra -Wconversion чтобы узнать о себе и своих кодинг скилах кое-что новое.

Ответить | Правка | Наверх | Cообщить модератору

334. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +1 +/
Сообщение от Совершенно другой аноним (?), 08-Мрт-23, 10:03 
> Эй лолки, man 3 printf для начала. С вашим %d вы такие
> забавные.

В данном случае рояля не играет, т.к. unsigned char расширится до unsigned int со значением 255, и всё будет выведено корректно, как Вы знаете, на стек char положить никак нельзя, кладётся (ну или ложится) только словами.

> А builtin это прекрасно но не по стандарту и специфично
> для компилера, увы.

Я в курсе, по стандарту именно как Вы написали - переполнение беззнаковых вполне себе определено.

>[оверквотинг удален]
> начала. Если вы ЭТОМУ uint скармливаете от большого ума - там
> так то и отрицательное число может нарисоваться в принципе. Но вы
> ж сами попросили этим спецификатором рассмотреть вон то, на входе, как
> знаковое. Разумеется конверсия uint -> signed в недрах printf это нечто
> implementation defined.
> Чисто теоретически компилер мог бы и предупредить что вы какую-то хрень printf
> дали. Для некоторых наиболее очевидных даже и предупреждает, но до вот
> этого видимо не добрались еще. Или вы не включили всякие -Wall
> -Wextra -Wconversion чтобы узнать о себе и своих кодинг скилах кое-что
> новое.

$ gcc -Wall -Wextra -Wconversion q.c
q.c: In function 'main':
q.c:3:14: warning: unused parameter 'argc' [-Wunused-parameter]
    3 | int main(int argc, char* argv[])
      |          ~~~~^~~~
q.c:3:26: warning: unused parameter 'argv' [-Wunused-parameter]
    3 | int main(int argc, char* argv[])
      |                    ~~~~~~^~~~~~

$ gcc --version
gcc.exe (MinGW.org GCC Build-2) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc -Wall -Wextra -Wconversion q.c
q.c: In function ‘main’:
q.c:3:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
    3 | int main(int argc, char* argv[])
      |          ~~~~^~~~
q.c:3:26: warning: unused parameter ‘argv’ [-Wunused-parameter]
    3 | int main(int argc, char* argv[])
      |                    ~~~~~~^~~~~~

$ gcc --version
gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Ответить | Правка | Наверх | Cообщить модератору

339. "Microsoft открыл CHERIoT, аппаратное решение для повышения б..."  +/
Сообщение от Аноним (-), 08-Мрт-23, 10:44 
> В данном случае рояля не играет, т.к. unsigned char расширится до unsigned
> int со значением 255, и всё будет выведено корректно,

Зато если это с u32 попробовать... можно нехилый сюрприз поймать :))).

И между прочим, размер char, int и проч - это в сишке тоже очень интересный вопрос! Формально по спекам такие комбо могут быть валидны что охренеть. Скажем оба char и int как 16 битов - вполне валидная идея. А там точно расширение будет? И ничего не предъявите, имели право. А если ваш код на вон то еще и  уповал - ну, ой, а он не обязан работать был, вы какие-то конкретные допущения 1 реализации приняли за истину в последней инстанции.

> как Вы знаете, на стек char положить никак нельзя,

Я знаю что ... в стандарте си ВООБЩЕ СОВСЕМ НЕТ НИЧЕГО ПРО СТЭК. Там просто нет этого слова. Вообще, как категории. Стандарт си не специфицирует как это вообще будет сделано. Какое-то конкретное аби еще может, но это вообше не про си уже.

> кладётся (ну или ложится) только словами.

Словами, словами, какими словами...? Ну вот AVR 8-битный, у него слово в стеке - это хто такое? А чо - там printf тоже можно.

> Я в курсе, по стандарту именно как Вы написали - переполнение беззнаковых
> вполне себе определено.

Зато с знаковыми там полнейший задник. И этот задник иногда даже в беззнаковые ухитряется протиснуться немного, блин.

> q.c:3:14: warning: unused parameter 'argc' [-Wunused-parameter]

Э... это был hello world? Терь попробуйте это на реальном коде пожирней и зазырьте как вам оно. Учитывая что вы мне уже сосватали UB и какие-то стеки, возможно что вы кой-что не знаете и о своем коде так то :).

И да, кстати -Wconversion много чего ловит но вот именно приколы printf таки далеко не все. Впрочем это уже и не компилерская штука а библиотечная по большому то счету.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру