LINUX.ORG.RU

Хрупкие программы

 


0

2

Почему так бывает, что при -O0 программа работает нормально, а например при -O3 начинает падать, но не всегда. Чей тут косяк, программиста или gcc? Может ли использование static_cast и запрет неявных преобразований типов избежать такого поведения?



Последнее исправление: Zpp (всего исправлений: 1)
Ответ на: комментарий от wandrien

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

anonymous
()
Ответ на: комментарий от anonymous

одно из этих заболеваний-жизнь, и ты тоже являешься носителем этой смертельной болезни.

anonymous
()

у меня такое было, когда писал какой-то драйвер. Компилятор менял порядок записей в память при работе с дескрипторами DMA. Решилось «подсказками» типа «барьеры памяти».

demidrol ★★★★★
()
Ответ на: комментарий от anonymous

говорят, что поломается. Сучки и ветки не инлайнятся, понимаешь.

demidrol ★★★★★
()
Ответ на: комментарий от anonymous

Перечисли это «большинство».

Все x86, PA-RISC, AVR.

И для проверки на большинство перечисли «меньшинство».

ARM, m68k

На счет системщины, на си нельзя работать с таблицей векторов прервывний x86 языковыми средствами.

Без ассемблерных вставок в нём почти ничего нельзя сделать: ни в порта писать, ни прерывания замаскировать. А при их наличии void* get_vec(unsigned char n); void set_vec(unsigned char n, void *addr) используется достаточно просто.

monk ★★★★★
()
Ответ на: комментарий от wandrien

Есть же нормальные проекты

это без оптимизатора что ли?

The reference implementation uses LLVM as a backend for state of the art optimizations.

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

anonymous
()
Ответ на: комментарий от monk

x86

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

void* get_vec(unsigned char n)

И адрес прерывания деления на ноль будет неотличим от NULL. Придется перейти от указателей к целочисленным handler’ам, имитирующим адреса. Вот такой вот системный язык программирования си (испорченный нарзаном стандартом)

anonymous
()
Ответ на: комментарий от anonymous

Например, вопрос с NULL is 0 там пофикшен. Можно использовать указатели, у которых 0 – реальный адрес объекта. (А можно и не использовать.)

wandrien ★★
()
Ответ на: комментарий от wandrien

не особо вчитывался: а массивы там начинаются с единицы?

и как это оправдывает то, что «Компиляторы заходят слишком далеко»? Это типа выбор меньшего из зол?

anonymous
()
Ответ на: комментарий от anonymous

не особо вчитывался: а массивы там начинаются с единицы?

Нет. Зачем? Еще одна Lua не нужна, спасибо.

и как это оправдывает то, что «Компиляторы заходят слишком далеко»? Это типа выбор меньшего из зол?

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

wandrien ★★
()
Ответ на: комментарий от wandrien

Нет. Зачем?

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

то уж лучше вот такой чистый дизайн

чистый дизайн это хорошо. Но неужели язык больше развиваться не будет? Он точно перекроет все потребности или просто займет какую-то нишу? Что будет с дизайном, когда придется тянуть обратную совместимость?

В ассемблере кстати чистота запредельная :)

anonymous
()
Ответ на: комментарий от anonymous

В защищенном режиме - плоская страничная адресация.

Не обязательно. Сегментные регистры присутствуют, LDT + GDT не просто так наличествуют.

И адрес прерывания деления на ноль будет неотличим от NULL.

Адрес обработчика прерывания не может быть 0, иначе он затрёт таблицу. А адрес записи в таблице векторов интересовать не должен. get_vec(0) даст адрес обработчика, set_vec(0, &handler) позволит его поменять.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от anonymous

Прикручиваю интеграцию с Си++. В творческих муках, какое подмножество Си++ интегрировать, чтобы, с одной стороны, не тащить весь этот синтаксический кошмар к себе, а с другой стороны, иметь возможность использовать любую библиотеку на Си++.

monk ★★★★★
()
Ответ на: комментарий от monk

В творческих муках, какое подмножество Си++ интегрировать, чтобы, с одной стороны, не тащить весь этот синтаксический кошмар к себе, а с другой стороны, иметь возможность использовать любую библиотеку на Си++

Ограничьтесь лишь Си.
На нем библиотек и проектов много.
C++ становится сильно сложным из-за того, что в нем множество ограничений.
Даже в инициализации объектов много ограничений, а уж в использовании контейнеров, …
Это ни как не способствует разработке readable кода.

anonymous
()
Ответ на: комментарий от slapin

Как же вы надоели с этим форсом SJW. Угомонитесь уже, травмированные SJW, ради аллаха, бога или Билла Гейтса.

anonymous
()
Ответ на: комментарий от anonymous

