Кросс-платформенный, язык разметки GUI агностика языка? [закрытый]

Да, специально для gcc5.x и более поздних версий это конкретное выражение оптимизируется очень рано - до p, даже если оптимизация отключена, независимо от возможного времени выполнения UB.

Это происходит даже со статическим массивом и постоянным размером во время компиляции. gcc -fsanitize=undefined не вставляет никаких инструментов для его поиска. Также нет предупреждений в -Wall -Wextra -Wpedantic

int *add(int *p, long long x) {
    return (p+x) - x;
}

int *visible_UB(void) {
    static int arr[100];
    return (arr+200) - 200;
}

Использование gcc -dump-tree-original для выгрузки своего внутреннего представления логики программы перед любыми проходами оптимизации показывает, что эта оптимизация произошла еще до этого в gcc5.x и новее [ 1135]. (И происходит даже в -O0).

;; Function int* add(int*, long long int) (null)
;; enabled by -tree-original

return  = p;


;; Function int* visible_UB() (null)
;; enabled by -tree-original
{
  static int arr[100];

    static int arr[100];
  return  = (int *) &arr;
}

Это из проводника компилятора Годболта с gcc8.3 с -O0.

Вывод asm x86-64 просто:

; g++8.3 -O0 
add(int*, long long):
    mov     QWORD PTR [rsp-8], rdi
    mov     QWORD PTR [rsp-16], rsi    # spill args
    mov     rax, QWORD PTR [rsp-8]     # reload only the pointer
    ret
visible_UB():
    mov     eax, OFFSET FLAT:_ZZ10visible_UBvE3arr
    ret

-O3 вывод, конечно, просто mov rax, rdi


gcc4.9 и более ранние версии выполняют эту оптимизацию только на более позднем проходе, а не в -O0 : дамп дерева все еще включает в себя вычитание, а асм x86-64 равен

# g++4.9.4 -O0
add(int*, long long):
    mov     QWORD PTR [rsp-8], rdi
    mov     QWORD PTR [rsp-16], rsi
    mov     rax, QWORD PTR [rsp-16]
    lea     rdx, [0+rax*4]            # RDX = x*4 = x*sizeof(int)
    mov     rax, QWORD PTR [rsp-16]
    sal     rax, 2
    neg     rax                       # RAX = -(x*4)
    add     rdx, rax                  # RDX = x*4 + (-(x*4)) = 0
    mov     rax, QWORD PTR [rsp-8]
    add     rax, rdx                  # p += x + (-x)
    ret

visible_UB():       # but constants still optimize away at -O0
    mov     eax, OFFSET FLAT:_ZZ10visible_UBvE3arr
    ret

. согласовать с выводом -fdump-tree-original:

return  = p + ((sizetype) ((long unsigned int) x * 4) + -(sizetype) ((long unsigned int) x * 4));

Если x*4 переполнится, вы все равно получите правильный ответ. На практике я не могу придумать, как написать функцию, которая бы приводила к тому, что UB вызывает заметное изменение поведения.


Как часть большой функции, компилятору будет разрешено выводить некоторую информацию о диапазоне, например, p[x] является частью того же объекта, что и p[0] , поэтому чтение памяти в между / out, что разрешено и не будет segfault. например разрешить автоматическую векторизацию цикла поиска.

Но я сомневаюсь, что gcc даже ищет это, не говоря уже об этом.

(Обратите внимание, что заголовок вашего вопроса был специфичен для gcc, нацеленного на x86-64 в Linux, не о том, безопасны ли подобные вещи в gcc, например, если сделано в отдельных утверждениях. Я имею в виду, да, вероятно, безопасно на практике , но не будет оптимизирован почти сразу после разбора. И определенно не о C ++ в целом.)


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

15
задан Cristian 7 August 2008 в 21:31
поделиться

9 ответов

erm.. HTML? (пытающийся быть забавным здесь..., в то время как мы ожидаем реальных ответов..)

9
ответ дан 1 December 2019 в 02:20
поделиться

Я серьезно сомневаюсь, что Вы собираетесь найти язык разметки для GIU's, это не связано с определенной библиотекой. Чтобы такая вещь существовала, должен был бы быть стандартизированный язык разметки GUI с несколькими реализациями.

5
ответ дан 1 December 2019 в 02:20
поделиться

http://en.wikipedia.org/wiki/Qt_ (инструментарий)"> QT (объявленный "милым" его создателями [1]) является межплатформенной платформой разработки приложений, широко используемой для разработки программ GUI.

использование кварты C++ с несколькими нестандартными расширениями, реализованными дополнительным препроцессором, который генерирует стандартный код C++ перед компиляцией. QT может также использоваться на нескольких других языках программирования; привязка существует для Ada (QtAda) [4], C **# ** (Qyoto/Kimono) [5], Java (QT Джамби) [6], Паскаль , Perl, PHP (PHP-Qt), Ruby (RubyQt), и Python (PyQt). Это работает на всех основных платформах и имеет обширную поддержку интернационализации. Функции неGUI включают доступ базы данных SQL, парсинг XML, управление потоком, сетевую поддержку и объединенный межплатформенный API для обработки файла.

5
ответ дан 1 December 2019 в 02:20
поделиться

Не уверенный, если это - то, что Вы ищете, но существует Поляна (или загрузка Windows ), который является разработчиком для GTK +. Это генерирует XML-файл, который может затем использоваться для создания GUI на многих различных языках.

4
ответ дан 1 December 2019 в 02:20
поделиться

Язык пользовательского интерфейса XML . Не знайте много об этом так не уверенный, если это встречает Ваши требования. Отправьте назад с Вашим опытом, если Вы играете с ним.

4
ответ дан 1 December 2019 в 02:20
поделиться

wxWidgets (раньше известный как wxWindows) библиотека могла бы быть тем, что Вы ищете. Существует особенно хороший порт для Python, wxPython, а также версии для различных языков - C#, C++, Perl и Ruby приходят на ум - и для различных графический интерфейсов пользователя: Win32, Mac OS X, GTK +, X11, Мотив, WinCE. Библиотека была вокруг некоторое время и является довольно солидной.

1
ответ дан 1 December 2019 в 02:20
поделиться

@Cristian и Antony Cramp: в то время как XUL является хорошим выбором для разработки UI (межплатформенный, открытый исходный код, лицензируемый, используемый в Firefox и другом главном программном обеспечении), это - конечно, не агностик языка. Вы связываетесь с Гекконом с JS для сценариев. Существует экспериментальная поддержка сценариев Python, но это только экспериментально, AFAIK.

можно определить UI в XUL+JS и использовать компоненты бэкенда, записанные в C++ хотя (существует Python и мосты Java, доступные также).

1
ответ дан 1 December 2019 в 02:20
поделиться

Я читал немного на Языке пользовательского интерфейса XML (XUL), и это выглядит действительно устойчивым и хорошо поддерживаемым. Основная проблема для меня, она связывается с механизмом визуализации Геккона, таким образом, это является кросс-платформенным, путь wxWidgets, QT и GTK + являются кросс-платформенными. Кроме того, там привязка Python не кажется столь же хорошей как те другие библиотеки.

GladeXML и XRC походят на лучшие разметки

0
ответ дан 1 December 2019 в 02:20
поделиться

Я бы выбрал XSLT, поэтому он может быть встроен и в другие интерфейсы.

0
ответ дан 1 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: