Обновить
1
Константин@Comdiv

Программист

Отправить сообщение
В мультибайтовых кодировках существует обратная совместимость с ASCII
Из чего это следует? Я в стандарте этого не видел. Можете указать, где это сказано точно? Если это так, то алгоритм можно написать намного эффективней, так как mblen тяжеловесна.
И всё становится предельно ясно.
Тогда объясните мне, пожалуйста, как это понимать: *ptr == '\0' ? 1 для таких настроек:
#ifndef HAVE_MBLEN
# define php_mblen(ptr, len) 1

И почему при обратной совместимости в качестве конца строки используется не '\0', а null wide character.
Мы всё еще рассматриваем пользу ссылок в некоторых случаях.
Можно конкретней? Ссылок на то, что
last_chars[0] = last_chars[1];
last_chars[1] = *ptr;

Приводит к двойному копированию последовательностей 1-байтовых символов, или что-то ещё?
с учетом RFC 4180. Это не займет много времени.
Увы, коллега, не похоже на то. Я начал смотреть, что такое php_mblen и уже это заняло много времени с учётом контекста функции. Дело в том, что php_mblen в зависимости от значений макросов при сборке и переменных окружения может быть гарантировано однобайтным. Тогда неясно, на каком основании выполняется эта часть
*ptr == '\0' ? 1
потому что в таком случае цикл может остановиться только по достижении конца массива и вообще нет смысла его перебирать, так как сразу можно перейти к концу(экономия процессорного времени, да).
Указанная Вами функция не является самосотоятельной частью, воплощающей стандарт, а зависит от объемлющего кода. Откуда мне знать обо всех задумках или ошибках, которые были здесь допущены. Например, почему в многобайтной кодировке, точный тип который задаётся окружением, символ перевода строки задаётся одним char? Здаётся мне, что в этой функции проблемы не исчерпываются использованием неструктурных переходов.

Ну и, наконец, неужели для того, чтобы понять, что двойное копирование строки для 1-байтных последовательностей — это нечто неоптимальное, Вам нужен другой алгоритм?
Где же ответ? В функции есть лишние присваивания, не оптимальное использование switch, но Вы делаете акцент на экономии процессорного времени. Где же оно в этом плохо написанном коде?
Почему Вы думаете, что эта функция написана оптимально?
А, вообще, это, в первую очередь, пример запутанного кода, что подтверждает аргументы против неструктурного контроля выполнения.
Качество интерпретатора соответствует качеству языка, не так ли?
Сам PyPy написан на RPython, но на вход он принимает обычный Python
Если уж зреть в корень, то почему бы винтиков и не заменить роботами, а не подбирать их роботами?
Комментарий понятный, но не подробный, поэтому был больше похож на шутку. Очень важный код, серьёзно? Возможно, была бы та простыня текста там раньше, и не пришлось бы разгребать проблемы.
Если это и решало кучу проблем, в конечном итоге такое хрупкое решение вряд ли можно признать хорошим. Поэтому не стоит винить «гуру клинкода», если только этот int x не был помечен очевидным и подробным комментарием.
Перекрытие имени в объемлющей области видимости? Бывает. Поэтому стоит включить соответствующую опцию в компиляторе.
Как и все, сделал все блоковетвистые инструкции аналогами `goto`.

Можете уточнить, как именно?
2. Видел, как ReactOS используется в крупных компаниях.

Это же самое интересное. Не могли бы Вы подробней раскрыть эту тему?
Насчет MISRA C (и MISRA C++), то это ни от чего не страхует и ничего не гарантирует
Не гарантирует, но страхует. Насколько — зависит от обычного стиля и привычек программиста.
Динамический анализ действительно является конкурентом статическому и именно из-за того, что он его дополняет. Диалектика, ничего не поделаешь. Тот, кто предложит комплексное решение, в котором динамический анализ учитывает данные статического, а статический — динамического, получит техническое преимущество по сравнению с тем, кто предлагает однобокие решения.
В соответствии со стандартом результат этой операции не определён, если он имеет некорректное выравнивание. Если же мы каким-либо образом удостоверились, что выравнивание корректно, то компилятор обязан обеспечить ожидаемое поведение
Да что-то вроде этого:
typedef struct {
    char *buf;
    int size, len;
    bool success;
} buf_t;

void init(buf_t *s, char *buf, int size) {
    assert(NULL != buf);
    assert(size > sizeof(void *));

    s->buf = buf;
    buf[0] = '\0';
    s->size = size;
    s->len = 0;
    s->success = true;
}

bool cat(buf_t *s, char const *str) {
  int i;
  i = 0;
  while ((s->len < s->size - 1) && (str[i] != '\0')) {
    s->buf[s->len] = str[i];
    s->len += 1;
    i += 1;
  }
  s->buf[s->len] = '\0';
  s->success = str[i] == '\0';
  return s->success;
}

    char xml[768];
    buf_t buf;
    bool success;
    
    init(&buf, xml, sizeof(xml));
    if (cnt > 0)
    {
      cat(&buf, ",");
    }
  
    cat(&buf, "{\"type\":\"");
    if (entry.isSubDir())
    {
      cat(&buf, "dir");
    } else
    {
      cat(&buf, "file");
    }
    cat(&buf, "\",\"name\":\"");
    if (s->success && entry.getName(s->buf, s->size, &s->len)) {
      cat(&buf, "\"}");
    }
Я бы, скорее, сказал, что подобный код является отрицательным примером. strcat каждый раз подсчитывает длину строки, к которой он добавляет второй фрагмент, поэтому вычислительная сложность такого подхода оказывается квадратичной вместо линейной, в результате чего время выполнения этого кода может даже превысить время выполнения С++ кода. Второй недостаток заключается в отсутствии проверок границ, что может привести к тому самому нарушению стека. Конечно, в примере размер взят с избытком, но этого его не оправдывает, так как этот избыток тоже может послужить причиной повреждения стека, а документация должна быть всё-таки образцовой.
Теперь и я Вас понял.
философия — не мой конёк. Я считаю, что это — преимущество
Это зря. Ядро философии — логика. А я вижу в ваших рассуждениях об ОСРВ МАКС некоторые логически слабые места, ложные предпосылки, но спорить о них не видел смысла, потому что видно, что Вы их крепко держитесь. Но победить их — значит улучшить систему, которая не будет уводится не в лучшем направлении. Для данной системы уже поздно, но будут же и новые проекты.

В общем, рассуждения о ненужности философии — это приблизительно то же, что рассуждения о ненужности физики от человека, не желающего знать физику. И физика и философия будут в любом случае, но они либо будут отрицаемы и замутнены, либо признаваемы, очищаемы от шелухи и лучше служить делу.

И да, МАКС — это операционная система.
Приложения собираются вместе с ОС, так что зловредный код, который пытается «просочиться» — отсутствует.
Если потенциальные злоумышленники используют возвратно-ориентированное программирование, то зловредный код всё-таки может «просочиться». Да и не всегда нужно именно внедрять код. Иногда таким образом можно слить важные данные, или выполнить какое-то другое несанкционированное действие, которое может привести к нежелательным последствиям.
за границей стека помещается область памяти минимально допустимого размера с защитой от доступа. Это самый совершенный способ контроля, так как при любом выходе за границу произойдет аппаратное прерывание
При любом? Даже если перепрыгнуть защищённую область памяти?

Информация

В рейтинге
Не участвует
Откуда
Киев, Киевская обл., Украина
Зарегистрирован
Активность