C++ даёт ещё и новые полезные возможности. Попробуйте, например, переписать на C вот эту несложную программу:

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
    typedef map<string,unsigned> wlist_t;
    wlist_t words;
    string word;
    while(cin) {
        cin >> word;
        if (cin) {
            words[word] += 1;
        }
    }
    for (wlist_t::iterator i = words.begin(); i != words.end(); ++i) {
        cout << i->first << ": " << i->second << endl;
    }
    return 0;
}

Она выводит все слова из stdin в алфавитном порядке вместе с количеством вхождений этого слова в поток.

kmeaw ★★★
()
Ответ на: комментарий от kmeaw

Я попробую!

#include <stdio.h>
#include <khash.h>

KHASH_MAP_INIT_STR(wlist, unsigned)

void main() {
	khash_t(wlist) *h = kh_init(wlist);
	char *word = NULL;
	while(scanf("%m", &word)) kh_put(wlist, h, word, kh_val(h, kh_get(wlist, h, word)) + 1);
	for(khint_t i = kh_begin(h);i != kh_end(h);i++) printf("%s : %u\n", kh_key(h, i), kh_val(h, i));
}
paramon
()
Ответ на: комментарий от kmeaw

words[word] += 1;

А инициализировать в ноль не надо?

X512 ★★★★★
()
Ответ на: комментарий от kmeaw

Попробуйте, например, переписать на C вот эту несложную программу:

Си большей частью полезно использовать для системного программирования.
«Первокурсники» этого не понимают и не умеют.
Поэтому то столько жалоб на Си и «хваления» C++.

Доказывать вам ни чего не буду.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Си большей частью полезно использовать для системного программирования.

C++ ещё удобнее т.к. есть RAII. Не будет течь память и не будет всяких костылей вроде goto error.

X512 ★★★★★
()
Ответ на: комментарий от paramon

STL хороша тем, что она имеет контейнера, наиболее часто, используемые в алгоритмах.
Но реализация - «не очень».

С использованием template и разных иных «трюков» создают из языка системного программирования, язык для …

«Умиляет» то, что этот бред считают развитием языка.

Владимир

anonymous
()
Ответ на: комментарий от X512

C++ ещё удобнее т.к. есть RAII. Не будет течь память и не будет всяких костылей вроде goto error.

Т.е. вы не знаете как в Си все это реализуется и уверены, что C++ «лучше»?

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Но реализация - «не очень».

вперёд Владимир! Улучши реализацию gcc и LLVM, покажи им кто настоящий программист, а кто днище. Исходники открыты там под подходящей лицензией…

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

да там все равно код неправильный, я по своей плохой памяти набросал. зачем мапу то освобождать? так можно и до закрытия stdin дойти.

paramon
()
Ответ на: комментарий от paramon

зачем мапу то освобождать?

вот и разрабы firefox так думают, у меня вчера больше 7 гигабайт браузер стал оперативы потреблять, пришлось перезапустить. Пока примерно 1.5 гигабайта на тех же вкладках, но firefox явно течёт и rust ему не помогает :(

fsb4000 ★★★★★
()
Ответ на: комментарий от anonymous

Т.е. вы не знаете как в Си все это реализуется и уверены, что C++ «лучше»?

Без костылей и нестандартных расширений компилятора (например __attribute__ ((__cleanup__(cleanup_function)))) никак это не реализуется.

X512 ★★★★★
()
Ответ на: комментарий от fsb4000

вперёд Владимир! Улучши реализацию gcc и LLVM, покажи им кто настоящий программист, а кто днище.

Зачем кому-то, что-то доказывать и тем паче вести разработку, чтобы быть якобы «лучше»?

Это не мой стиль и путь.

Разрабатываемое API имеет одну цель - помочь программисту в том, чтобы он был не «кодировщиком», а разработчиком.

Что до «развития C++» и освоения его «новаций», то конечно не «брезгую» хорошими идеями того какая функциональность упростит разработку.

Разработку конкурента gcc и LLVM для меня не актуально.

Это для РЕВОЛЮЦИОНЕРОВ, которые любят "до основания все разрушить".

Владимир

anonymous
()
Ответ на: комментарий от paramon

это другое. а в расте утечка ошибкой и не считается же, и например серво активно течет.

Там же вроде сделан учёт владения объектами и ничего течь не должно…

X512 ★★★★★
()
Ответ на: комментарий от X512

Да :(

или goto, или макросы для какой-то области видимости (и внутри неё не использовать goto или return) или вместо return использовать макрос RETURN()(и вместе с возвратом делать очистку всего), или нестандартные атрибуты.

Зато если есть атрибут, то макросами делается api почти что unique_ptr :)

https://developer.gnome.org/glib/stable/glib-Miscellaneous-Macros.html#g-autoptr

fsb4000 ★★★★★
()
Ответ на: комментарий от X512

Без костылей и нестандартных расширений компилятора (например attribute ((cleanup(cleanup_function)))) никак это не реализуется.

Методы использования памяти разные бывают.
У кого хорошие архитектурные решения у того и память освобождается и не потребление ее экономно и разумно.

Владимир

anonymous
()
Ответ на: комментарий от anonymous

и не потребление ее экономно и разумно.

и потребление ее экономно и разумно.

Владимир

anonymous
()
Ответ на: комментарий от kmeaw

Эту несложную программу лучше на С++ переписать.

#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, unsigned> words;
    for (std::string word; std::cin >> word;) {
        auto [iter, emplaced] = words.try_emplace(std::move(word), 1);
        iter->second += !emplaced;
    }
    for (auto& [word, count] : words) {
        std::cout << word << ' ' << count << '\n';
    }
}
Siborgium ★★★★★
()
Последнее исправление: Siborgium (всего исправлений: 1)
Ответ на: комментарий от anonymous

Владимир, расскажите пожалуйста, какие аспекты реализации стандартных контейнеров вас не устраивают? По вашим (?) предыдущим попыткам писать на С++ я сделал вывод о том, что на С++ вы писать не умеете. Возможно, я был неправ?

Siborgium ★★★★★
()
Последнее исправление: Siborgium (всего исправлений: 1)
Ответ на: комментарий от Siborgium

Владимир, расскажите пожалуйста, какие аспекты реализации стандартных контейнеров вас не устраивают? По вашим (?) предыдущим попыткам писать на С++ я сделал вывод о том, что на С++ вы писать не умеете. Возможно, я был неправ?

Вы во всем правы.
Успокойтесь …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

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

Постепенно, разрабатываемая rapid становится все более
функциональна и сравнение ее с 1С, … подтверждает то, что rapid не «панацея», но и однозначно не «тупняк».

Владимир

anonymous
()
Ответ на: комментарий от anonymous

В Утечка исходного кода Windows XP обсуждают в частности пути разработки ReactOS.

То что далее скажу ни как не априори верно, но выбрал именно такой путь.

Какой?
Перестал использовать API Microsoft и «искореняю» его из своего API.

Почему?

Исходных кодов API нет, а в процессе разработки они бывает и нужны.
В результате много времени теряется на «выяснения».

К примеру ныне разрабатываю API, которое позволит работать с mxl без использования 1С.

Вот один из множества иных вопросов - «Как в Excel хранятся OLE объекты и как они сохранены в mxl 1С 7.7.».
В данном случае велосипед не изобретаю, использую описание формата mxl из проекта Йоксель.
Но вопросы, связанные c OLE имеются и приходится не мало времени тратить на поиск информации, …

Оно мне нужно?   

Быстрее свое API разработаю.

Берем скажем CString /ИМХО не плохой класс/, но подводных камней в нем много.
И этих проблем море.

Оно мне нужно?   

У меня не 100 жизней в чужем белье не хочется копаться.
Потому как много времени тратится на «выяснения» и «костыли».

Оно мне нужно?   

Ныне разрабатываю много API, которое «есть».
Это «есть» очень обманчиво и «не ахти».
Даже удобного и производительного API для работы с строками нет …

Разработка подтверждаем многое из выше сказанного.
Например у меня mxl размером 182 MB парсится и сохраняется в течении где-то 1 секунды.

Но не восемь же секунд как у некоторых на mxl 84MB …


А теперь о ReactOS.

Читаю эти «ученые» беседы и думаю - «Ребята ляжьте поспите и дурь пройдет».

«Дурь» - слепое следование во всем API и технологиям Microsoft.

Владимир

anonymous
()

Почему так бывает, что при -O0 программа работает нормально, а например при -O3 начинает падать, но не всегда.

Именно так!

Может ли использование static_cast и запрет неявных преобразований типов избежать такого поведения?

Нет. Даже простейшие конструкции преобразуются. По крайней мере, если пишешь на Си и С++ – всё-таки не под PDP-11 пишем.

Princesska ★★★★
()

Почти не имел дела с компиляторами, предпочитаю интерпретируемые языки программирования.

XoFfiCEr ★★☆☆
()

ТС, тебя забанили, но ты прочитай. Это ошибки памяти, в чистом виде. Используй address sanitizer и valgrind, увидишь места проблем

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от demidrol

Решилось «подсказками» типа «барьеры памяти»

Такое возможно только в модуле ядра, или в user space подобная перестановка тоже может приводить к проблемам? Как удалось выявить?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Может на многопроцессорных/многоядерных системах. Или при работе с внешними устройствами или видеокартой.

К слову, перестановку в данном случае делает не компилятор, а процессор.

А выявляется по «случайным» глюкам синхронизации потоков выполнения.

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.